到目前为止,我们的坦克已经可以移动,并且已经做了碰撞检测。现在,我们要发射子弹了哦。。。。首先,我们在我们的控制层添加一个虚拟按钮,来发射子弹,看代码:

ControlLayer.h

 //按钮SneakyButton* fireButton;//添加发射按钮void addFireButton(void);

ControlLayer.cpp

void ControlLayer::addFireButton()
{float buttonRadius = 160;fireButton=new SneakyButton();fireButton->initWithRect(CCRectZero);fireButton->autorelease();fireButton->setIsToggleable(false);fireButton->setIsHoldable(true);SneakyButtonSkinnedBase *skinFireButton=new SneakyButtonSkinnedBase();skinFireButton->autorelease();skinFireButton->init();CCSprite *normalSprite=CCSprite::create("fire_button_default.png");normalSprite->setOpacity(100);CCSprite *pressedSprite=CCSprite::create("fire_button_press.png");pressedSprite->setOpacity(100);skinFireButton->setPosition(ccp(wSize.width-buttonRadius/2, buttonRadius/2));skinFireButton->setDefaultSprite(normalSprite);skinFireButton->setPressSprite(pressedSprite);//skinFireButton->getButton()->setStatus(true);//注意,一定要加激活状态的,不然会报错skinFireButton->setActivatedSprite(CCSprite::create("fire_button_press.png"));skinFireButton->setButton(fireButton);this->addChild(skinFireButton);}

在update函数中加入

if (fireButton->getIsActive()) {tank->onFire();}

这样,我们就在控制层加入了一个虚拟按钮,注意,跟2d版的不一样,需要添加激活状态,并且active这个属性是只读的,不可修改。OK,然后我们在TankSprite类中,加入开火的函数,看代码:

TankSprite.h

 void onFire(void);void fire(CCSprite *buttle, TankAction buttleOrientation);MapLayer *_mapLayer;cocos2d::CCTMXTiledMap *gameMap;
bool _isCanFire;//子弹方向int _buttleOrientation;void makeCanFire(void);

TankSprite.cpp

//开火
void TankSprite::onFire()
{if (_life==0) {return;}//当tank只能发射一颗子弹的时候if (kind==kBorn || kind==kPlusStarOne) {//能否继续开火if (_isCanFire==false) {return;}//子弹方向即坦克方向_buttleOrientation=kaction;CCSprite *buttle=CCSprite::createWithSpriteFrameName("bullet.png");gameMap->addChild(buttle, -1);//隐藏buttle->setVisible(false);_isCanFire=false;this->fire(buttle, (TankAction)_buttleOrientation);}}//根据传入的子弹,子弹方向来做判断
void TankSprite::fire(CCSprite *buttle, TankAction buttleOrientation)
{//发射子弹的声音SimpleAudioEngine::sharedEngine()->playEffect("bullet.aif");CCPoint ptn;switch (buttleOrientation) {case kUp:CCLOG("%f",this->getPosition().x);buttle->setRotation(0);buttle->setPosition(ccp(this->getPosition().x, this->getPosition().y+this->boundingBox().size.height/2));//终点ptn=ccp(this->getPosition().x, this->getPosition().y+_mapSize.width);break;case kDown:buttle->setRotation(180);buttle->setPosition(ccp(this->getPosition().x, this->getPosition().y-this->boundingBox().size.height/2));ptn=ccp(this->getPosition().x, this->getPosition().y-_mapSize.width);break;case kRight:buttle->setRotation(90);buttle->setPosition(ccp(this->getPosition().x+this->boundingBox().size.width/2, this->getPosition().y));ptn=ccp(this->getPosition().x+_mapSize.width, this->getPosition().y);break;case kLeft:buttle->setRotation(-90);buttle->setPosition(ccp(this->getPosition().x-this->boundingBox().size.width/2, this->getPosition().y));ptn=ccp(this->getPosition().x-_mapSize.width, this->getPosition().y);break;default:break;}const CCPoint realyPosition = ptn;//创建子弹移动动画CCShow *ac1=CCShow::create();CCMoveTo *ac2=CCMoveTo::create(2.0, realyPosition);CCFiniteTimeAction *seq=CCSequence::create(ac1,ac2,CCCallFunc::create(this, callfunc_selector(TankSprite::makeCanFire)),NULL);buttle->runAction(seq);}void TankSprite::makeCanFire()
{CCLOG("lll");_isCanFire=true;}

OK,这样,就简单的加入了发射子弹的功能,

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

子弹虽然加入了,但我们发现它其实是可以穿透墙的,我们并没有对其做碰撞检测。

cocos2d-x的初步学习二十之坦克大战七相关推荐

  1. cocos2d-x的初步学习二十八之爱消除一

    这篇文章中,我们将模仿某个游戏来实现,首页我们做首界面,这里都是一些UI元素的布局,其中会涉及到一些动画,比如贝塞尔曲线,还有cctableview来显示我们的得分,做个排行榜,OK,下面我直接上代码 ...

  2. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  3. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()

    OpenCV学习(二十二) :反向投影:calcHist(),minMaxLoc(),compareHist() 参考博客: 反向投影backproject的直观理解 opencv 反向投影 颜色直方 ...

  4. OpenCV学习(二十) :分水岭算法:watershed()

    OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...

  5. PyTorch框架学习二十——模型微调(Finetune)

    PyTorch框架学习二十--模型微调(Finetune) 一.Transfer Learning:迁移学习 二.Model Finetune:模型的迁移学习 三.看个例子:用ResNet18预训练模 ...

  6. C1认证学习二十六(基础选择器)

    C1认证学习二十六(基础选择器) 任务背景 CSS选择器是CSS规则的一部分,用来指定需要设置的样式的HTML元素,通过选择器可以实现CSS对HTML元素一对一或者一对多或者多对一的控制了啦. 任务目 ...

  7. 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现

    学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...

  8. 【OS学习笔记】二十五 保护模式七:任务和特权级保护对应的汇编源代码

    本汇编代码是以下两篇文章讲解的内容的内核代码; [OS学习笔记]二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念 [OS学习笔记]二十四 保护模式七:调用门与依从的代码段----特权级保护 ...

  9. VUE学习(二十)、插槽

    VUE学习(二十).插槽 一.默认插槽 1.Category.vue <template><div class="category"><h3>{ ...

最新文章

  1. (Mirage系列之十)Mirage经典案例之系统恢复
  2. MySql连接查询与联合查询
  3. sql 分组后按时间降序排列再取出每组的第一条记录
  4. SIP应答消息状态码与功能
  5. Supervisor的作用与配置
  6. Delphi 10.4.2 CE 社区版支持 Android API-30,之二
  7. NOI国家集训队论文分类整理
  8. 计算机高校教师面试试讲和答辩,高校教师试讲答辩面试考试流程
  9. android o 结构光流程,结构光光斑图案生成方法和结构光光斑图案生成设备的制造方法...
  10. 机器学习第四章之逻辑回归模型
  11. (数据科学学习手札58)在R中处理有缺失值数据的高级方法
  12. Android 实现点击输入框以外的区域隐藏软键盘
  13. 甲骨文数据库基本知识
  14. python logger handler_Python中的logger和handler到底是个什么鬼
  15. nagios mysql 并发_nagios监控mysql的connections和processlist
  16. [2020/02]林深时见鹿,溪午不闻钟
  17. matlab偏微分图像修复,图像修复 Region filling and object removal by exemplar-based image inpainting matlab实现...
  18. python画小狗代码_用Python画一只有点方的小狗狗——turtle库circle()函数实践
  19. 三大运营商手机号码正则匹配(联通,电信,移动)
  20. java毕业设计少儿编程教育网站系统mybatis+源码+调试部署+系统+数据库+lw

热门文章

  1. 我是如何让公司后台管理系统焕然一新的(上) -性能优化
  2. sublime Text3去除文本重复行
  3. python 做行转列通过enbid对应多个cell一行显示
  4. Docker 安装最新版禅道16.5版本 原创
  5. 计算机一级考试操作题知识点,计算机一级考操作题知识点归纳.doc
  6. 亿图图示----组织架构图----市场组织架构和公司架构图及家庭架构图
  7. 自动化测试练习项目环境搭建
  8. 毕业设计 单片机智能药箱系统 - STM32
  9. XTUOJ-1251-Colombian Number
  10. 小米测试总监的十年测试路,愿测试人都不再迷茫