主场景要包括其它类的头文件

  1. #include "cocos2d.h"
  2. #include "MyPlane.h"
  3. #include "Bullet.h"
  4. #include "EnemyManager.h"
  5. #include "Controller.h"
  6. #include "BackgroundMove.h"
  7. #include "FlowWord.h"

在这个游戏中。我将各种碰撞检測也放到主场景中进行

  1. void gameUpdate(float dt); // 碰撞检測
  2. bool bulletCollisionEnemy(Sprite* pBullet); // 子弹和敌机碰撞
  3. void enemyCollisionPlane(); // 我机和敌机、敌机子弹碰撞
  4. virtual void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event);

当然。主场景要有各个类的实例做变量

  1. MyPlane *planeLayer;
  2. Bullet *bulletLayer;
  3. EnemyManager *enemyLayer;
  4. Controller *controlLayer;

主场景的实现

  1. TollgateOne::TollgateOne() : planeLayer(NULL), bulletLayer(NULL), enemyLayer(NULL), controlLayer(NULL)
  2. {
  3.  
  4. }
  5. TollgateOne::~TollgateOne()
  6. {
  7. _eventDispatcher->removeEventListenersForTarget(this);
  8. }
  9.  
  10. cocos2d::Scene* TollgateOne::createScene()
  11. {
  12. auto scene = Scene::create();
  13.  
  14. auto layer = TollgateOne::create();
  15.  
  16. scene->addChild(layer);
  17.  
  18. return scene;
  19. }
  20.  
  21. bool TollgateOne::init()
  22. {
  23. if (!Layer::init())
  24. {
  25. return false;
  26. }
  27.  
  28. // 启动触摸机制
  29. this->setTouchEnabled(true);
  30.  
  31. // 背景无限滚动
  32. auto m_back = BackgroundMove::create();
  33. this->addChild(m_back,0);
  34.  
  35. //游戏開始 飘字效果
  36. auto dictionary = Dictionary::createWithContentsOfFile("fonts/AboutMe.xml");
  37. auto m_flow = FlowWord::create();
  38. m_flow->showFlowWord(
  39. ((__String *)(dictionary->objectForKey("play")))->getCString(),
  40. Point(Director::getInstance()->getVisibleSize().width / 2+60, Director::getInstance()->getVisibleSize().height/2),
  41. m_flow->otherFlowWord()
  42. );
  43. this->addChild(m_flow);
  44.  
  45. //游戏更新
  46. this->schedule(schedule_selector(TollgateOne::gameUpdate));
  47.  
  48. // 增加控制层
  49. controlLayer = Controller::create();
  50. this->addChild(controlLayer);
  51.  
  52. // 增加飞机
  53. planeLayer = MyPlane::create();
  54. this->addChild(planeLayer,1);
  55.  
  56. // 增加敌机和分数显示
  57. enemyLayer = EnemyManager::create();
  58. enemyLayer->bindController(controlLayer);
  59. this->addChild(enemyLayer,1);
  60.  
  61. // 开启子弹
  62. bulletLayer = Bullet::create();
  63. bulletLayer->bindEnemyManager(enemyLayer);
  64. this->addChild(bulletLayer,1);
  65.  
  66. //对返回键的响应
  67. auto m_listener = EventListenerKeyboard::create();
  68. m_listener->onKeyReleased = CC_CALLBACK_2(TollgateOne::onKeyReleased, this);
  69. _eventDispatcher->addEventListenerWithSceneGraphPriority(m_listener, this);
  70.  
  71. return true;
  72. }
  73.  
  74. void TollgateOne::gameUpdate(float dt)
  75. {
  76. bool bMoveButt = false;
  77.  
  78. //子弹和敌机对碰
  79. for (auto& eButtle : bulletLayer->vecBullet)
  80. {
  81. Sprite* pBullet = (Sprite*)eButtle; // 获取子弹精灵
  82. bMoveButt = bulletCollisionEnemy(pBullet);
  83. if (bMoveButt)
  84. {
  85. // 子弹删除了。无需再遍历
  86. return;
  87. }
  88. }
  89.  
  90. // 敌机、敌机子弹与我方飞机碰撞
  91. enemyCollisionPlane();
  92. }
  93.  
  94. bool TollgateOne::bulletCollisionEnemy(Sprite* pBullet)
  95. {
  96. for (auto& eEnemy : enemyLayer->vecEnemy)
  97. {
  98. Enemy* pEnemySprite = (Enemy*)eEnemy;
  99.  
  100. // 是否发生碰撞
  101. if (pBullet->boundingBox().intersectsRect(pEnemySprite->getBoundingBox()))
  102. {
  103.  
  104. // 飞机仅仅剩下一格生命值
  105. if (1 == pEnemySprite->getLife())
  106. {
  107. pEnemySprite->loseLife(); // 知道为什么这里也要loselife吗?你能够试着凝视掉看看
  108. enemyLayer->blowupEnemy(pEnemySprite);
  109. }
  110. else
  111. {
  112. pEnemySprite->loseLife();
  113. }
  114.  
  115. //删除子弹
  116. bulletLayer->removeBullet(pBullet);
  117. return true;
  118. }
  119. }
  120.  
  121. return false;
  122. }
  123.  
  124. void TollgateOne::enemyCollisionPlane()
  125. {
  126. Sprite* pPlane = (Sprite*)planeLayer->getChildByTag(AIRPLANE);
  127. for (auto& eEnemy : enemyLayer->vecEnemy)
  128. {
  129. Enemy* pEnemySprite = (Enemy*)eEnemy;
  130.  
  131. // 是否发生碰撞
  132. if (pPlane->boundingBox().intersectsRect(pEnemySprite->getBoundingBox()) && pEnemySprite->getLife() > 0)
  133. {
  134. if (1 == planeLayer->getAlive())
  135. {
  136. planeLayer->loseAlive();
  137. controlLayer->getSaveData()->save();
  138. this->unscheduleAllSelectors();
  139. this->bulletLayer->StopBulletShoot();
  140. this->planeLayer->blowUp();
  141. Director::getInstance()->replaceScene(
  142. TransitionMoveInT::create(0.8f, GameOver::createScene())); // 替换场景
  143. }
  144. else
  145. planeLayer->loseAlive();
  146. }
  147. }
  148.  
  149. for (auto& eEnemyBullet : bulletLayer->vecEnemyBullet)
  150. {
  151. Sprite* pEnemyBullet = (Sprite*)eEnemyBullet; // 获取子弹精灵
  152.  
  153. // 是否发生碰撞
  154. if (pPlane->boundingBox().intersectsRect(pEnemyBullet->getBoundingBox()))
  155. {
  156. if (1 == planeLayer->getAlive())
  157. {
  158. planeLayer->loseAlive();
  159. controlLayer->getSaveData()->save();
  160. this->unscheduleAllSelectors();
  161. this->bulletLayer->StopBulletShoot();
  162. this->planeLayer->blowUp();
  163. Director::getInstance()->replaceScene(
  164. TransitionMoveInT::create(0.8f, GameOver::createScene())); // 替换场景
  165. }
  166. else
  167. planeLayer->loseAlive();
  168.  
  169. bulletLayer->removeEnemyBullet(pEnemyBullet);
  170.  
  171. return;
  172. }
  173. }
  174. }
  175.  
  176. void TollgateOne::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event)
  177. {
  178. if (keyCode == EventKeyboard::KeyCode::KEY_ESCAPE)
  179. {
  180. Director::getInstance()->replaceScene(HelloWorld::createScene());
  181. }
  182. }

主场景就是将其他类融合在一起,碰撞检測也是在这里进行。

注意一下这里的事件监听,和開始界面的不太一样。但都要在析构函数中移除。

【cocos2d-x 3.7 飞机大战】 决战南海I (十) 游戏主场景的更多相关文章

  1. 【cocos2d-x 3.7 飞机大战】 决战南海I (十二) 游戏结束场景

    游戏结束的时候,要显示分数.还要可以选择是返回主场景还是退出游戏 // 退出游戏 void menuCloseCallback(cocos2d::Ref* pSender); // 返回主界面 voi ...

  2. cocos2dx实现经典飞机大战

    游戏开始层 #ifndef __LayerGameStart_H__ #define __LayerGameStart_H__ #include "cocos2d.h" USING ...

  3. cocos2dx 3.0 飞机大战

    因为课程须要.然后又水平有限.所以写了个飞机大战.加上不会画画.所以图片资源也是从微信apk解压出来的,设计思路參考的偶尔e网事. 闲话不说.先讲一下设计.大体上一共分为3个场景.场景以下是Layer ...

  4. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

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

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

  6. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  7. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)

    最近接触过几个版本的cocos2dx,决定每个大变动的版本都尝试一下.本实例模仿微信5.0版本中的飞机大战游戏,如图: 一.工具 1.素材:飞机大战的素材(图片.声音等)来自于网络 2.引擎:coco ...

  8. Cocos2d-x飞机大战教程笔记

    咳咳~跟着大神的教程学做Cocos2d-x的飞机大战...鉴于我是那种跟着教程都会出非常多错的人,所以还是一路跟着做些笔记比較好.并且因为是用课余时间,所以仅仅能断断续续地做,写下来也好让自己别忘记~ ...

  9. js实例--飞机大战

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

随机推荐

  1. 【知识总结】线性筛_杜教筛_Min25筛

    首先感谢又强又嘴又可爱脸还筋道的国家集训队(Upd: WC2019 进候选队,CTS2019 不幸 rk6 退队)神仙瓜 ( jumpmelon ) 给我讲解这三种筛法~~ 由于博主的鸽子属性,这篇博 ...

  2. ios cocos2d-x 多点触摸

    需要在 AppController.mm文件中添加一句多点触摸支持: [_view setMultipleTouchEnabled:true];

  3. [转]自适应网页设计(Responsive Web Design)

    本文转自:http://www.ruanyifeng.com/blog/2012/05/responsive_web_design.html 作者: 阮一峰 日期: 2012年5月 1日 随着3G的普 ...

  4. MVC系列学习(十一)-客户端的验证

    1.通过一个实例,来了解MVC中强大的验证功能 1.1新建一个 [基本] 的mvc项目,因为要用到验证的js,然后在一个视图中写上一下代码,以及Model中的代码如下 [注]在调用html.EditF ...

  5. struts2.1.6存在中文乱码的bug

    如题,后续版本中已解决:可以通过添加filter的方式解决.

  6. 既可以输入也可以选择的input框

    datalist 是h5中既可以选择也可以输入的属性 具体代码如下 <input list="datalist"/><datalist id="data ...

  7. HTML和CSS网页开发基础

    一 HTML文档结构 HTML文档结构:<html>.<head>.<title>.<body>构成HTML页面中最基本的元素. HTML常用标记:1. ...

  8. 六时车主 App 隐私政策

    六时车主 App 隐私政策   本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义 ...

  9. 【sqli-labs】 less48 GET -Error based -Blind -Numeric -Order By Clause(GET型基于盲注的整型Order By从句注入)

    图片还是47...访问的的确是48 这个是基于bool的盲注 http://192.168.136.128/sqli-labs-master/Less-48/?sort=1 and sleep(0.1 ...

  10. 运维是做什么的?史上最全互联网Linux工作规划!十分钟找到linux运维工程师职业方向!

    首先祝贺你选择学习Linux,你可能即将踏上Linux的工作之旅,出发之前,让我带你来看一看关于Linux和Linux运维的一切. Linux因其高效率.易于裁剪.应用广等优势,成为了当今中高端服务器 ...