资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Cocos2d-x 3.4雷电大战04:策略模式实现不同子弹切换本文从设计模式中的策略模式入手,主 讲了飞机大战中英雄 飞机切换不同的子弹。 这里分为三种子弹。第一种:每次发一个子 弹,垂直 发射;第二种:每次 发两个子弹,两个都是垂直发射;第三种:每次发三个子弹,两边 的子弹有一定的角度,而中间的子弹垂直发射;设计模式是游戏开发经常用到的思想,建议 有兴趣的同学可以好好研究下!好了,下面开始吧。效果如下:Cocos2d-x 版本:3.4工程环境:VS30213一、策略模式(Stragegy Pattern)1、简介Strategy 模式也叫策略模式是行为模式之一,它 对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继 承该抽象算法接口对所有的算法加以封装和 实现,具体的算法选择交由客户端决定(策略)。 Strategy 模式主要用来平滑地处理算法的切换 。2、意图定义一系列的算法,把它们一个个封装起来,并且它们可相互替 换。使得算法可独立于使用它的客户而变化。3、适用性如果一个系统里面有许多类,它 们之间的区别仅在于它们 的行为,那么使用策略模式可以 动态地让一个对象在许多行为中选择一种行为。一个系统需要动态的在几种算法中选择一种。那么 这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法 类的子类。 换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法 类,并只持有一个数据类型是抽象算法的对象。一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的和复杂的只与算法有关的数据。如果一个类定义了多种行为,并且 这些行为在这个类的操作中以多个条件 语句的形式出现。将相关的条件分支移到它们各自的 Strategy 类中以代替这些条件语句。更多详细的策略模式看这里吧: 策略模式在游戏开发中的应用二.子弹类与子弹管理类的代码编写首先来看下本文的类 UML 图 :这里的思路是把子弹发射当成是一个函数,基 类子弹中定 义成虚函数,然后 实现类子弹中HeroBulletOne、HeroBulletTwo、HeroBulletThree 分别实现不同的发射功能。然后在子弹管理类中 HeroBulletLayer 中有一个私有的成员变量 BulletStyle *mBulletStyle.当需要切换不同的子弹时,就将 new 不同的 HeroBulletOne 或 HeroBulletTwo 或 HeroBulletThree,赋给 mBulletStyle。下面我们来看看代码吧!2.1 首先是子弹的基类:BulletStyle.h,这里注意到 virtual void shootBullet(float dt)为虚函数,表示这里要根据的子类不同,发射不同的子弹数目;12345678/* *功能 创建子 弹的基类 *作者 林炳文( ling20081005126.com 博客:http:/blog.csdn.net/evankaka) *时间 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(); /* * 移除所有的东西 */ void removeAllObject(); /* *移除超出屏幕可视范围 的子弹或者碰撞后的子弹清除 *param pNode 要删除的子弹 */ void removeBullet(Node* pNode); /* *根据 传入的 飞机,子弹 跟随发射 *param plane为传入 飞机,可为英雄飞机或敌机 */ virtual void createBullet(Node* plane); /* *发 射子弹 ,在其中进行子 弹的渲染和子弹的飞行动作,默认为单子弹 *param dt 子弹间隔发时间 */ virtual void shootBullet(float dt) protected: /子弹容器 Vector vecBullet; /批次渲染 节点 SpriteBatchNode* bulletBatchNode; /传入的 飞机 Node* plane; ; #endif实现文件 BulletStyle.cpp123456/* *功能 创建子 弹的基类 *作者 林炳文( ling20081005126.com 博客:http:/blog.csdn.net/evankaka) *时间 2015.3.31 */ 78910111213141516171819202122232425262728293031323334353637383940414243#include BulletStyle.h BulletStyle:BulletStyle() /removeAllObject(); /* * 移除所有的东西 */ void BulletStyle:removeAllObject() bulletBatchNode-removeAllChildren(); vecBullet.clear(); this-removeAllChildren(); /* * 移除子 弹,将子 弹从容器中移除,同 时也从 SpriteBatchNode 中移除 */ void BulletStyle:removeBullet(Node* pNode) if (NULL = pNode) return; Sprite* bullet = (Sprite*)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); /每隔 0.2S调用一次发 射子弹函数 schedule(schedule_selector(BulletStyle:shootBullet), 0.2f);/注意,这里的发射方法留给子类来实现! 2.2 只发射一个子弹的类HeroBulletOne.h,注意,直接继承12/* *功能 每次只 发射一个子弹 345678910111213141516*作者 林炳文( ling20081005126.com 博客:http:/blog.csdn.net/evankaka) *时间 2015.3.31 */ #pragma once #ifndef _HeroBulletOne_H_ #define _HeroBulletOne_H_ #include cocos2d.h #include BulletStyle.h USING_NS_CC; class HeroBulletOne : public BulletStyle public: virtual void shootBullet(float dt); ; #endif实现文件:123456789101112131415161718/* *功能 每次只 发射一个子弹 *作者 林炳文( ling20081005126.com 博客:http:/blog.csdn.net/evankaka)*时间 2015.3.31 */ #include HeroBulletOne.h void HeroBulletOne:shootBullet(float dt) Size winSize = Director:getInstance()-getWinSize(); auto PlanePos = plane-getPosition(); /从 缓存中创建子 弹 auto spritebullet = Sprite:createWithTexture(bulletBatchNode-getTexture(); /将 创建好的子弹 添加到 BatchNode 中进行批次渲染 bulletBatchNode-addChild(spritebullet); /将 创建好的子弹 添加到容器 vecBullet.pushBack(spritebullet); Point bulletPos = (Point(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 / flyVelocity;/实际飞行的时间 /子 弹运行的距离和 时间,从飞机处开始运行到屏幕 顶端 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/* *功能 每次发 射二个子弹 *作者 林炳文( ling20081005126.com 博客:http:/blog.csdn.net/evankaka) *时间 2015.3.31 */ #pragma once #ifndef _HeroBulletTwo_H_ #define _HeroBulletTwo_H_ #include cocos2d.h #include
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号