Cocos2d-x 3.0-《微信飞机大战》实现

前端之家收集整理的这篇文章主要介绍了Cocos2d-x 3.0-《微信飞机大战》实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文介绍一款纵版射击游戏的实现,开发环境:

win7

vs2012

cocos2d-x3.0final

android adt

android ndk r9

首先看下最后的效果

(图1,微信飞机大战运行效果)

源码下载地址:http://download.csdn.net/detail/sdhjob/7513863

一、游戏资源准备@H_502_20@

menu.png

首页菜单背景

about.png

关于界面

help.png

帮助界面

background3.png

游戏场景的

end.png
bullet.pngaaa.pngccc.png 子弹和敌机文件

爆炸效果

(被CSDN的博客加上水印,就这样了,大家还是下源码吧)

二、Cocos2d-x3.0项目创建和VS2012编译@H_502_20@

2.1进入命令提示符输入:@H_502_20@

cocos new -p com.xdl.game -d c:/users/administrator/desktop/game2014 -l cpp planegame

2.2 然后进入桌面/@H_502_20@game2014/planegame/proj.win32

2.3使用vs2012打开@H_502_20@

planegame.sln

2.4 按F5编译运行项目@H_502_20@,将会出现HelloWorld的界面

2.5.把所有的资源拷贝到@H_502_20@ 桌面/game2014/planegame/Resources目录下(处理图片还有3个声音文件

三、场景跳转和主菜单实现@H_502_20@

3.1.修改HelloWorldScene,在init方法添加3个菜单条目:@H_502_20@

auto@H_502_20@ gameItem=MenuItemFont::create("StartGame"@H_502_20@,CC_CALLBACK_1(HelloWorld::menuCloseCallback,this@H_502_20@));

@H_502_20@ auto@H_502_20@ helpItem=MenuItemFont::create("Help"@H_502_20@,this@H_502_20@));

auto@H_502_20@ aboutItem=MenuItemFont::create("About"@H_502_20@,this@H_502_20@));

@H_502_20@ gameItem->setPosition(Point(origin.x + visibleSize.width/2@H_502_20@ - closeItem->getContentSize().width/2@H_502_20@,200@H_502_20@ ));

@H_502_20@ helpItem->setPosition(Point(origin.x + visibleSize.width/2@H_502_20@ - closeItem->getContentSize().width/2@H_502_20@,150@H_502_20@ ));

aboutItem->setPosition(Point(origin.x + visibleSize.width/2@H_502_20@ - closeItem->getContentSize().width/2@H_502_20@,100@H_502_20@ ));

@H_502_20@gameItem->setColor(Color3B::BLACK);

@H_502_20@helpItem->setColor(Color3B::BLACK);

@H_502_20@aboutItem->setColor(Color3B::BLACK);

@H_502_20@gameItem->setTag(11@H_502_20@);

@H_502_20@helpItem->setTag(12@H_502_20@);

@H_502_20@aboutItem->setTag(13@H_502_20@);

3.2 修改菜单的回调方法MenuCallBack@H_502_20@

void@H_502_20@ HelloWorld::menuCloseCallback(Ref* pSender)

{ MenuItem * nowItem=(MenuItem *)pSender;

SimpleAudioEngine::getInstance()->playEffect("select.wav"@H_502_20@); //播放音乐

switch@H_502_20@(nowItem->getTag())

{

case@H_502_20@ 10@H_502_20@:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)

@H_502_20@ MessageBox(@H_502_20@"You pressed the close button. Windows Store Apps do not implement a close button.",@H_502_20@"Alert");@H_502_20@

return@H_502_20@;

#endif

Director::getInstance()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

@H_502_20@exit(0@H_502_20@);

@H_502_20@#endif

@H_502_20@break;@H_502_20@

@H_502_20@case@H_502_20@@H_502_20@11@H_502_20@:@H_502_20@//game

@H_502_20@ Director::getInstance()->replaceScene(GameScene::createScene());

@H_502_20@ @H_502_20@break;@H_502_20@

@H_502_20@case@H_502_20@@H_502_20@12@H_502_20@:@H_502_20@//help

@H_502_20@ Director::getInstance()->replaceScene( TransitionFlipY::create(1@H_502_20@,HelpScene::createScene()));

@H_502_20@ @H_502_20@break;@H_502_20@

@H_502_20@case@H_502_20@@H_502_20@13@H_502_20@:@H_502_20@//about

@H_502_20@ Director::getInstance()->replaceScene( TransitionFlipY::create(1@H_502_20@,AboutScene::createScene()));

@H_502_20@ @H_502_20@break;@H_502_20@

}

}

这样通过导演对象实现场景跳转

3.3 在帮助,关于场景实现跳转回来@H_502_20@

需要在项目中添加3个.h文件和3个.cpp文件,保存到Classes目录下(注意目录,不要保存错了)

HelpScene.h

HelpScene.cpp

GameScene.h

GameScene.cpp

AboutScene.h

AboutScene.cpp

若想在帮助和关于场景跳转回来需要加入触摸消息处理,见HelpScene的init方法

bool@H_502_20@ HelpScene::init(){

@H_502_20@if@H_502_20@(!Layer::init())

@H_502_20@{

@H_502_20@@H_502_20@return @H_502_20@ false;@H_502_20@

@H_502_20@}

@H_502_20@auto@H_502_20@ spbk=Sprite::create("help.png"@H_502_20@);

@H_502_20@spbk->setPosition(Point::ZERO);

@H_502_20@spbk->setAnchorPoint(Point::ZERO);

@H_502_20@this@H_502_20@->addChild(spbk);

@H_502_20@EventListenerTouchOneByOne * touch=EventListenerTouchOneByOne::create();

@H_502_20@touch->onTouchBegan=[](Touch * touch,Event * event){

@H_502_20@return @H_502_20@true;@H_502_20@

@H_502_20@};

@H_502_20@touch->onTouchMoved=[](Touch * touch,Event * event){

@H_502_20@@H_502_20@Director::getInstance()->replaceScene( HelloWorld::createScene());

@H_502_20@};

@H_502_20@_eventDispatcher->addEventListenerWithSceneGraPHPriority(touch,this@H_502_20@);

@H_502_20@return @H_502_20@true;@H_502_20@

}

四、游戏场景背景滚动@H_502_20@

4.1首先在GameScene的init方法添加背景层,代码如下:@H_502_20@

auto@H_502_20@ spbk=Sprite::create("background4.png"@H_502_20@);

@H_502_20@spbk->setAnchorPoint(Point::ZERO);

@H_502_20@spbk->setPosition(Point::ZERO);

@H_502_20@this@H_502_20@->addChild(spbk);

@H_502_20@spbk->setTag(10@H_502_20@);

@H_502_20@auto@H_502_20@ spbk02=Sprite::create("background4.png"@H_502_20@);

@H_502_20@spbk02->setAnchorPoint(Point::ZERO);

@H_502_20@spbk02->setPosition(Point::ZERO);

@H_502_20@spbk02->setPositionY(spbk->getPositionY()+680@H_502_20@);

@H_502_20@this@H_502_20@->addChild(spbk02);

@H_502_20@spbk02->setTag(11@H_502_20@);

为什么要添加2遍呢?因为要实现循环的贴图效果

4.2 在init方法计划任务@H_502_20@

this@H_502_20@->schedule(schedule_selector(GameScene::moveBackground),0.01);@H_502_20@

4.3 处理计划任务@H_502_20@

void@H_502_20@ GameScene::moveBackground(float@H_502_20@ t)

{

@H_502_20@auto@H_502_20@ spbk=this@H_502_20@->getChildByTag(10@H_502_20@);

@H_502_20@auto@H_502_20@ spbk02=this@H_502_20@->getChildByTag(11@H_502_20@);

@H_502_20@spbk->setPositionY(spbk->getPositionY()-1@H_502_20@);

@H_502_20@if@H_502_20@(spbk->getPositionY()<-680@H_502_20@)

@H_502_20@{

@H_502_20@@H_502_20@spbk->setPositionY(0@H_502_20@);

@H_502_20@}

@H_502_20@spbk02->setPositionY(spbk->getPositionY()+680@H_502_20@);

}

这样就形成了循环贴图的效果,游戏游戏是横版的,还有将这种循环贴图通过多层实现场景纵深效果(近处图层移动快,远处移动慢)

当背景相对屏幕向下移动,飞机相对屏幕不懂,但飞机相对背景则向上飞行(好多游戏的主角其实一直在屏幕中间)

五、飞机动画和触摸控制@H_502_20@

5.1 在init方法创建飞机动画@H_502_20@

auto@H_502_20@ spPlane=Sprite::create();

@H_502_20@spPlane->setTag(110@H_502_20@);

@H_502_20@spPlane->setPosition(Point(160@H_502_20@,240@H_502_20@));

@H_502_20@this@H_502_20@->addChild(spPlane);

@H_502_20@Vector<SpriteFrame*> allframe;//保存动画的每一帧@H_502_20@

@H_502_20@for@H_502_20@(int@H_502_20@ i=0@H_502_20@;i<4@H_502_20@;i++)

@H_502_20@{

@H_502_20@@H_502_20@SpriteFrame * sf=SpriteFrame::create("player.png"@H_502_20@,Rect(i*47@H_502_20@,0@H_502_20@,47@H_502_20@,56@H_502_20@));

@H_502_20@@H_502_20@allframe.pushBack(sf);

@H_502_20@}

@H_502_20@Animation * ani=Animation::createWithSpriteFrames(allframe,0.1@H_502_20@);

@H_502_20@spPlane->runAction(RepeatForever::create(Animate::create(ani)));

5.2 通过触摸控制飞机移动@H_502_20@

EventListenerTouchOneByOne * event=EventListenerTouchOneByOne::create();

@H_502_20@event->setSwallowTouches(true@H_502_20@);

@H_502_20@event->onTouchBegan=CC_CALLBACK_2(GameScene::onTouchBegan,this@H_502_20@);

@H_502_20@event->onTouchMoved=CC_CALLBACK_2(GameScene::onTouchMoved,this@H_502_20@);

@H_502_20@event->onTouchEnded=CC_CALLBACK_2(GameScene::onTouchEnded,this@H_502_20@);

@H_502_20@_eventDispatcher->addEventListenerWithSceneGraPHPriority(event,this@H_502_20@);

@H_502_20@

-------在GameScene中添加以下方法

bool@H_502_20@ GameScene::onTouchBegan(Touch *touch,Event *unused_event){

@H_502_20@px=touch->getLocation().x;

@H_502_20@py=touch->getLocation().y;

@H_502_20@return @H_502_20@true;@H_502_20@

}

void@H_502_20@ GameScene::onTouchMoved(Touch *touch,Event *unused_event){

@H_502_20@int@H_502_20@ mx=(touch->getLocation().x-px);

int@H_502_20@ my=(touch->getLocation().y-py);

@H_502_20@auto@H_502_20@ spPlane=this@H_502_20@->getChildByTag(110@H_502_20@);

@H_502_20@spPlane->runAction(MoveBy::create(0@H_502_20@,Point(mx,my)));

@H_502_20@px=touch->getLocation().x;

@H_502_20@py=touch->getLocation().y;

}

void@H_502_20@ GameScene::onTouchEnded(Touch *touch,Event *unused_event){

}

这样就实现了在屏幕滑动改变飞机坐标。

六、子弹发射@H_502_20@

6.1 在GameScene中添加成员Vector用来保存所有的子弹层@H_502_20@

Vector<Sprite *> allBullet;

6.2 计划任务,定时产生子弹和移动子弹@H_502_20@

this@H_502_20@->schedule(schedule_selector(GameScene::newBullet),0.5@H_502_20@);

@H_502_20@this@H_502_20@->schedule(schedule_selector(GameScene::moveBullet),0.01@H_502_20@

6.3 实现产生子弹的方法和移动子弹的方法@H_502_20@

void@H_502_20@ GameScene::newBullet(float@H_502_20@ t){

@H_502_20@auto@H_502_20@ spPlane=this@H_502_20@->getChildByTag(110@H_502_20@);

@H_502_20@Sprite * bullet=Sprite::create("bullet3.png"@H_502_20@);

@H_502_20@bullet->setPosition(spPlane->getPosition());

@H_502_20@this@H_502_20@->addChild(bullet);

@H_502_20@this@H_502_20@->allBullet.pushBack(bullet);

}

void@H_502_20@ GameScene::moveBullet(float@H_502_20@ t){

@H_502_20@

for@H_502_20@(int@H_502_20@ i=0@H_502_20@;i<allBullet.size();i++)

@H_502_20@{ auto@H_502_20@ nowbullet=allBullet.at(i);

@H_502_20@@H_502_20@nowbullet->setPositionY(nowbullet->getPositionY()+3@H_502_20@);

@H_502_20@@H_502_20@if@H_502_20@(nowbullet->getPositionY()>Director::getInstance()->getWinSize().height)

@H_502_20@@H_502_20@{

@H_502_20@@H_502_20@@H_502_20@nowbullet->removeFromParent();

@H_502_20@@H_502_20@@H_502_20@allBullet.eraSEObject(nowbullet);

@H_502_20@@H_502_20@@H_502_20@i--;

@H_502_20@@H_502_20@}

@H_502_20@}

}

七、敌机实现@H_502_20@

敌机实现与子弹实现类似,只不过一个是向上飞,一个是向下飞。

7.1在GameScene中添加成员Vector用来保存所有的子弹层@H_502_20@

Vector<Sprite *> allEnemy;

7.2 添加产生敌机的任务@H_502_20@

this@H_502_20@->schedule(schedule_selector(GameScene::newEnemy),0.5@H_502_20@);

@H_502_20@this@H_502_20@->schedule(schedule_selector(GameScene::moveEnemy),0.01@H_502_20@)

7.3 实现敌机任务方法,这里产生2种不同类型的敌机@H_502_20@

void@H_502_20@ GameScene::newEnemy(float@H_502_20@ t){

@H_502_20@Sprite * enemy=nullptr@H_502_20@;

@H_502_20@int@H_502_20@ num=rand()%10@H_502_20@;//随机数0-9

@H_502_20@if@H_502_20@(num>=3@H_502_20@)

@H_502_20@{

@H_502_20@ enemy=Sprite::create("aaa.png"@H_502_20@);

@H_502_20@@H_502_20@enemy->setTag(1000@H_502_20@);

@H_502_20@}

@H_502_20@else

@H_502_20@{ enemy=Sprite::create("ccc.png"@H_502_20@);

@H_502_20@ enemy->setTag(2000@H_502_20@);

@H_502_20@}

@H_502_20@enemy->setPosition(Point(rand()%300@H_502_20@+10@H_502_20@,500@H_502_20@));

@H_502_20@this@H_502_20@->addChild(enemy);

@H_502_20@this@H_502_20@->allEnemy.pushBack(enemy);

}

void@H_502_20@ GameScene::moveEnemy(float@H_502_20@ t){

@H_502_20@

@H_502_20@for@H_502_20@(int@H_502_20@ i=0@H_502_20@;i<allEnemy.size();i++)

@H_502_20@{ auto@H_502_20@ nowenemy=allEnemy.at(i);

@H_502_20@@H_502_20@nowenemy->setPositionY(nowenemy->getPositionY()-3@H_502_20@);

@H_502_20@@H_502_20@if@H_502_20@(nowenemy->getPositionY()<0@H_502_20@)

@H_502_20@@H_502_20@{

@H_502_20@@H_502_20@@H_502_20@nowenemy->removeFromParent();

@H_502_20@@H_502_20@@H_502_20@allEnemy.eraSEObject(nowenemy);

@H_502_20@@H_502_20@@H_502_20@i--;

@H_502_20@@H_502_20@}

@H_502_20@}

}

八、碰撞检测和加分@H_502_20@

8.1 添加和引擎主线程fps一致的任务处理方法update@H_502_20@

this@H_502_20@->scheduleUpdate();

8.2 实现碰撞检测游戏逻辑@H_502_20@

void@H_502_20@ GameScene::update(float@H_502_20@ t){

@H_502_20@

auto@H_502_20@ spPlane=this@H_502_20@->getChildByTag(110@H_502_20@);

@H_502_20@Rect rp(spPlane->getPositionX(),spPlane->getPositionY(),47@H_502_20@,56@H_502_20@);

@H_502_20@for@H_502_20@(int@H_502_20@ i=0@H_502_20@;i<allEnemy.size();i++)

@H_502_20@{ auto@H_502_20@ nowenemy=allEnemy.at(i);

@H_502_20@ Rect er(nowenemy->getPositionX(),nowenemy->getPositionY(),40@H_502_20@,50@H_502_20@);

@H_502_20@if@H_502_20@(rp.intersectsRect(er))

@H_502_20@@H_502_20@{ //爆炸

@H_502_20@@H_502_20@@H_502_20@ newBomb(spPlane->getPositionX(),spPlane->getPositionY());

@H_502_20@@H_502_20@ @H_502_20@//移除敌机

nowenemy->removeFromParent();

@H_502_20@@H_502_20@@H_502_20@ allEnemy.eraSEObject(nowenemy);

@H_502_20@@H_502_20@@H_502_20@ i--;

@H_502_20@@H_502_20@@H_502_20@ @H_502_20@//播放音乐

@H_502_20@@H_502_20@@H_502_20@ SimpleAudioEngine::getInstance()->playEffect("explo.wav"@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@ @H_502_20@//停止所有任务和动作

@H_502_20@@H_502_20@@H_502_20@ @H_502_20@//Director::getInstance()->getActionManager()->pauseAllRunningActions();

@H_502_20@@H_502_20@@H_502_20@ this@H_502_20@->pauseSchedulerAndActions();

@H_502_20@@H_502_20@@H_502_20@ auto@H_502_20@ spover=Sprite::create("end.png"@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@ spover->setPosition(Point::ZERO);

@H_502_20@@H_502_20@@H_502_20@ spover->setAnchorPoint(Point::ZERO);

@H_502_20@@H_502_20@@H_502_20@ this@H_502_20@->addChild(spover);

@H_502_20@@H_502_20@@H_502_20@ auto@H_502_20@ act=Sequence::create(

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ DelayTime::create(2@H_502_20@),//等待2秒

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ CallFunc::create(this@H_502_20@,callfunc_selector(GameScene::jumpToMenu)),//执行跳转方法

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ NULL@H_502_20@

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ );

@H_502_20@@H_502_20@@H_502_20@ this@H_502_20@->runAction(act);

@H_502_20@@H_502_20@}

//敌机和子弹碰撞检测

@H_502_20@ for@H_502_20@(int@H_502_20@ j=0@H_502_20@;j<allBullet.size();j++)

@H_502_20@ { auto@H_502_20@ nowbullet=allBullet.at(j);

@H_502_20@ Rect br(nowbullet->getPositionX(),nowbullet->getPositionY(),20@H_502_20@,20@H_502_20@);

@H_502_20@@H_502_20@ if@H_502_20@(er.intersectsRect(br))

@H_502_20@@H_502_20@ {@H_502_20@//修改分数

@H_502_20@@H_502_20@@H_502_20@ Label * labscore=(Label*)this@H_502_20@->getChildByTag(120@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@ score+=nowenemy->getTag();

@H_502_20@@H_502_20@@H_502_20@ @H_502_20@ //爆炸效果

@H_502_20@@H_502_20@@H_502_20@ newBomb(nowbullet->getPositionX(),nowbullet->getPositionY());

@H_502_20@@H_502_20@@H_502_20@@H_502_20@@H_502_20@//粒子效果

@H_502_20@@H_502_20@@H_502_20@@H_502_20@auto@H_502_20@ ps=ParticleSystemQuad::create("bomb.plist"@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ps->setPosition(Point(nowbullet->getPositionX(),nowbullet->getPositionY()));

@H_502_20@@H_502_20@@H_502_20@@H_502_20@this@H_502_20@->addChild(ps);

@H_502_20@@H_502_20@@H_502_20@ labscore->setString(String::createWithFormat("score:%d"@H_502_20@,score)->_string);

@H_502_20@@H_502_20@@H_502_20@ @H_502_20@//移除子弹层

@H_502_20@@H_502_20@@H_502_20@ nowbullet->removeFromParent();

@H_502_20@@H_502_20@@H_502_20@ allBullet.eraSEObject(nowbullet);

@H_502_20@@H_502_20@@H_502_20@ @H_502_20@//移除敌机层

@H_502_20@@H_502_20@@H_502_20@ nowenemy->removeFromParent();

@H_502_20@@H_502_20@@H_502_20@ allEnemy.eraSEObject(nowenemy);

@H_502_20@@H_502_20@@H_502_20@ i--;

@H_502_20@@H_502_20@@H_502_20@ @H_502_20@//音效

@H_502_20@@H_502_20@@H_502_20@ SimpleAudioEngine::getInstance()->playEffect("explo.wav"@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@

@H_502_20@@H_502_20@@H_502_20@ break@H_502_20@;

@H_502_20@@H_502_20@@H_502_20@ }

@H_502_20@ }

@H_502_20@}

}


@H_502_20@

九、爆炸效果@H_502_20@

当碰撞检测到,在飞机位置产生一个新的爆炸效果层,播放动画,动画播放完成自动删除自己。

void@H_502_20@ GameScene::newBomb(int@H_502_20@ x,int@H_502_20@ y)

{

@H_502_20@Vector<SpriteFrame*> allframe;

@H_502_20@for@H_502_20@(int@H_502_20@ i=0@H_502_20@;i<7@H_502_20@;i++)

@H_502_20@{

@H_502_20@@H_502_20@SpriteFrame * sf=SpriteFrame::create("boom.png"@H_502_20@,Rect(i*44@H_502_20@,0@H_502_20@,44@H_502_20@,47@H_502_20@));

@H_502_20@@H_502_20@allframe.pushBack(sf);

@H_502_20@}

@H_502_20@Animation * ani=Animation::createWithSpriteFrames(allframe,0.03@H_502_20@);

@H_502_20@auto@H_502_20@ sprite=Sprite::create();

@H_502_20@Action * act=Sequence::create(

@H_502_20@@H_502_20@Animate::create(ani),//动画@H_502_20@

@H_502_20@@H_502_20@CCCallFuncN::create(sprite,callfuncN_selector(GameScene::killMe)),//调用删除方法@H_502_20@

@H_502_20@@H_502_20@NULL@H_502_20@);

@H_502_20@this@H_502_20@->addChild(sprite);

@H_502_20@sprite->setPosition(Point(x,y));

@H_502_20@sprite->runAction(act);

@H_502_20@

}

void@H_502_20@ GameScene::killMe(Node * pSender)//自删除 pSender就是sprite这里是CallFunN,会传递节点过来@H_502_20@

{

@H_502_20@pSender->removeFromParentAndCleanup(true@H_502_20@);

}

十、粒子特效和音乐播放@H_502_20@

10.1 首先使用粒子编辑器编辑粒子文件bomb.plist(详见源码)@H_502_20@

10.2 载入粒子层@H_502_20@

auto@H_502_20@ps=ParticleSystemQuad::create("bomb.plist"@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ps->setPosition(Point(nowbullet->getPositionX(),nowbullet->getPositionY()));

@H_502_20@@H_502_20@@H_502_20@@H_502_20@this@H_502_20@->addChild(ps);

(如果粒子层也需要自删除,可以参考爆炸效果

10.3 播放音乐和音效@H_502_20@

首先要引入声音处理头文件和命名空间

#include @H_502_20@"SimpleAudioEngine.h"

using@H_502_20@ namespace@H_502_20@ CocosDenshion;

然后就可以使用1条语句来播放音乐和音效了

SimpleAudioEngine::getInstance()->playBackgroundMusic("game.mp3"@H_502_20@,true@H_502_20@); //播放背景音乐

SimpleAudioEngine::getInstance()->playEffect("explo.wav"@H_502_20@); //播放音效

十一、判定死亡@H_502_20@

在Update方法中,目前只加入了当敌机和飞机碰撞则死亡,实际游戏中可能有多有条件

如:敌机子弹和飞机碰撞、时间计数等,

void@H_502_20@GameScene::update(float@H_502_20@t){

@H_502_20@

auto@H_502_20@spPlane=this@H_502_20@->getChildByTag(110@H_502_20@);

@H_502_20@Rect rp(spPlane->getPositionX(),56@H_502_20@);

@H_502_20@for@H_502_20@(int@H_502_20@i=0@H_502_20@;i<allEnemy.size();i++)

@H_502_20@{auto@H_502_20@nowenemy=allEnemy.at(i);

@H_502_20@ Rect er(nowenemy->getPositionX(),spPlane->getPositionY());

@H_502_20@@H_502_20@ @H_502_20@//移除敌机

nowenemy->removeFromParent();

@H_502_20@@H_502_20@@H_502_20@ allEnemy.eraSEObject(nowenemy);

@H_502_20@@H_502_20@@H_502_20@ i--;

@H_502_20@@H_502_20@@H_502_20@@H_502_20@//播放音乐

@H_502_20@@H_502_20@@H_502_20@ SimpleAudioEngine::getInstance()->playEffect("explo.wav"@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@@H_502_20@//停止所有任务和动作

@H_502_20@@H_502_20@@H_502_20@@H_502_20@//Director::getInstance()->getActionManager()->pauseAllRunningActions();

@H_502_20@@H_502_20@@H_502_20@this@H_502_20@->pauseSchedulerAndActions();

@H_502_20@@H_502_20@@H_502_20@auto@H_502_20@spover=Sprite::create("end.png"@H_502_20@);

@H_502_20@@H_502_20@@H_502_20@ spover->setPosition(Point::ZERO);

@H_502_20@@H_502_20@@H_502_20@ spover->setAnchorPoint(Point::ZERO);

@H_502_20@@H_502_20@@H_502_20@this@H_502_20@->addChild(spover);

@H_502_20@@H_502_20@@H_502_20@auto@H_502_20@act=Sequence::create(

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ DelayTime::create(2@H_502_20@),//执行跳转方法

@H_502_20@@H_502_20@@H_502_20@@H_502_20@NULL@H_502_20@

@H_502_20@@H_502_20@@H_502_20@@H_502_20@ );

@H_502_20@@H_502_20@@H_502_20@this@H_502_20@->runAction(act);

@H_502_20@@H_502_20@}

。。。。。。
这里也使用了动作序列,先等待2秒,然后自动调用jumpToMenu方法跳转到主菜单

void@H_502_20@ GameScene::jumpToMenu()//ï◊™µΩ÷˜≤Àµ•@H_502_20@

{

@H_502_20@

@H_502_20@SimpleAudioEngine::getInstance()->stopBackgroundMusic();

@H_502_20@Director::getInstance()->replaceScene(HelloWorld::createScene());

}

十二、移植到Android平台@H_502_20@

12.1 eclipse导入项目@H_502_20@

在VS2012中开发好项目之后,使用adt工具(ecplise)导入项目,import

桌面\game2014\plangame\proj.android

12.2 修改jni/android.mk文件@H_502_20@

添加编译的文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/GameScene.cpp \
../../Classes/HelpScene.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/AboutScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += Box2d_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,2d)
$(call import-module,audio/android)
$(call import-module,Box2D)

12.3 进入cmd命令提示符@H_502_20@

进入项目目录

cd c:/Users/Administrator/Desktop/game2014/planegame

编译当前项目

cocos compile -p android

(等吧。。。最后会在c:/Users/Administrator/Desktop/game2014/planegame/proj.android/libs/armsabi/生成一个.so文件, 成功了!)

12.4 拷贝Cocos2d-x android库文件@H_502_20@

到 c:/Users/Administrator/Desktop/game2014/planegame/cocos/2d/platform/android/java/src/ 拷贝org文件夹到

c:/Users/Administrator/Desktop/game2014/planegame/proj.android/src 目录

在adt中刷新项目(这时候项目的错误会消除)

12.5 打包项目@H_502_20@

使用手机数据线连接电脑,开启调试模式

可以直接通过run,来把该项目安装到手机,

之后使用android打包向导打包生成apk。

猜你在找的Cocos2d-x相关文章