敌方飞机应该不定时的出现,有自己的生命周期、运动轨迹。这个类用来管理敌机的产生、移动、爆炸、销毁等。

敌机管理类主要函数例如以下

	//绑定控制器(更新分数)
void bindController(Controller* controller); //依据分数决定加入敌机速度
void addSpeed(float dt); // 加入敌机1
void addEnemy1(float dt); // 加入敌机2
void addEnemy2(float dt); // 加入敌机3
void addEnemy3(float dt); // 加入敌机4
void addEnemy4(float dt); // 敌机爆炸
void blowupEnemy(Enemy* pEnemySprite); // 移除敌机pNode
void removeEnemy(Node *pNode);

其成员变量例如以下

Vector<Enemy*> vecEnemy;// 敌机容器。用于遍历碰撞问题
Controller* m_controlLayer; //控制器
float m_fSpeed; //加入敌机速度
float m_fEnemy1;
float m_fEnemy2;
float m_fEnemy3;
float m_fEnemy4;

敌机产生后。要先存储在容器中,通过容器来进行与子弹、我方飞机的碰撞检測,之后统一销毁。

还有就是,由于分数是要存储在数据库中的。所以我们用一个控制器来管理分数。对于我方飞机的触摸移动,也能够用控制器来控制。由于本游戏中的我方飞机操作简单,代码就嵌在了我方飞机类中。

(⊙o⊙)…扯远了。先介绍敌机管理类的实现。再讲控制器。

bool EnemyManager::init()
{
if (!Layer::init())
{
return false;
}
cocos2d::Vector<SpriteFrame*> vecTemp;
vecTemp.clear(); // 敌机1爆炸
for (int i = 0; i < 4; i++)
{
auto blowUpName = __String::createWithFormat("enemy1_down%d.png", i + 1);
auto tempBlowUp = SpriteFrameCache::getInstance()->getSpriteFrameByName(
blowUpName->getCString());
vecTemp.pushBack(tempBlowUp);
} Animation* pAnimation1 = Animation::createWithSpriteFrames(vecTemp, 0.1f); // 加入到AnimationCache。而且命名为Enemy1Blowup
AnimationCache::getInstance()->addAnimation(pAnimation1, "Enemy1Blowup"); // 敌机2爆炸
vecTemp.clear();
for (int i = 0; i < 4; i++)
{
auto blowUpName = __String::createWithFormat("enemy2_down%d.png", i + 1);
auto tempBlowUp = SpriteFrameCache::getInstance()->getSpriteFrameByName(
blowUpName->getCString());
vecTemp.pushBack(tempBlowUp);
} Animation *pAnimation2 = Animation::createWithSpriteFrames(vecTemp,0.1f); AnimationCache::getInstance()->addAnimation(pAnimation2, "Enemy2Blowup"); // 敌机3爆炸
vecTemp.clear();
for (int i = 0; i < 4; i++)
{
auto blowUpName = __String::createWithFormat("enemy3_down%d.png", i + 1);
auto tempBlowUp = SpriteFrameCache::getInstance()->getSpriteFrameByName(
blowUpName->getCString());
vecTemp.pushBack(tempBlowUp);
} Animation *pAnimation3 = Animation::createWithSpriteFrames(vecTemp,0.1f); AnimationCache::getInstance()->addAnimation(pAnimation3, "Enemy3Blowup"); // 敌机4爆炸
vecTemp.clear();
for (int i = 0; i < 4; i++)
{
auto blowUpName = __String::createWithFormat("enemy4_down%d.png", i + 1);
auto tempBlowUp = SpriteFrameCache::getInstance()->getSpriteFrameByName(
blowUpName->getCString());
vecTemp.pushBack(tempBlowUp);
} Animation *pAnimation4 = Animation::createWithSpriteFrames(vecTemp, 0.1f); AnimationCache::getInstance()->addAnimation(pAnimation4, "Enemy4Blowup"); //依据当前分数来设定加入各种敌机的速度
this->schedule(schedule_selector(EnemyManager::addSpeed), 0.1f); return true;
} //绑定控制器(更新分数)
void EnemyManager::bindController(Controller* controller)
{
this->m_controlLayer = controller;
m_controlLayer->retain();
} //依据分数决定加入敌机速度
void EnemyManager::addSpeed(float dt)
{
m_fSpeed = m_controlLayer->getSaveData()->getScore() / 1000 + 1; this->schedule(schedule_selector(EnemyManager::addEnemy1), m_fEnemy1 / m_fSpeed); // 每1秒出现一架敌机1
this->schedule(schedule_selector(EnemyManager::addEnemy2), m_fEnemy2 / m_fSpeed);
this->schedule(schedule_selector(EnemyManager::addEnemy3), m_fEnemy3 / m_fSpeed);
this->schedule(schedule_selector(EnemyManager::addEnemy4), m_fEnemy4 / m_fSpeed); } void EnemyManager::addEnemy1(float dt)
{
Size size = Director::getInstance()->getVisibleSize(); Enemy *pEnemySprite = Enemy::create();
pEnemySprite->setEnemyByType(Enemy1);
pEnemySprite->setTag(Enemy1);
this->addChild(pEnemySprite);
vecEnemy.pushBack(pEnemySprite); // 设置运动轨迹 以及到终点时调用的函数
ccBezierConfig m_bezier;
m_bezier.controlPoint_1 = ccp(size.width/20, size.height*0.7);
m_bezier.controlPoint_2 = ccp(size.width/2, size.height/2);
m_bezier.endPosition = ccp(size.width*0.9, size.height*0.9);
auto actionMove = BezierTo::create(2.0f, m_bezier); auto actionDone = CallFuncN::create(CC_CALLBACK_1(EnemyManager::removeEnemy, this));
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
pEnemySprite->runAction(sequence); //依据分数改变敌机数量 } void EnemyManager::addEnemy2(float dt)
{
Size size = Director::getInstance()->getVisibleSize(); Enemy *pEnemySprite = Enemy::create();
pEnemySprite->setEnemyByType(Enemy2);
pEnemySprite->setTag(Enemy2);
this->addChild(pEnemySprite);
vecEnemy.pushBack(pEnemySprite); // 设置运动轨迹 以及到终点时调用的函数
ccBezierConfig m_bezier;
m_bezier.controlPoint_1 = ccp(40, 500);
m_bezier.controlPoint_2 = ccp(250, 400);
m_bezier.endPosition = ccp(400, 700);
auto actionMove = BezierTo::create(4.0f, m_bezier); auto actionDone = CallFuncN::create(CC_CALLBACK_1(EnemyManager::removeEnemy, this));
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
pEnemySprite->runAction(sequence);
} void EnemyManager::addEnemy3(float dt)
{
Size size = Director::getInstance()->getVisibleSize(); Enemy *pEnemySprite = Enemy::create();
pEnemySprite->setEnemyByType(Enemy3);
pEnemySprite->setTag(Enemy3);
this->addChild(pEnemySprite);
vecEnemy.pushBack(pEnemySprite); // 设置运动轨迹 以及到终点时调用的函数
ccBezierConfig m_bezier;
m_bezier.controlPoint_1 = ccp(60, 550);
m_bezier.controlPoint_2 = ccp(100, 400);
m_bezier.endPosition = ccp(400, 700);
auto actionMove = BezierTo::create(6.0f, m_bezier); auto actionDone = CallFuncN::create(CC_CALLBACK_1(EnemyManager::removeEnemy, this));
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
pEnemySprite->runAction(sequence);
} // 加入敌机4
void EnemyManager::addEnemy4(float dt)
{
Enemy *pEnemySprite = Enemy::create();
pEnemySprite->setEnemyByType(Enemy4);
pEnemySprite->setTag(Enemy4);
this->addChild(pEnemySprite);
vecEnemy.pushBack(pEnemySprite); // 设置运动轨迹 以及到终点时调用的函数
ccBezierConfig m_bezier;
m_bezier.controlPoint_1 = ccp(80, 650);
m_bezier.controlPoint_2 = ccp(350, 450);
m_bezier.endPosition = ccp(400, 700);
auto actionMove = BezierTo::create(8.0f, m_bezier); auto actionDone = CallFuncN::create(CC_CALLBACK_1(EnemyManager::removeEnemy, this)); // 按顺序运行 敌机飞到边缘。敌机移动结束
Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
pEnemySprite->runAction(sequence);
} void EnemyManager::removeEnemy(Node *pNode)
{
Enemy* enemy = (Enemy*)pNode;
if (enemy != NULL)
{
this->removeChild(enemy, true);
vecEnemy.eraseObject(enemy);
}
} void EnemyManager::blowupEnemy(Enemy* pEnemySprite)
{
auto saveData = m_controlLayer->getSaveData(); Animation *pAnimation = NULL;
if (Enemy1 == pEnemySprite->getTag())
{
// 之前缓存的爆炸动作
pAnimation = AnimationCache::getInstance()->getAnimation("Enemy1Blowup");
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
}
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/enemy1_down.wav");
}
saveData->setScore(saveData->getScore() + ENEMY1_SCORE);
}
else if (Enemy2 == pEnemySprite->getTag())
{
pAnimation = AnimationCache::getInstance()->getAnimation("Enemy2Blowup");
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/enemy2_down.wav");
}
saveData->setScore(saveData->getScore() + ENEMY2_SCORE);
}
else if (Enemy3 == pEnemySprite->getTag())
{
pAnimation = AnimationCache::getInstance()->getAnimation("Enemy3Blowup");
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/enemy3_down.wav");
}
saveData->setScore(saveData->getScore() + ENEMY3_SCORE);
}
else if (Enemy4 == pEnemySprite->getTag())
{
pAnimation = AnimationCache::getInstance()->getAnimation("Enemy4Blowup");
if (CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
{
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sound/enemy4_down.wav");
}
saveData->setScore(saveData->getScore() + ENEMY4_SCORE);
}
else
{
return;
} Animate *pAnimate = Animate::create(pAnimation); // 爆炸完。要移除敌机
auto pActionDone = CallFuncN::create(CC_CALLBACK_0(EnemyManager::removeEnemy, this, pEnemySprite));
Sequence* pSequence = Sequence::create(pAnimate, pActionDone, NULL);
pEnemySprite->getSprite()->runAction(pSequence);
}

每种类型的敌机的爆炸代码比較短,直接在init()函数中进行初始化。为了使游戏难度不断添加,会依据分数来改变加入敌机的速度。敌机的运动轨迹大同小异,只是贝塞尔曲线看起来确实挺不错的。

【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理的更多相关文章

  1. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  2. 【cocos2d-x 3.7 飞机大战】 决战南海I (三) 敌机实现

    如今来实现敌机类 敌机和我方飞机相似,具有生命值.能够发射子弹.而且有自己的运动轨迹.事实上能够为它们设计一个共同的基类,这样能够更方便扩展. 不同的敌机,应设置不同的标识.属性 // 敌机生命值 c ...

  3. Html飞机大战(八):子弹的移动和管理

    好家伙,这应该是这个小游戏最难的几个点之一了 现在我们要做出子弹射击的效果我们应该如何处理? 1.首先我们要确定几个变量和方法的关系 变量: 子弹  bullet  弹夹(用来装子弹的东西)bulle ...

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

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

  5. 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)

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

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

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

  7. cocos2dx实现经典飞机大战

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

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

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

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

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

随机推荐

  1. Springboot设置跨域的三种方式

    方式一(精细配置) 在需要跨域的整个Controller或者单个方法上添加@CrossOrigin注解 方式二(全局配置) @Configuration public class WebMvcConf ...

  2. C语言基础 (1) 操作系统介绍,linux入门

    第一天 一.操作系统 1.1.1操作系统的目标 ·方便:使计算机系统易于使用 ·有效:以更有效的方式使用计算机系统资源 ·扩展:方便用户有效开发.测试和引进新功能 1.1.2 操作系统的地位 操作系统 ...

  3. NodeJS学习笔记 (1)资源压缩-zlib(ok)

    原文: https://github.com/chyingp/nodejs-learning-guide/blob/master/README.md 自己的跟进学习: 概览 做过web性能优化的同学, ...

  4. 【BZOJ4383】[POI2015]pustynia

    题意: 建议Alt+F4百度一下 题解: 差分约束+线段树优化建图,直接按照拓扑序跑就行了 代码: #include<iostream> #include<cstring> # ...

  5. 在vue中使用的Echarts的步骤

    1.首先在项目中安装Echarts npm install echarts -g --save //安装 2.在项目中引入Echarts(在main.js中引入) import echarts fro ...

  6. linux 空间不够了 修改 /boot

    1>  查看空间多少:df -h2>  查看当期内核: uname -r3>  查找内核   rpm -qa | grep kernel4>  删除多余的内核 yum remo ...

  7. POJ 2607 Fire Station

    Fire Station Time Limit: 5000ms Memory Limit: 65536KB This problem will be judged on PKU. Original I ...

  8. C++容器(三):pair类型

    pair类型 在开始介绍关联容器之前,我们有必要了解一种与之相关的标准库类型–pair类型. 操作 含义 pair<T1, T2> p1 创建一个空的pair对象,它的两个元素分别为T1和 ...

  9. 收集整理的openstack java封装 api的第三方实现的选择

    Apache jclouds 地址:http://jclouds.apache.org/guides/openstack/ 一个开源库,java实现,支持cloudstack,openstack以及各 ...

  10. 洛谷 P1572 计算分数

    P1572 计算分数 题目描述 Csh被老妈关在家里做分数计算题,但显然他不愿意坐这么多复杂的计算.况且在家门口还有Xxq在等着他去一起看电影.为了尽快地能去陪Xxq看电影,他把剩下的计算题交给了你, ...