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

#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. SQLServer局部变量和全局变量介绍05-29学习笔记

    变量 数据在内存中存储可以变化的量叫变量.为了在内存中存储信息,用户必须指定存储信息的单元,并为了该存储单元命名, 以方便获取信息,这就是变量的功能.Transact-SQL可以使用两种变量,一种是局 ...

  2. jeecg中列表查询数据关联其他表的显示

    1.A表字段:id,name;B表字段:id,name,fid(A表外键),现查询A表和B表的所有数据并且查询条件A,B都有,在前台页面list显示 2.后台方法: @RequestMapping(p ...

  3. Codeforces 455D 分块+链表

    题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...

  4. 6.10---mybatis中两张表查询数据dao层

  5. JS高级——变量提升

    JS执行过程 1.首先是预解析:预解析过程最重要的是提升,在JavaScript代码在预解析阶段,会对以var声明的变量名,和function开头的语句块,进行提升操作 2.执行操作 全局中解析和执行 ...

  6. [Windows Server 2003] 安装网站伪静态

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:安装IIS伪静 ...

  7. Pycharm:debug调试时使用参数

    一种操作方法: 文章链接:MAC下使用Pycharm,debug调试时怎样带参数 今天在网上找了一个例子敲代码,因为我使用的是PyCharm,例子运行时需要带参数,开始不知道怎么带参数,网上搜了大半天 ...

  8. 详解HashMap数据结构实现

    HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢. HashMap是日常中非常常用的一种数据结构,我们要想深入了解学 ...

  9. C# WebKitBrowser 设置内容

    WebKit.WebKitBrowser kitBrowser = new WebKit.WebKitBrowser(); kitBrowser.Dock = DockStyle.Fill; // k ...

  10. strcmp 与 _tcscmp

    strcmp 用来比较ANSI字符串,而_tcscmp用来比较UNICODE(宽字符)的字符串.ANSI字符串中,1个英文字母为1个字节,1个中文字符为2个字节,遇到0字符表示字符串结束.而在UNIC ...