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

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

	//绑定控制器(更新分数)
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. Python 批量处理特定格式文件

    #批量对文件夹下的'.mat'进行处理 def file_name(file_dir,suff): L=[] for root, dirs, files in os.walk(file_dir): f ...

  2. 路飞学城Python-Day9(practise)

    def save(): with open('practise_4', 'w+', encoding='utf-8') as f: for i in user_list: info = str(i) ...

  3. org.apache.ibatis.binding.BindingException: Parameter ‘brOrderNo’ not found. Available parameters ar

    最近使用 mybatis 写项目的时候遇到报错:org.apache.ibatis.binding.BindingException: Parameter 'brOrderNo' not found. ...

  4. 紫书 习题 11-4 UVa 1660 (网络流拆点法)

    这道题改了两天-- 因为这道题和节点有关, 所以就用拆点法解决节点的容量问题. 节点拆成两个点, 连一条弧容量为1, 表示只能经过一次. 然后图中的弧容量无限. 然后求最小割, 即最大流, 即为答案. ...

  5. 题解 P3413 【SAC#1 - 萌数】

    这道题刚开始正向思维,然后处理重复的时候咕咕了. 参考了@巨型方块 大佬的题解后AC了,在这里就说几个我觉得比较重要或是容易被忽略的点,然后补充一些跳过的证明. 这道题的状态可以设为$dp[i][j] ...

  6. 【图灵杯 F】一道简单的递推题(矩阵快速幂,乘法模板)

    Description 存在如下递推式: F(n+1)=A1*F(n)+A2*F(n-1)+-+An*F(1) F(n+2)=A1*F(n+1)+A2*F(n)+-+An*F(2) - 求第K项的值对 ...

  7. E-UTRA channel bandwidths per operating band (36.101)

    E-UTRA channel bandwidths per operating band (36.101) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/ ...

  8. leetCode(38):Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  9. Pleasant sheep and big big wolf

    pid=3046">点击打开链接 题目:在一个N * M 的矩阵草原上,分布着羊和狼.每一个格子仅仅能存在0或1仅仅动物.如今要用栅栏将全部的狼和羊分开.问怎么放,栅栏数放的最少,求出 ...

  10. oracle 存储过程定义及调试,并终于被C# 调用 代码

    C# 调用存储过程 參考了非常多文章,写了例如以下文字,算是分享吧 目的:更改积分,并作一定校验 一.一般的调试方法: 方法一:带返回out參数,必须定义变量 myresult DECLARE myr ...