这一篇将会处理完子弹层的其他要点。

1.子弹的初始位置

子弹的初始位置在飞机的机头位置,因为飞机在游戏的过程中会随着玩家的触摸而改变其位置,所以,子弹的初始位置只能以当前飞机位置为基准进行添加。

CCPoint planePosition=PlaneLayer::sharedPlane->getChildByTag(AIRPLANE)->getPosition();
CCPoint bulletPosition=ccp(planePosition.x,planePosition.y+PlaneLayer::sharedPlane->getChildByTag(AIRPLANE)->getContentSize().height/2);
bullet->setPosition(bulletPosition);

还记得当时给飞机加的tag(AIRPLANE)么?通过sharedPlane的getChildByTag就能获取到飞机精灵,然后计算出子弹初始的位置,添加到子弹层。

其实更为严谨的方式是设计一个子弹管理器,然后在管理器中添加子弹,这里简单的处理,会比较好理解,虽然会影响到编程风格。

2.子弹的飞行效果

子弹的飞行效果,很简单,就是往Y方向移动,但是X方向不能改变。所以要注意,已发射的子弹不能随着飞机的移动而跟着移动,一旦这颗子弹发射了,它就是一个独立的个体,不管飞机移动或者爆炸了,它只会按照自己的规则进行运动而不受干扰。

因为子弹的初始Y位置是不固定的,如果固定死一个时间会导致不同子弹的移动速度不同,所以必须先把每颗子弹的运动时间计算出来。

float length=CCDirector::sharedDirector()->getWinSize().height+bullet->getContentSize().height/2-bulletPosition.y;//飞行距离,超出屏幕即结束
float velocity=420/1;//飞行速度:420pixel/sec
float realMoveDuration=length/velocity;//飞行时间 CCFiniteTimeAction* actionMove=CCMoveTo::create(realMoveDuration,ccp(bulletPosition.x,CCDirector::sharedDirector()->getWinSize().height+bullet->getContentSize().height/2));
CCFiniteTimeAction* actionDone=CCCallFuncN::create(this,callfuncN_selector(BulletLayer::bulletMoveFinished));//回调一个子弹结束处理函数 CCSequence* sequence=CCSequence::create(actionMove,actionDone);
bullet->runAction(sequence);

3.子弹的管理和回收

cocos2d-x提供了一个很好用的数组类CCArray,它相当于一个容器。我们可以把一些创建出来的精灵放在里面进行管理,在不需要的时候,从中删除它并且从屏幕上删除它(有时候看不见不代表它们已经从屏幕上删除了)。

因为CCArray::create函数调用了autoRelease,所以我们必须在调用创建后手动进行retain,以免超出使用范围后被释放,同时在析构函数中再进行release防止内存泄漏。

(1)创建成员变量指针

CCArray* m_pAllBullet;

(2)子弹层的构造函数和析构函数

BulletLayer::BulletLayer(void)
{
m_pAllBullet=CCArray::create();
m_pAllBullet->retain();
} BulletLayer::~BulletLayer(void)
{
m_pAllBullet->release();
m_pAllBullet=NULL;
}

(3)子弹飞出屏幕后(即子弹运动结束后,自然消失而不是和敌机碰撞)的调用函数

void BulletLayer::bulletMoveFinished(CCNode* pSender)
{
CCSprite* bullet=(CCSprite*)pSender;
m_pAllBullet->removeObject(bullet);//移除CCArray
this->removeChild(bullet,true);//移除屏幕
}

4.子弹层其他接口

(1)开始发射子弹

void BulletLayer::StartShoot(float delay)//这里使用的是一个缺省函数,为什么这么用,后面会解释到。
{
this->schedule(schedule_selector(BulletLayer::AddBullet),0.01f,kCCRepeatForever,delay);
}

(2)停止发射子弹

void BulletLayer::StopShoot()//卸载任务执行器
{
this->unschedule(schedule_selector(BulletLayer::AddBullet));
}

(3)删除某颗子弹

void BulletLayer::RemoveBullet(CCSprite* bullet)//一旦子弹和敌机碰撞,我们就要删掉这个子弹
{
if (bullet!=NULL)
{
this->m_pAllBullet->removeObject(bullet);
this->removeChild(bullet,true);
}
}

好吧,到此为止,子弹层就创建完毕了,我们把它加入GameLayer层的init函数中,并执行开始发射子弹,看一下飞机是不是可以发射子弹了。

//加入bulletLayer
this->bulletLayer=BulletLayer::create();
this->addChild(bulletLayer);
this->bulletLayer->StartShoot();

[置顶] 【cocos2d-x入门实战】微信飞机大战之六:子弹层的处理的更多相关文章

  1. [置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11730601 不过明眼人一看就知道起飞的不是飞机,是背景,相对运动引起的错觉. 1 ...

  2. [置顶] 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11713197 在整个游戏开始之前,我们先看一下HelloWorld示例中CCSce ...

  3. [置顶] 【cocos2d-x入门实战】微信飞机大战之四:飞机登场咯

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11757175 昨天收到了电子工业出版社寄过来的<cocos2d-x游戏开发之 ...

  4. [置顶] 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12082043 游戏是实现了,但是如果有个欢迎界面和一个结束界面就更好了. 欢 ...

  5. [置顶] 【cocos2d-x入门实战】微信飞机大战之十二:分数的本地存储

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/12036237 作为一个单机游戏,连分数存储的的功能都没有,让它怎么在单机游戏圈里混 ...

  6. 【一】仿微信飞机大战cocos2d-x3.0rc1

    參考 [偶尔e网事] 的 [cocos2d-x入门实战]微信飞机大战  cocos2dx 2.0版本号,偶尔e网事他写的很具体,面面俱到,大家很有必要看下.能够通过以下链接跳转: cocos2d-x入 ...

  7. 用DIV+Css+Jquery 实现的旧版微信飞机大战。

    用jquery 实现的旧版微信飞机大战. 以前一直都是做后台和业务逻辑,前端很少去做, 现在个小游戏. 方向键控制方向,Ctrl 键 放炸弹(当然你的有炸弹,哈哈)! 主要都是用div+Css实现的, ...

  8. Cocos2d-x 3.0final 终结者系列教程16-《微信飞机大战》实现

    看到cocos2d-x推出了3.1版本号,真是每月一次新版本号,速度. 另一个好消息就是http://cn.cocos2d-x.org/上线了,祝贺!啥时候把我的视频和教程放上去呢?!! . 视频下载 ...

  9. 用Javascript模拟微信飞机大战游戏

    最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...

随机推荐

  1. hdu3415:最大k子段和,单调队列

    题目大意:给定长度为n的数组,求出最大的区间和,其中区间长度在[1,k]之间 分析: 学动态规划的时候我们会遇到一个经典问题 最大子段和,这个题跟最大子段和很类似 不同的是区间的长度有限制,无法用原算 ...

  2. 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)

    关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...

  3. Java 8 新特性终极版

    声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

  4. LinearLayout 和 RelativeLayout

    共有属性: java代码中通过btn1关联次控件 android:id="@+id/btn1" 控件宽度 android:layout_width="80px" ...

  5. 修改过mysql数据库字段内容默认值为当前时间

    --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP  ALTER TABLE `table_name`ADD COLUMN  `CreateTime` datetime N ...

  6. mysql插入数据时,中文乱码

    MySQL 插入数据时,中文乱码问题的解决(转) 当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1 ...

  7. 小米路由器mini建FTP

    输入命令 df -h 复制代码 查看自己的分区路径,我自己用了一个闲置笔记本电脑硬盘转USB,插到mini,有四个区 为了方便,我选择把ftp安装在第一个分区  /extdisks/sda1/ 创建f ...

  8. STM32F051 IAP源代码分享

    STM32F051 IAP源代码分享 假设不懂IAP的请自己主动脑补或者怒戳这里 http://www.openedv.com/posts/list/11494.htm 然后STM32F051的IAP ...

  9. 如何单独编译Android源代码中的模块

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6566662 第一次下载好Android源代码工 ...

  10. Android实现左右滑动效果

    本示例演示在Android中实现图片左右滑动效果.   关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来 ...