大佬教程收集整理的这篇文章主要介绍了【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
489_0@
敌方飞机应该不定时的出现,有自己的生命周期、运动轨迹。这个类用来管理敌机的产生、移动、爆炸、销毁等。
@H_
489_0@
@H_
489_0@
敌机管理类主要函数如下
@H_
489_0@
@H_
489_0@
@H_
262_22@ //绑定控制器(更新分数)
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* pEnemySprit
E);
// 移除敌机pNode
void removeEnemy(Node *pNod
E);
@H_
489_0@
其成员变量如下
@H_
262_22@Vector<Enemy*> vecEnemy;// 敌机容器,用于遍历碰撞问题
Controller* m_controlLayer; //控制器
float m_fSpeed; //添加敌机速度
float m_fEnemy1;
float m_fEnemy2;
float m_fEnemy3;
float m_fEnemy4;
@H_
489_0@
敌机产生后,要先存储在容器中,通过容器来进行与子弹、我方飞机的碰撞检测,之后统一销毁。
@H_
489_0@
@H_
489_0@
还有就是,因为分数是要存储在数据库中的,所以我们用一个控制器来管理分数。对于我方飞机的触摸移动,也可以用控制器来控制,由于本游戏中的我方飞机操作简单,代码就嵌在了我方飞机类中。(⊙o⊙)…扯远了,先介绍敌机管理类的实现,再讲控制器。
@H_
489_0@
@H_
489_0@
@H_
262_22@bool Enem
ymanager::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::ge
Tinstance()->getSpriteFrameByName(
blowUpName->getC
String()
);
vecTem
p.push
BACk(tempBlowU
p);
}
Animation* pAnimation1 = Animation::createWithSpriteFrames(vecTemp,0.1f
);
// 添加到AnimationCache,并且命名为Enemy1Blowup
AnimationCache::ge
Tinstance()->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::ge
Tinstance()->getSpriteFrameByName(
blowUpName->getC
String()
);
vecTem
p.push
BACk(tempBlowU
p);
}
Animation *pAnimation2 = Animation::createWithSpriteFrames(vecTemp,0.1f
);
AnimationCache::ge
Tinstance()->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::ge
Tinstance()->getSpriteFrameByName(
blowUpName->getC
String()
);
vecTem
p.push
BACk(tempBlowU
p);
}
Animation *pAnimation3 = Animation::createWithSpriteFrames(vecTemp,0.1f
);
AnimationCache::ge
Tinstance()->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::ge
Tinstance()->getSpriteFrameByName(
blowUpName->getC
String()
);
vecTem
p.push
BACk(tempBlowU
p);
}
Animation *pAnimation4 = Animation::createWithSpriteFrames(vecTemp,0.1f
);
AnimationCache::ge
Tinstance()->addAnimation(pAnimation4,"Enemy4Blowup"
);
//根据当前分数来设定添加各种敌机的速度
this->
schedule(
schedule_
SELEctor(Enem
ymanager::addSpeed),0.1f
);
return true;
}
//绑定控制器(更新分数)
void Enem
ymanager::bindController(Controller* controller)
{
this->m_controlLayer = controller;
m_controlLayer->retain(
);
}
//根据分数决定添加敌机速度
void Enem
ymanager::addSpeed(float dt)
{
m_fSpeed = m_controlLayer->getSaveData()->getScore() / 1000 + 1;
this->
schedule(
schedule_
SELEctor(Enem
ymanager::addEnemy1),m_fEnemy1 / m_fSpeed
); // 每1
秒出现一架敌机1
this->
schedule(
schedule_
SELEctor(Enem
ymanager::addEnemy2),m_fEnemy2 / m_fSpeed
);
this->
schedule(
schedule_
SELEctor(Enem
ymanager::addEnemy3),m_fEnemy3 / m_fSpeed
);
this->
schedule(
schedule_
SELEctor(Enem
ymanager::addEnemy4),m_fEnemy4 / m_fSpeed
);
}
void Enem
ymanager::addEnemy1(float dt)
{
Size size = Director::ge
Tinstance()->getVisibleSize(
);
Enemy *pEnemySprite = Enemy::create(
);
pEnemySprite->setEnemyByType(Enemy1
);
pEnemySprite->setTag(Enemy1
);
this->addChild(pEnemySprit
E);
vecEnemy.push
BACk(pEnemySprit
E);
// 设置运动轨迹 以及到终点时调用的函数
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_CALL
BACK_1(Enem
ymanager:
:removeEnemy,this)
);
Sequence* sequence = Sequence::create(actionMove,actionDone,
null);
pEnemySprite->runAction(sequenc
E);
//根据分数改变敌机数量
}
void Enem
ymanager::addEnemy2(float dt)
{
Size size = Director::ge
Tinstance()->getVisibleSize(
);
Enemy *pEnemySprite = Enemy::create(
);
pEnemySprite->setEnemyByType(Enemy2
);
pEnemySprite->setTag(Enemy2
);
this->addChild(pEnemySprit
E);
vecEnemy.push
BACk(pEnemySprit
E);
// 设置运动轨迹 以及到终点时调用的函数
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,
null);
pEnemySprite->runAction(sequenc
E);
}
void Enem
ymanager::addEnemy3(float dt)
{
Size size = Director::ge
Tinstance()->getVisibleSize(
);
Enemy *pEnemySprite = Enemy::create(
);
pEnemySprite->setEnemyByType(Enemy3
);
pEnemySprite->setTag(Enemy3
);
this->addChild(pEnemySprit
E);
vecEnemy.push
BACk(pEnemySprit
E);
// 设置运动轨迹 以及到终点时调用的函数
ccBezierConfig m_bezier;
m_bezier.controlPoint_1 = ccp(60,550
);
m_bezier.controlPoint_2 = ccp(100,700
);
auto actionMove = BezierTo::create(6.0f,
null);
pEnemySprite->runAction(sequenc
E);
}
// 添加敌机4
void Enem
ymanager::addEnemy4(float dt)
{
Enemy *pEnemySprite = Enemy::create(
);
pEnemySprite->setEnemyByType(Enemy4
);
pEnemySprite->setTag(Enemy4
);
this->addChild(pEnemySprit
E);
vecEnemy.push
BACk(pEnemySprit
E);
// 设置运动轨迹 以及到终点时调用的函数
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,this)
);
// 按顺序执行 敌机飞到边缘,敌机移动结束
Sequence* sequence = Sequence::create(actionMove,
null);
pEnemySprite->runAction(sequenc
E);
}
void Enem
ymanager:
:removeEnemy(Node *pNod
E)
{
Enemy* enemy = (Enemy*)pNode;
if (enemy
!= NULL)
{
this->removeChild(enemy,tru
E);
vecEnemy.eraseOb
ject(enemy
);
}
}
void Enem
ymanager::blowupEnemy(Enemy* pEnemySprit
E)
{
auto saveData = m_controlLayer->getSaveData(
);
Animation *pAnimation = NULL;
if (Enemy1 == pEnemySprite->getTag())
{
// 之前缓存的爆炸动作
pAnimation = AnimationCache::ge
Tinstance()->getAnimation("Enemy1Blowup"
);
if (CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->is
BACkgroundMusicPlaying())
{
}
if (CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->is
BACkgroundMusicPlaying())
{
CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->playEffect("sound/enemy1_down.wav"
);
}
saveData->setScore(saveData->getScore() + ENEMY1_
score);
}
else if (Enemy2 == pEnemySprite->getTag())
{
pAnimation = AnimationCache::ge
Tinstance()->getAnimation("Enemy2Blowup"
);
if (CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->is
BACkgroundMusicPlaying())
{
CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->playEffect("sound/enemy2_down.wav"
);
}
saveData->setScore(saveData->getScore() + ENEMY2_
score);
}
else if (Enemy3 == pEnemySprite->getTag())
{
pAnimation = AnimationCache::ge
Tinstance()->getAnimation("Enemy3Blowup"
);
if (CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->is
BACkgroundMusicPlaying())
{
CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->playEffect("sound/enemy3_down.wav"
);
}
saveData->setScore(saveData->getScore() + ENEMY3_
score);
}
else if (Enemy4 == pEnemySprite->getTag())
{
pAnimation = AnimationCache::ge
Tinstance()->getAnimation("Enemy4Blowup"
);
if (CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->is
BACkgroundMusicPlaying())
{
CocosDenshion::SimpleAudio
ENGIne::ge
Tinstance()->playEffect("sound/enemy4_down.wav"
);
}
saveData->setScore(saveData->getScore() + ENEMY4_
score);
}
else
{
return;
}
Animate *pAnimate = Animate::create(pAnimation
);
// 爆炸完,要移除敌机
auto pActionDone = CallFuncN::create(CC_CALL
BACK_0(Enem
ymanager:
:removeEnemy,this,pEnemySprit
E));
Sequence* pSequence = Sequence::create(pAnimate,pActionDone,
null);
pEnemySprite->getSprite()->runAction(pSequenc
E);
} 每种类型的敌机的爆炸代码比较短,直接在init()函数中进行初始化。为了使游戏难度不断增加,会根据分数来改变添加敌机的速度。敌机的运动轨迹大同小异,不过贝塞尔曲线看起来确实挺不错的。
大佬总结
以上是大佬教程为你收集整理的【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理全部内容,希望文章能够帮你解决【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。