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

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);//移除CCArraythis->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();

转载于:https://www.cnblogs.com/james1207/p/3331137.html

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

  1. 【三】仿微信飞机大战cocos2d-x3.0rc1

    上一篇:[二]仿微信飞机大战cocos2d-x3.0rc1 今天的任务是: 1.我机子弹无限量发射 2.三种类型敌机的出现 3.敌机自己碰墙死掉 一.效果界面展示 暂时没有实现子弹打中敌机 二.工程解 ...

  2. Unity游戏开发官方入门教程:飞机大战(六)——创建子弹

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  3. Unity游戏开发官方入门教程:飞机大战(二)——创建飞船对象

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  4. cocos2d-x-3.3-022-仿微信飞机大战-开篇介绍

    原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接 写在最前面 微信飞机大战,触控的大神JackyStudio 已经在他的专栏微信飞机大战讲解中完整细致的实现了一遍,基于cocos2d- ...

  5. Unity游戏开发官方入门教程:飞机大战(五)——实现飞船控制脚本

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  6. 【C语言游戏】微信飞机大战 | PlaneFight(EasyX,drawAlpha绘制透明贴图,计时器,计帧器,游戏难度自动调整,接受鼠标消息,源码素材免费分享)

    一.数据结构介绍 struct aircraft //所有飞机的结构体 typedef struct aircraft{ int type;//飞机类型 int HP;//剩余血量 int bomb_ ...

  7. Unity游戏开发官方入门教程:飞机大战(十)——敌人的爆炸和移动

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  8. pygame飞机大战关于子弹的设计(一)(含源码)

    Exe如下,欢迎试玩! 链接:https://pan.baidu.com/s/1Hw-DP98Jayr-jmE3ZCe9NA 提取码:2xsq 先上图,终极子弹: 我方子弹共有三种模型:基础子弹.双发 ...

  9. 【cocos2d-x入门实战】微信飞机大战之一:搞个飞机来玩玩

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11650413 学习了一个阶段的cocos2d-x,发现用起来还是蛮顺手的.然 ...

  10. 【cocos2d-x入门实战】微信飞机大战之八:自定义敌机精灵

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11890969 发现CSDN上传的gif图不能动...有招没? 飞机可以控制飞 ...

最新文章

  1. 使用LaunchScreen.storyboard黑屏
  2. raise主动引发异常
  3. RNN和LSTM、GRU的简单理解
  4. day3----python变量与常量
  5. c++面向对象高级编程 学习七 转换函数
  6. mysql mongodb b树_为何Mongodb索引用B树,而Mysql用B+树?
  7. RTMP vs RTMFP
  8. Spring AOP原理详解及实例
  9. 微信小程序 上传本地图片
  10. 怎么用计算机测出来体脂,如何测自己的体脂率?
  11. Python requests模块高级用法
  12. 阿里新推出“阿里云网盘”App,有机会干掉“百度网盘”吗?
  13. 操作成功的提示信息动态添加
  14. 黄健翔激情解说之中国移动版、石化版、房地产版
  15. mysql: load data与select into outfile
  16. 2021江苏大学生编程大赛I题(省赛试水)
  17. 数据结构使用c语言第5版答案,数据结构(c语言版)第五章答案.doc
  18. Access.2007数据库开发全书(奋斗的小鸟)_PDF 电子书
  19. django html跳转页面跳转页面,django 常见页面的跳转,渲染,以及返回
  20. 探测C库malloc元数据捕获野指针

热门文章

  1. python中debug和run有什么区别_android应用程序开发中run和debug 有什么区别?
  2. 产品类别二级分类_医疗器械分类目录未来可能实施动态调整
  3. linux ftp常用操作,linux 操作 ftp 常用命令
  4. 一般家用监控多少钱_安装空调一般多少钱
  5. VS2017离线下载 -- 如何让VS2017不占用C盘
  6. jdbc代码_Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记
  7. oracle判断时间条件相等_判断条件的先后顺序,会引起索引失效么?
  8. Spark Structured Steaming 聚合、watermark 以及 window操作,结合输出模式的研究总结
  9. maven与ant的区别
  10. 使用create-react-app添加css modules、sasss和antd