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

#include "cocos2d.h"
#include "MyPlane.h"
#include "Bullet.h"
#include "EnemyManager.h"
#include "Controller.h"
#include "BackgroundMove.h"
#include "FlowWord.h"

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

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

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

MyPlane *planeLayer;
Bullet *bulletLayer;
EnemyManager *enemyLayer;
Controller *controlLayer;

主场景的实现

TollgateOne::TollgateOne() : planeLayer(NULL), bulletLayer(NULL), enemyLayer(NULL), controlLayer(NULL)
{ }
TollgateOne::~TollgateOne()
{
_eventDispatcher->removeEventListenersForTarget(this);
} cocos2d::Scene* TollgateOne::createScene()
{
auto scene = Scene::create(); auto layer = TollgateOne::create(); scene->addChild(layer); return scene;
} bool TollgateOne::init()
{
if (!Layer::init())
{
return false;
} // 启动触摸机制
this->setTouchEnabled(true); // 背景无限滚动
auto m_back = BackgroundMove::create();
this->addChild(m_back,0); //游戏開始 飘字效果
auto dictionary = Dictionary::createWithContentsOfFile("fonts/AboutMe.xml");
auto m_flow = FlowWord::create();
m_flow->showFlowWord(
((__String *)(dictionary->objectForKey("play")))->getCString(),
Point(Director::getInstance()->getVisibleSize().width / 2+60, Director::getInstance()->getVisibleSize().height/2),
m_flow->otherFlowWord()
);
this->addChild(m_flow); //游戏更新
this->schedule(schedule_selector(TollgateOne::gameUpdate)); // 增加控制层
controlLayer = Controller::create();
this->addChild(controlLayer); // 增加飞机
planeLayer = MyPlane::create();
this->addChild(planeLayer,1); // 增加敌机和分数显示
enemyLayer = EnemyManager::create();
enemyLayer->bindController(controlLayer);
this->addChild(enemyLayer,1); // 开启子弹
bulletLayer = Bullet::create();
bulletLayer->bindEnemyManager(enemyLayer);
this->addChild(bulletLayer,1); //对返回键的响应
auto m_listener = EventListenerKeyboard::create();
m_listener->onKeyReleased = CC_CALLBACK_2(TollgateOne::onKeyReleased, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(m_listener, this); return true;
} void TollgateOne::gameUpdate(float dt)
{
bool bMoveButt = false; //子弹和敌机对碰
for (auto& eButtle : bulletLayer->vecBullet)
{
Sprite* pBullet = (Sprite*)eButtle; // 获取子弹精灵
bMoveButt = bulletCollisionEnemy(pBullet);
if (bMoveButt)
{
// 子弹删除了。无需再遍历
return;
}
} // 敌机、敌机子弹与我方飞机碰撞
enemyCollisionPlane();
} bool TollgateOne::bulletCollisionEnemy(Sprite* pBullet)
{
for (auto& eEnemy : enemyLayer->vecEnemy)
{
Enemy* pEnemySprite = (Enemy*)eEnemy; // 是否发生碰撞
if (pBullet->boundingBox().intersectsRect(pEnemySprite->getBoundingBox()))
{ // 飞机仅仅剩下一格生命值
if (1 == pEnemySprite->getLife())
{
pEnemySprite->loseLife(); // 知道为什么这里也要loselife吗?你能够试着凝视掉看看
enemyLayer->blowupEnemy(pEnemySprite);
}
else
{
pEnemySprite->loseLife();
} //删除子弹
bulletLayer->removeBullet(pBullet);
return true;
}
} return false;
} void TollgateOne::enemyCollisionPlane()
{
Sprite* pPlane = (Sprite*)planeLayer->getChildByTag(AIRPLANE);
for (auto& eEnemy : enemyLayer->vecEnemy)
{
Enemy* pEnemySprite = (Enemy*)eEnemy; // 是否发生碰撞
if (pPlane->boundingBox().intersectsRect(pEnemySprite->getBoundingBox()) && pEnemySprite->getLife() > 0)
{
if (1 == planeLayer->getAlive())
{
planeLayer->loseAlive();
controlLayer->getSaveData()->save();
this->unscheduleAllSelectors();
this->bulletLayer->StopBulletShoot();
this->planeLayer->blowUp();
Director::getInstance()->replaceScene(
TransitionMoveInT::create(0.8f, GameOver::createScene())); // 替换场景
}
else
planeLayer->loseAlive();
}
} for (auto& eEnemyBullet : bulletLayer->vecEnemyBullet)
{
Sprite* pEnemyBullet = (Sprite*)eEnemyBullet; // 获取子弹精灵 // 是否发生碰撞
if (pPlane->boundingBox().intersectsRect(pEnemyBullet->getBoundingBox()))
{
if (1 == planeLayer->getAlive())
{
planeLayer->loseAlive();
controlLayer->getSaveData()->save();
this->unscheduleAllSelectors();
this->bulletLayer->StopBulletShoot();
this->planeLayer->blowUp();
Director::getInstance()->replaceScene(
TransitionMoveInT::create(0.8f, GameOver::createScene())); // 替换场景
}
else
planeLayer->loseAlive(); bulletLayer->removeEnemyBullet(pEnemyBullet); return;
}
}
} void TollgateOne::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event)
{
if (keyCode == EventKeyboard::KeyCode::KEY_ESCAPE)
{
Director::getInstance()->replaceScene(HelloWorld::createScene());
}
}

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

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

【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. 【LeetCode】105 & 106 Construct Binary Tree from (Preorder and Inorder) || (Inorder and Postorder)Traversal

    Description: Given arrays recording 'Preorder and Inorder' Traversal (Problem 105) or  'Inorder and ...

  2. Elasticsearch之sense插件安装之后的浏览详解

    前提博客是 Elasticsearch之sense插件的安装(图文详解) 立马,可以看到 http://192.168.80.145:5601/app/sense 以后更新

  3. Linux+Apache+PHP+MySQL服务器环境配置(CentOS篇)

    1.配置php.ini vi /etc/php.ini 2.配置apache 先给需要配置的文件做个备份 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/h ...

  4. Android 6.0一个完整的native service

     上一篇博客<Android 6.0 如何添加完整的系统服务(app-framework-kernel)>http://www.cnblogs.com/hackfun/p/7418902. ...

  5. Hibernate中使用子查询

    子查询:   子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持.   如下面代码所示: List ...

  6. ASP.NET 缓存(Cache)

    ASP.NET提供了在一个ASP.NET应用程序基本上缓存信息的编程功能.该功能和Application对象相似,但它具有在ASP.NET应用程序的生命周期内动态维护缓存信息的能力.在应用程序中缓存数 ...

  7. mysql 如何用命令清除表数据,让表数据索引是从0开始呢?

    truncate MYTABLE 这样就可以了 其实这个命令就相当于删除表再建 所有的数据都还原 可以使用工具来完成这个操作 右键单击要操作的表,选择Turncale Table 执行查询语句,数据就 ...

  8. cocos自动图集

    对于图像资源,为什么要用图集,cocos官网的解释: 1.合成图集时会去除每张图片周围的空白区域,加上可以在整体上实施各种优化算法,合成图集后可以大大减少游戏包体和内存占用2.多个 Sprite 如果 ...

  9. matlab数值数据的表示方法,输出数据以及相关函数

    数据类型的分类: 1.整型 无符号整型和带符号整形 带符号整形的最大值是127 >>x=int8(129) 输出结果是x=127 >>x=unit8(129) 输出结果是x=1 ...

  10. 彩色MT9V034摄像头 Bayer转rgb FPGA实现

    1 图像bayer格式介绍 bayer格式是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像.Bayer格式是相机内部的原始数据, 一般后缀 ...