cocos2dx打飞机项目笔记二:BulletLayer类
BulletLayer.h 内容如下
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() < )
{
BulletLayer::addOneBullet(0.1f);
} }
cocos2dx打飞机项目笔记二:BulletLayer类的更多相关文章
- cocos2dx打飞机项目笔记一:项目结构介绍
最近在学习cocos2dx引擎,版本是2.1.3,开发环境是win7 + vs2010,模仿微信打飞机游戏,开发中参考了 csdn 偶尔e网事 的系列文章:http://blog.csdn.net/c ...
- cocos2dx打飞机项目笔记三:HeroLayer类和坐标系
HeroLayer类主要是处理hero的一些相关东西,以及调用bulletLayer的一些方法,因为子弹是附属于hero的~~ HeroLayer 类的成员如下: class HeroLayer : ...
- cocos2dx打飞机项目笔记六:GameScene类和碰撞检测 boundingbox
GameScene类虽然是占用游戏最多时间的类,但是里面的东西不是很多,最重要的就是碰撞检测了,碰撞检测代码如下: void GameScene::detectionCrash() { CCArray ...
- cocos2dx打飞机项目笔记四:Enemy类和EnemyLayer类
Enemy类没什么内容,就create和init方法,根据参数来创建不同的敌机,头文件代码如下: //飞机的类型 enum planeType {smallPlane, midPlane, bigPl ...
- cocos2dx打飞机项目笔记七:各种回调:定时器schedule、普通回调callFunc、菜单回调menu_selector、事件回调event_selector
各种回调函数的定义: typedef void (CCObject::*SEL_SCHEDULE)(float); typedef void (CCObject::*SEL_CallFunc)(); ...
- cocos2dx打飞机项目笔记五:CCSpriteBatchNode 的使用
在上一节里,在头文件看到 定义了一个 CCSpriteBatchNode* batchNode;,在addEnemy方法里看到 batchNode->addChild(enemy); 新建的敌机 ...
- 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...
- php笔记(二)PHP类和对象之Static静态关键字
PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...
- ASP.Net MVC OA项目笔记<二>
1.1.0 创建数据层 1.1.1 CZBK.ItcastOA.IDAL 引用 CZBK.ItcastOA.Model 1.2.1 给IDAL添加一个接口IUserInfoDal 里面写增删改查分页的 ...
随机推荐
- ManicTime软件破解版自用
ManicTime(时间管理软件)专业版 附破解教程 By tchivs - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn htt ...
- hdu 4705(树形DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数.于是我们可以确定中间点B,在 ...
- ios -生成推广海报
#import "ViewController.h" #import "Masonry.h" @interface ViewController () @end ...
- Mac下使用安装MongoDB
1.安装方法1:Mac电脑上面安装很简单,直接下载需要的版本解压即可: 下载网址 https://www.mongodb.com/download-center?jmp=nav#community 方 ...
- Tomcat虚拟目录
x先来看一段server.xml文件里的配置: <Host appBase="" autoDeploy="true" debug="0" ...
- 利用.Net中Process类调用netstat命令来判断计算端口的使用情况
利用.Net中Process类调用netstat命令来判断计算端口的使用情况: Process p = new Process();p.StartInfo = new ProcessStartInfo ...
- [JavaScript] this、call和apply详解
在JavaScript编程中,理解this.call和apply是道槛,如果能正确的理解它们的本质及其应用.那么在以后的JavaScript中会得心应手. this 跟别的语言大相径庭的是,JavaS ...
- 【python】-- web框架本质
web框架 一.web框架简述 所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_request( ...
- spring和hibernate整合时设置自动生成数据库的表
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFa ...
- 简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...