在这篇文章中,我们将把剩下的功能完成,首先,我们加入换子弹或是炸弹的功能,它的原理大体是这样的,设置物品出现的时间间隔,会随机出现物品的种类,然后判断物品跟飞机所在区域,碰撞检测,在一起就算是吃到这个物品了,。。OK,下面上代码

首页新建一个类继承CCNode,

ChangeBullet.h

typedef enum{propsTypeBomb = 4,propsTypeBullet = 5}prosType;class ChangeBullet:public cocos2d::CCNode
{public:cocos2d::CCSprite *prop;prosType bulletType;void initWithType(prosType type);void propAnimation();static ChangeBullet* create(void);CC_SYNTHESIZE_RETAIN(cocos2d::CCSprite*, _prop, Prop);ChangeBullet();~ChangeBullet();};

ChangeBullet.cpp

ChangeBullet::~ChangeBullet()
{}ChangeBullet::ChangeBullet()
{}ChangeBullet* ChangeBullet::create()
{ChangeBullet * pRet = new ChangeBullet();if (pRet && pRet->init()){pRet->autorelease();}else{CC_SAFE_DELETE(pRet);}return pRet;}void ChangeBullet::initWithType(prosType type)
{bulletType=type;CCString *string=CCString::createWithFormat("enemy%i_fly_1.png",type);prop=CCSprite::createWithSpriteFrameName(string->getCString());prop->setPosition(ccp((arc4random()%268 + 23)*2,632*2));}//物品出现动画
void ChangeBullet::propAnimation()
{CCMoveTo *ac1=CCMoveTo::create(1, ccp(prop->getPosition().x, 250*2));CCMoveTo *ac2=CCMoveTo::create(0.4, ccp(prop->getPosition().x, 252*2));CCMoveTo *ac3=CCMoveTo::create(1, ccp(prop->getPosition().x, 632*2));CCMoveTo *ac4=CCMoveTo::create(2, ccp(prop->getPosition().x, -55*2));prop->runAction(CCSequence::create(ac1,ac2,ac3,ac4,NULL));}

在上面中,我们定义了一个换物品的类,设置它的物品种类,威力更强的子弹和炸弹,并且构造一个物品出现动画的函数,这个动画函数很简单,都是CCMove构成。。。

GameScene.h

 void addBulletTypeTip();//空降物品时间计数int propTime;ChangeBullet *prop;bool isVisible;bool isBigBullet;bool isChangeBullet;//子弹持续时间int bulletlastTime;void bulletLastTime();

GameScene.cpp

//空降物
void GameLayer::addBulletTypeTip()
{propTime++;if (propTime>500){prop=ChangeBullet::create();prop->initWithType((prosType)(arc4random()%2 + 4));this->addChild(prop->prop);prop->propAnimation();prop->retain();propTime=0;isVisible=true;}}void GameLayer::bulletLastTime()
{if (isBigBullet){if (bulletlastTime > 0){bulletlastTime --;}else{bulletlastTime = 1200;isBigBullet = false;isChangeBullet = true;}}}

然后在我们的update函数中

 this->addBulletTypeTip();this->bulletLastTime();

在collisionDetection函数中

//飞机跟空降物if (isVisible==true){CCRect playRect=playSprite->boundingBox();CCRect propRect=prop->prop->boundingBox();if (playRect.intersectsRect(propRect)){prop->prop->stopAllActions();prop->prop->removeFromParentAndCleanup(true);isVisible=false;//换子弹if (prop->bulletType==propsTypeBullet){// CCLOG("--------22222");isBigBullet = true;isChangeBullet = true;}//炸弹else{for (int i=0; i<planeArray->count(); i++){EnemyPlane *enemyPlane=(EnemyPlane *)planeArray->objectAtIndex(i);//爆炸动画this->enemyPlaneBlowupAnimation(enemyPlane);}planeArray->removeAllObjects();}}}

OK。。。看下效果图

 

OK,到现在我们还没做自己飞机的碰撞,那么接下来我们在collisionDetection函数中,再加入一个判断,判断敌人的飞机跟我们自己的飞机是否碰撞了,上代码

CCRect playRec=playSprite->boundingBox();playRec.origin.x += 25*2;playRec.size.width -= 50*2;playRec.origin.y -= 10*2;playRec.size.height -= 10*2;for (int i=0; i<planeArray->count(); i++){EnemyPlane *enemyPlane=(EnemyPlane *)planeArray->objectAtIndex(i);if (playRec.intersectsRect(enemyPlane->boundingBox())){this->playerBlowupAnimation();this->enemyPlaneBlowupAnimation(enemyPlane);this->gameOver();planeArray->removeObject(enemyPlane);}}
//自己的飞机爆炸动画
void GameLayer::playerBlowupAnimation()
{playSprite->stopAllActions();CCArray *array=CCArray::create();for (int i=1; i<=4; i++){CCString *string=CCString::createWithFormat("hero_blowup_%i.png",i);CCSpriteFrame *frame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(string->getCString());array->addObject(frame);}CCAnimation *animation=CCAnimation::createWithSpriteFrames(array,0.1);CCAnimate *animate=CCAnimate::create(animation);CCRepeatForever *ac1=CCRepeatForever::create(animate);playSprite->runAction(ac1);array->removeAllObjects();}

上面中,我们做了碰撞检测,一旦飞机跟敌人的飞机撞上,我们就认为游戏结束了,所以最后我们加上个游戏结束的画面

//游戏结束
void GameLayer::gameOver()
{isGameOver=true;this->gamePause();CCLayerColor *gameoverLayer=CCLayerColor::create(ccc4(215, 221, 222, 255), 582, 544);gameoverLayer->setPosition(ccp(wSize.width/2-582/2, 220));this->addChild(gameoverLayer, 3);CCLabelTTF *ttfLabel=CCLabelTTF::create("飞机大战分数", "MarkerFelt-Thin", 50);ttfLabel->setPosition(ccp(gameoverLayer->getContentSize().width/2-ttfLabel->getContentSize().width/2, gameoverLayer->getContentSize().height-70));ttfLabel->setColor(ccc3(0, 0, 0));ttfLabel->setAnchorPoint(ccp(0, 0));gameoverLayer->addChild(ttfLabel, 1);CCLabelTTF *scLabel=CCLabelTTF::create(scoreLabel->getString(), "MarkerFelt-Thin", 44);scLabel->setPosition(ccp(gameoverLayer->getContentSize().width/2-scLabel->getContentSize().width/2, gameoverLayer->getContentSize().height-250));scLabel->setColor(ccc3(0, 0, 0));scLabel->setAnchorPoint(ccp(0, 0));gameoverLayer->addChild(scLabel, 1);CCMenuItemFont *startItem=CCMenuItemFont::create("继续", this,menu_selector(GameLayer::restart));startItem->setPosition(ccp(gameoverLayer->getContentSize().width/2, 60));startItem->setFontSizeObj(50);startItem->setFontNameObj("Georgia-Bold");startItem->setColor(ccc3(0, 0, 0));CCMenu *pMenu = CCMenu::create(startItem, NULL);pMenu->setPosition(CCPointZero);gameoverLayer->addChild(pMenu, 1);}//游戏暂停
void GameLayer::gamePause()
{if (isGameOver==false){}else{CCObject *object;CCARRAY_FOREACH(this->getChildren(), object){CCNode *node=(CCNode *)object;node->stopAllActions();}}}

OK.。。。到这里,基本上大体的功能有了,呵呵,貌似暂停还木有。。。。

下篇文章中,我们将来探究一下在ios平台上适配的问题,当然还有android等其他平台的适配,。。。。。。。。。

cocos2d-x的初步学习二十三之模仿微信打飞机二相关推荐

  1. 案例十三、模仿微信打飞机游戏

    首先实现微信打飞机游戏,首先会有自己和敌机,采用canvas绘图来生成自己和敌人. 1.生成自己,且可以通过左右键来进行左右移动. //生成自己,且可以左右移动 //控制飞机向右移动的函数functi ...

  2. 微信小店二次开发_微信小店二次开发功能套餐列表

    本商品包括微信小店二次功能开发套餐. [商品介绍]以下费用均为一次性费用.永久使用. 套餐一: 800元 订单查询:用户查询自己最近30天之内的订单记录. 实时通知:用户付款成功后,实时通知用户订单详 ...

  3. 生成微信小程序发布上线后的二维码 、获取微信小程序二维码、微信小程序二维码如何生成?

    情景: 1.在微信小程序审核完成,发布到线上后,想通过扫描小程序二维码进入小程序 2.可分享二维码出去,通过二维码扫码进入小程序 方法: 1.进入微信小程序的后台配置.链接:微信公众平台.(如图一) ...

  4. python 微信二次开发_python微信公众账号二次开发

    微信公众号开发网址:https://mp.weixin.qq.com/ 注意:申请公众账号后,系统需要一天的审核时间后,才能进行二次开发: 创建步骤: 1.申请免费且支持python的服务器,新浪云s ...

  5. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  6. 如何给CSDN博客添加个人微信公众号二维码或自定义栏目

    公众号查看文章更清晰 在使用CSDN的过程中,可以看到有些博主的主页有个人微信二维码,微信公众号二维码等一些个人栏目信息.这对作者而言,可以让其他浏览博客的游客和作者进行更有效的沟通,也可以在这里对自 ...

  7. ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人 ...

  8. 结束处理程序——Windows核心编程学习手札之二十三

    结束处理程序 --Windows核心编程学习手札之二十三 使用SEH可以只关注程序要完成任务,而运行中发生的错误,系统将会发现并通知.Windows引入SHE是为了便于操作系统的开发,使用SHE所造成 ...

  9. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

最新文章

  1. 从谷歌离职回到西湖大学,只为让AI听懂你的悲伤!
  2. linux 挂载u盘
  3. DotNet Framework源代码调试问题
  4. Telerik for Winform 2010版下载、安装、初次使用
  5. Linux字体大小颜色,Linux技巧:自定义Gnome面板字体和颜色
  6. 半监督学习之数据加载
  7. 选择器Selector
  8. python连接数据库设置编码_Python学习18-连接数据库
  9. goahead 的认证和自定义登陆页面的cookie使用【原创】
  10. PyInstaller打包成exe可执行文件
  11. golang基础1-0:golang环境配置及第一行代码Hello World
  12. 毛毛虫 树形DP
  13. 升级Win11后不喜欢怎么退回Win10系统?
  14. 如何用HTML制作一个3行3列的表格,如何利用表格制作网页
  15. 分析微信发送消息接口(基于网页版分析)
  16. 【bzoj3034】Heaven Cow与God Bull
  17. matlab中clc什么意思,MATLAB中clc是什么意思
  18. 【django】用户登录模块实现步骤(二)之QQ登录工具AgentLogin和通过OAuth2.0认证获取openid【33】
  19. Keepalived+LVS+MySQL双主复制实现读写负载均衡及高可用
  20. 思维导图软件哪个好?分享3款免费的思维导图软件

热门文章

  1. WikiTaxi_Importer_1.3.1 维基 离线数据库
  2. 第二季度UWA STAR —只有不拒绝问题,才能进一步解决问题
  3. 网易我的世界服务器加载无响应,我的世界网易版开始游戏没反应
  4. Python学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
  5. 学计算机专业选i5四核还是6核,计算机CPU的4核和6核有什么区别?
  6. Week8 :差分约束,拓扑排序和kahn,强连通图和kosaraju
  7. 跨境电商收款账号一样会关联吗?谁能告诉?
  8. 库卡机器人提示“无合适的mam文件“
  9. 【LaTeX符号】条件独立与不独立符号
  10. 打开eclipse 运行发现tomcat出问题。如路径找不到 (1)eclipse 运行出现:The archive:C:/tomcat/bin/bootstrap.jar which is refe