游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换

上传人:宝路 文档编号:17827288 上传时间:2017-11-12 格式:DOC 页数:18 大小:551.33KB
返回 下载 相关 举报
游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换_第1页
第1页 / 共18页
游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换_第2页
第2页 / 共18页
游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换_第3页
第3页 / 共18页
游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换_第4页
第4页 / 共18页
游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换》由会员分享,可在线阅读,更多相关《游戏开发引擎—Cocos2d-x3.4《雷电大战》04:策略模式实现不同子弹切换(18页珍藏版)》请在金锄头文库上搜索。

1、Cocos2d-x 3.4雷电大战04:策略模式实现不同子弹切换本文从设计模式中的策略模式入手,主 讲了飞机大战中英雄 飞机切换不同的子弹。 这里分为三种子弹。第一种:每次发一个子 弹,垂直 发射;第二种:每次 发两个子弹,两个都是垂直发射;第三种:每次发三个子弹,两边 的子弹有一定的角度,而中间的子弹垂直发射;设计模式是游戏开发经常用到的思想,建议 有兴趣的同学可以好好研究下!好了,下面开始吧。效果如下:Cocos2d-x 版本:3.4工程环境:VS30213一、策略模式(Stragegy Pattern)1、简介Strategy 模式也叫策略模式是行为模式之一,它 对一系列的算法加以封装,

2、为所有算法定义一个抽象的算法接口,并通过继 承该抽象算法接口对所有的算法加以封装和 实现,具体的算法选择交由客户端决定(策略)。 Strategy 模式主要用来平滑地处理算法的切换 。2、意图定义一系列的算法,把它们一个个封装起来,并且它们可相互替 换。使得算法可独立于使用它的客户而变化。3、适用性如果一个系统里面有许多类,它 们之间的区别仅在于它们 的行为,那么使用策略模式可以 动态地让一个对象在许多行为中选择一种行为。一个系统需要动态的在几种算法中选择一种。那么 这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法 类的子类。 换言之,这些具体算法类均有统一的接口,由于多

3、态性原则,客户端可以选择使用任何一个具体算法 类,并只持有一个数据类型是抽象算法的对象。一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的和复杂的只与算法有关的数据。如果一个类定义了多种行为,并且 这些行为在这个类的操作中以多个条件 语句的形式出现。将相关的条件分支移到它们各自的 Strategy 类中以代替这些条件语句。更多详细的策略模式看这里吧: 策略模式在游戏开发中的应用二.子弹类与子弹管理类的代码编写首先来看下本文的类 UML 图 :这里的思路是把子弹发射当成是一个函数,基 类子弹中定 义成虚函数,然后 实现类子弹中HeroBulletOne、He

4、roBulletTwo、HeroBulletThree 分别实现不同的发射功能。然后在子弹管理类中 HeroBulletLayer 中有一个私有的成员变量 BulletStyle *mBulletStyle.当需要切换不同的子弹时,就将 new 不同的 HeroBulletOne 或 HeroBulletTwo 或 HeroBulletThree,赋给 mBulletStyle。下面我们来看看代码吧!2.1 首先是子弹的基类:BulletStyle.h,这里注意到 virtual void shootBullet(float dt)为虚函数,表示这里要根据的子类不同,发射不同的子弹数目;123

5、45678/* *功能 创建子 弹的基类 *作者 林炳文( 博客:http:/ *时间 2015.3.31 */ #pragma once #ifndef _BulletStyle_H_ 910111213141516171819202122232425262728293031323334353637383940414243#define _BulletStyle_H_ #include cocos2d.h USING_NS_CC; class BulletStyle : public cocos2d:Node public: BulletStyle(); /* * 移除所有的东西 */ v

6、oid removeAllObject(); /* *移除超出屏幕可视范围 的子弹或者碰撞后的子弹清除 *param pNode 要删除的子弹 */ void removeBullet(Node* pNode); /* *根据 传入的 飞机,子弹 跟随发射 *param plane为传入 飞机,可为英雄飞机或敌机 */ virtual void createBullet(Node* plane); /* *发 射子弹 ,在其中进行子 弹的渲染和子弹的飞行动作,默认为单子弹 *param dt 子弹间隔发时间 */ virtual void shootBullet(float dt) prote

7、cted: /子弹容器 Vector vecBullet; /批次渲染 节点 SpriteBatchNode* bulletBatchNode; /传入的 飞机 Node* plane; ; #endif实现文件 BulletStyle.cpp123456/* *功能 创建子 弹的基类 *作者 林炳文( 博客:http:/ *时间 2015.3.31 */ 78910111213141516171819202122232425262728293031323334353637383940414243#include BulletStyle.h BulletStyle:BulletStyle()

8、 /removeAllObject(); /* * 移除所有的东西 */ void BulletStyle:removeAllObject() bulletBatchNode-removeAllChildren(); vecBullet.clear(); this-removeAllChildren(); /* * 移除子 弹,将子 弹从容器中移除,同 时也从 SpriteBatchNode 中移除 */ void BulletStyle:removeBullet(Node* pNode) if (NULL = pNode) return; Sprite* bullet = (Sprite*)

9、pNode; bulletBatchNode-removeChild(bullet, true); vecBullet.eraseObject(bullet); /* *根据 传 入的飞 机,子弹跟随 发射 *param plane为传入飞机,可 为英雄飞机或敌机 */ void BulletStyle:createBullet(Node* plane) this-plane = plane; /创建 BatchNode节点 bulletBatchNode = SpriteBatchNode:create(bullet1.png); this-addChild(bulletBatchNode)

10、; /每隔 0.2S调用一次发 射子弹函数 schedule(schedule_selector(BulletStyle:shootBullet), 0.2f);/注意,这里的发射方法留给子类来实现! 2.2 只发射一个子弹的类HeroBulletOne.h,注意,直接继承12/* *功能 每次只 发射一个子弹 345678910111213141516*作者 林炳文( 博客:http:/ *时间 2015.3.31 */ #pragma once #ifndef _HeroBulletOne_H_ #define _HeroBulletOne_H_ #include cocos2d.h #

11、include BulletStyle.h USING_NS_CC; class HeroBulletOne : public BulletStyle public: virtual void shootBullet(float dt); ; #endif实现文件:123456789101112131415161718/* *功能 每次只 发射一个子弹 *作者 林炳文( 博客:http:/ 2015.3.31 */ #include HeroBulletOne.h void HeroBulletOne:shootBullet(float dt) Size winSize = Director

12、:getInstance()-getWinSize(); auto PlanePos = plane-getPosition(); /从 缓存中创建子 弹 auto spritebullet = Sprite:createWithTexture(bulletBatchNode-getTexture(); /将 创建好的子弹 添加到 BatchNode 中进行批次渲染 bulletBatchNode-addChild(spritebullet); /将 创建好的子弹 添加到容器 vecBullet.pushBack(spritebullet); Point bulletPos = (Point(

13、PlanePos.x, PlanePos.y + plane-getContentSize().height / 2 + 20); spritebullet-setPosition(bulletPos); spritebullet-setScale(0.8f); float flyVelocity = 500;/运行速度,可以自己控制,每秒所走的像素19202122232425262728293031323334353637383940float flyLen = winSize.height - PlanePos.y; float realFlyDuration = flyLen / fly

14、Velocity;/实际飞行的时间 /子 弹运行的距离和 时间,从飞机处开始运行到屏幕 顶端 auto actionMove = MoveTo:create(realFlyDuration, Point(bulletPos.x, winSize.height); /子 弹执行完动作后 进行函数回调,调用移除子 弹函数 auto actionDone = CallFuncN:create( CC_CALLBACK_1(HeroBulletOne:removeBullet, this); /子 弹开始跑动 Sequence* sequence = Sequence:create(actionMove, actionDone, NULL); spritebullet-runAction(sequence); 412.3 发射二个子弹的类HeroBulletTwo.h,注意,直接继承12345678910111213141516/* *功能 每次发 射二个子弹 *作者 林炳文( 博客:http:/ *时间 2015.3.31 */ #pragma once #ifndef _HeroBulletTwo_H_ #define _HeroBulletTwo_H_ #include cocos2d.h #include

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号