cocos2dx打飞机项目笔记二:BulletLayer类
2013-12-25 10:56
429 查看
BulletLayer.h 内容如下
重点一:敌机离hero越来越近时发射子弹的声音频率变快
根据数据成员、函数名可以很容易看得出每个成员的意义,不过该类的设计思想我前后改动比较大,所以会看到 addBullet 和addOneBullet 两个奇怪的方法,所有一切都是为了实现一个效果:当敌机离hero越来越近时发射子弹的那个声音就会变得很急促,这个效果非常必要,否则游戏就一直是固定频率的 砰砰砰 声,感觉很差。详情如下。
原本 startShoot 方法的实现是:
this->schedule(schedule_selector(BulletLayer::addBullet), 0.15f, kCCRepeatForever, delay); 这样子每隔一定时间就调用 addBullet方法来发射一粒子弹;
现在改成:this->scheduleOnce(schedule_selector(BulletLayer::addOneBullet),0.5f); 只回调一次,就是只调用一次 addOneBullet 方法发射一粒子弹,然后removeBullet 子弹后再回调 addOneBullet 方法发射一粒子弹。
也就是说,其实屏幕上一直只有一粒子弹!当这颗子弹被回收后才发射另一粒子弹,这样子当敌机离hero越来越近时,子弹击中敌机的时间也就越短,发射下一粒子弹的时间间隔就越短,那么那个发射子弹的声音就急促起来了~~
重点二:重复remove子弹的问题
从batchNode删除子弹时出现一个 “node不是batchnode的child” 的错误,原因见代码注释
removeBullet 方法实现如下:
class BulletLayer : public cocos2d::CCLayer { public: CC_SYNTHESIZE(bool, m_IsHeroLive, IsHeroLive);//hero活着的时候才发射子弹。。。 CCArray *m_bullets;//存储发射的子弹 CCNode* pParent;//在类初始化的时候会把Hero赋给它他,因为子弹要根据hero来确定发射的位置 CCSpriteBatchNode* batchNode; //对子弹进行批处理 BulletLayer(void); ~BulletLayer(void); void startShoot(void);//调用该方法表示开始发射子弹 void stopShoot(void); void bulletMoveToFinish(CCNode* pSender); //直接调用removeBullet void removeBullet(CCSprite* bullet);//子弹飞出屏幕外 或者 和敌机碰撞后,把子弹回收 void addBullet(float dt);//已不用 void addOneBullet(float dt);//发射一粒子弹 CREATE_FUNC(BulletLayer); };
重点一:敌机离hero越来越近时发射子弹的声音频率变快
根据数据成员、函数名可以很容易看得出每个成员的意义,不过该类的设计思想我前后改动比较大,所以会看到 addBullet 和addOneBullet 两个奇怪的方法,所有一切都是为了实现一个效果:当敌机离hero越来越近时发射子弹的那个声音就会变得很急促,这个效果非常必要,否则游戏就一直是固定频率的 砰砰砰 声,感觉很差。详情如下。
原本 startShoot 方法的实现是:
this->schedule(schedule_selector(BulletLayer::addBullet), 0.15f, kCCRepeatForever, delay); 这样子每隔一定时间就调用 addBullet方法来发射一粒子弹;
现在改成:this->scheduleOnce(schedule_selector(BulletLayer::addOneBullet),0.5f); 只回调一次,就是只调用一次 addOneBullet 方法发射一粒子弹,然后removeBullet 子弹后再回调 addOneBullet 方法发射一粒子弹。
也就是说,其实屏幕上一直只有一粒子弹!当这颗子弹被回收后才发射另一粒子弹,这样子当敌机离hero越来越近时,子弹击中敌机的时间也就越短,发射下一粒子弹的时间间隔就越短,那么那个发射子弹的声音就急促起来了~~
重点二:重复remove子弹的问题
从batchNode删除子弹时出现一个 “node不是batchnode的child” 的错误,原因见代码注释
removeBullet 方法实现如下:
void BulletLayer::removeBullet(CCSprite* bullet) { if (bullet!=NULL) { bullet->stopAllActions(); //一粒子弹可能同时撞到两台敌机,会造成被remove两次而出错,所以要有判断 if (this->batchNode->getChildren()->containsObject((CCObject*)bullet) ) { this->batchNode->removeChild(bullet,true); } if ( this->m_bullets->containsObject(bullet)) { this->m_bullets->removeObject(bullet); } } //一粒子弹可能同时撞到两台敌机,removeBullet 方法就会被调用两次, //那么addOneBullet 也会被调用两次,如果没有 this->m_bullets->count() < 1 ,子弹就会越来越多 if (this->m_IsHeroLive && this->m_bullets->count() < 1) { BulletLayer::addOneBullet(0.1f); } }
相关文章推荐
- cocos2dx打飞机项目笔记六:GameScene类和碰撞检测 boundingbox
- cocos2dx打飞机项目笔记一:项目结构介绍
- cocos2dx打飞机项目笔记一:项目结构介绍
- cocos2dx打飞机项目笔记四:Enemy类和EnemyLayer类
- cocos2dx打飞机项目笔记七:各种回调:定时器schedule、普通回调callFunc、菜单回调menu_selector、事件回调event_selector
- cocos2dx打飞机项目笔记三:HeroLayer类和坐标系
- cocos2dx打飞机项目笔记五:CCSpriteBatchNode 的使用
- cocos2dx游戏开发——微信打飞机学习笔记(七)——Enemy的搭建
- 13.1-全栈Java笔记:打飞机游戏实战项目|AWT|MyGameFrame
- cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备
- Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的
- Cocos2dx 3.1.1 学习笔记整理(1) 新建项目
- cocos2dx游戏开发——微信打飞机学习笔记(五)——BackgroundLayer的搭建
- cocos2dx 3.2之Lua打飞机项目
- 13.9-全栈Java笔记:打飞机游戏实战项目|Time|Plane|其他案例展示
- cocos2dx 3.2之Lua打飞机项目
- Cocos2dx 学习笔记整理----在项目中使用图片(一)
- cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架
- cocos2dx游戏开发——微信打飞机学习笔记(九)——BulletLayer的搭建
- cocos2d-x学习笔记1:cocos2dx 3.0 安装及项目创建