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 里面写增删改查分页的 ...
随机推荐
- Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成
Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下: Web 模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipa ...
- 认识oracle的update更新
这两天给新同事安排了一个工作,即做一个update 的级联更新,在实际操作中发现了一个问题.就是对于Oracle的更新的语法,大部分人尤其是学过SqlServer的人在使用oracle的时候对于ora ...
- js yield
meikidd 发布在meikidd2015年5月6日view:3397 在文章任何区域双击击即可给文章添加[评注]!浮到评注点上可以查看详情. 隐藏标注 首先请原谅我的标题党(●—●),tj 大神的 ...
- 圆角头像----CSS3特效
w3c:http://www.w3school.com.cn/cssref/pr_border-radius.asp 定义和用法 border-radius 属性是一个简写属性,用于设置四个 bord ...
- go http的三种实现---2
package main import ( "io" "log" "net/http" "os" ) func main ...
- 16进制 ,Color,Colour转换
import java.awt.Color; import jxl.format.Colour; public class ColorUtil { public static Colour getNe ...
- JS中的动态合集与静态合集
JS的动态合集 前言 DOM是JavaScript重要组成部分,在DOM中有三个特别的集合分别是NodeList(节点的集合),NamedNodeMap(元素属性的集合)和HTMLCollection ...
- Convert.ToInt32(string '000000003') 变成了 3
Convert.ToInt32(string '000000003') 变成了 3 但是在查询的时候需要用的是string 这里的convert.toint32 反而起了坏作用,不是所有的时候都要用c ...
- zookeeper安装步骤
zookeeper安装步骤 百度搜索:zookeeper 进入后点击下载: 进入到下载的页面 英文: 中文: 进入版本列表: 进入后复制该链接, 在linux执行wget下载: wget https: ...
- Python之可迭代对象、迭代器、生成器
在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...