




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Cocos2d-x制作太空射击游戏在这篇教程里,我将向你展现如何利用HowtoMakeaSpaceShooteriPhoneGame里创建的工程制作一个太空游戏。这里有一个主要的区分-—这次是用跨平台的cocs2d—x开发.这就意味在教程里开发的游戏可以在你的iphone和andorid上运行.当然,再略微做修改,你可以让它在Windows、Linux或者Mac下运行。这篇教程基于我们在《HYPERLINK"http://www.cocoachina.com/gamedev/gameengine/2012/0428/4206.html"COCOS2D-X跨ANDROID&IOS平台开发入门教程PART—1》里所创建的内容.如果你还没有筹备好,那么最好先弄懂前面的工程,然后再连续。深吸一口气,我们就要开头啦!
GettingStarted第一件事情就是下载并解压HYPERLINK”http://www.raywenderlich。com/downloads/SpaceGameResources.zip"spacegameresourcesZIPfile。就像我们在之前教程里面添加两个项目里都可以使用的C++类一样,我们需要以同样的方式来添加这些资源文件使ios和andriod项目都可以引用同样的资源。我们把这些文件添加到Android工程的Resource名目下面,然后在ios项目里面引用这个名目。为了便利添加图片和其它资源到我们的工程里,我们需要把它们添加到$PROJECT_HOME\Resources名目(请记住$PROJECT_HOME是你AndriodCocosd-Xproject-samplecocos2dxandroid的位置)。然而,我们的Eclipse工程只会显示$PROJECT_HOME\android名目下的文件,所以这确实是一个问题!幸运的是这里有一个简洁的变通方案:我们在$PROJECT_HOME\Resources名目下面建立一个符号链接,指向$PROJECT_HOME\android\Resources名目,这样Eclipse就可以看到它们了。接着,打开终端,在$PROJECT_HOME\android名目下运行如下的命令:ln-s../Resources./Resources.现在拷贝文件到Resources文件夹。请注意,由于跨平台可移植性的缘由,你需要避开使用层级式的子名目。尽管子名目在iOS下运行起来很好,但是它们不肯定在Android上运行地很好。举例来说,如果你有一个Sprites.pvr。ccz文件在一个SpriteSheet子名目里,在Android里面使用CCSpriteBatchNode::bathNodeWithFile方法将会调用失败并返回一个空指针。所以,从spacegameresourcesZIPfile里面把单个的文件拷贝到Resource文件夹下去,请记得不要创建任何子名目,仅仅拷贝一个个的文件过来就可以了。在资源文件里存在一个字体的子文件夹,从字体文件夹里把全部的文件拷贝到Resources里时,直接替换就可以了。此外,在压缩文件里有个Classes子文件夹,你不必把它添加到Resources名目下,把它删除就行了。当全部的筹备工作完成后就会是下面的样子:接下来,让我们在iOS工程里引用这些文件,打开你的Xcode工程,创建一个新的Group叫做SharedResources.选择新的Group,在Inspector里点击按钮选择路径,然后把你在Android工程里的资源文件夹选择上。右键点击SharedResources组,选择添加文件,从Android文件夹里添加全部的文件。目前,你完成全部的项目配置了!增加一个太空飞船让我们试试,看是否工作!打开Classes\HelloWorldScene.h,在HelloWorld类开头加入下面代码(在已有public:行的上面)private:cocos2d::CCSpriteBatchNode*_batchNode;cocos2d::CCSprite*_ship;上面的代码创建了两个私有实例变量–一个是spritebatchnode,一个是太空飞船精灵现在切换到HelloWorldScene.cpp,在init方法里,删除从注释“2.addamenuitem”到方法最后的全部代码,加入下面代码:_batchNode=CCSpriteBatchNode::batchNodeWithFile("Sprites。pvr.ccz");this—>addChild(_batchNode);CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Sprites。plist”);_ship=CCSprite::spriteWithSpriteFrameName("SpaceFlier_sm_1.png”);CCSizewinSize=CCDirector::sharedDirector()->getWinSize();_ship—〉setPosition(ccp(winSize.width*0.1,winSize.height*0.5));_batchNode-〉addChild(_ship,1);returntrue;注意这些代码与你过去使用的Objective-C版的cocos2d格外类似。API是有很多相同的地方的,仅仅是有一些与C++的语法不同。在Android模拟器中编译运行,你应该可以看到你的船消灭在屏幕上最妙的事情是在iOS上也能运行增加视差滚动接下来,我们会加入宇宙背景,使它以视差滚动这种很酷的方式来滚动.首先,我们不得不在全部的类名前面加上cocos2d::这个名字空间,这太烦人了!所以在HelloWorldScene.h类声明前加入下面行:USING_NS_CC;接着在HelloWorld的private部分加入一些新的变量(注意我们不再需要加cocos2d前缀):CCParallaxNode*_backgroundNode;CCSprite*_spacedust1;CCSprite*_spacedust2;CCSprite*_planetsunrise;CCSprite*_galaxy;CCSprite*_spacialanomaly;CCSprite*_spacialanomaly2;然后,在HelloWorldScene.cpp的init方法中,return语句前加入下面代码://1)CreatetheCCParallaxNode_backgroundNode=CCParallaxNode::node();//1this-〉addChild(_backgroundNode,—1);//2)Createthespriteswe'lladdtotheCCParallaxNode_spacedust1=CCSprite::spriteWithFile("bg_front_spacedust。png”);_spacedust2=CCSprite::spriteWithFile("bg_front_spacedust.png");_planetsunrise=CCSprite::spriteWithFile("bg_planetsunrise。png");_galaxy=CCSprite::spriteWithFile("bg_galaxy.png");_spacialanomaly=CCSprite::spriteWithFile("bg_spacialanomaly.png");_spacialanomaly2=CCSprite::spriteWithFile(”bg_spacialanomaly2.png");//3)DeterminerelativemovementspeedsforspacedustandbackgroundCCPointdustSpeed=ccp(0.1,0.1);CCPointbgSpeed=ccp(0.05,0.05);//4)AddchildrentoCCParallaxNode_backgroundNode->addChild(_spacedust1,0,dustSpeed,ccp(0,winSize.height/2));//2_backgroundNode-〉addChild(_spacedust2,0,dustSpeed,ccp(_spacedust1-〉getContentSize().width,winSize。height/2));_backgroundNode—〉addChild(_galaxy,-1,bgSpeed,ccp(0,winSize。height*0.7));_backgroundNode—〉addChild(_planetsunrise,—1,bgSpeed,ccp(600,winSize.height*0));_backgroundNode—〉addChild(_spacialanomaly,-1,bgSpeed,ccp(900,winSize。height*0。3));_backgroundNode-〉addChild(_spacialanomaly2,—1,bgSpeed,ccp(1500,winSize.height*0。9));再一次说明,这段代码与我们的《如何使用cocos2d制作一个太空射击游戏》格外类似,只是有些小的句法变化。你可以比较一下2个教程在句法上的不同.Android模拟器中编译运行,你应该可以看到一个宇宙场景的启动同样的,也能在iphone上运行现在使背景滚动,在HelloWorldScene.h中预先声明update方法–你可以在private或public部分加入下面代码,但是既然update方法是内部使用的,所以作为一个private方法更恰当://scheduledUpdatevoidupdate(cocos2d::ccTimedt);然后在HelloWorldScene。cpp最后加入下面的方法实现voidHelloWorld::update(ccTimedt){CCPointbackgroundScrollVert=ccp(-1000,0);_backgroundNode—>setPosition(ccpAdd(_backgroundNode—>getPosition(),ccpMult(backgroundScrollVert,dt)));}最后,在init方法末尾(但是在最后的return语句前)调用scheduleUpdate方法this->scheduleUpdate();编译运行,你将会看到背景滚动!持续滚动这时,你应该注意到了背景滚出屏幕后没有循环,那么我们来修这个bug在我们的《如何使用cocos2d制作一个太空射击游戏》教程中,我们通过Objective—c的分类(category)扩展了CCParallaxNode类来实现。不幸的是,C++中是不存在分类的,所以我们需要借助继承来实现之。我们将去定义一个CCParallaxNode扩展类来扩展标准的CCParallaNode.这样做虽然不如Objective-C优雅,但是有时我们需要为软件可移植性做一些牺牲。在Xcode中,在Glassesgroup上单击右键,选择NewFile.选择iOS\CandC++\C++文件末尾,点击Next,为他命名为CCParallaxNodeExtras.cpp,存储到$PROJECT_HOME\Classes,然后点击创建。然后重复上述过程,但要选择iOS\CandC++\Header文件模板,来创建CCParallaxNodeExtras.h用下面的代码替换CCParallaxNodeExtras.h中的内容#ifndefCocos2DxFirstIosSample_CCParallaxNodeExtras_h#defineCocos2DxFirstIosSample_CCParallaxNodeExtras_h#include“cocos2d。h"USING_NS_CC;classCCParallaxNodeExtras:publicCCParallaxNode{public://NeedtoprovideourownconstructorCCParallaxNodeExtras();//justtoavoiduglylatercastandalsoforsafetystaticCCParallaxNodeExtras*node();//Facilitymethod(weexpecttohaveitsooninCOCOS2DX)voidincrementOffset(CCPointoffset,CCNode*node);};#endif这里我们为CCParallaxNode添加一个新的方法(incrementOffset),我们用它来更新parallaxnode每个child的位置。当背景移动出屏幕左端的时候我们会使用它来将背景放到屏幕的右端,来实现持续的滚动。将下面的代码替换到CCParallaxNodeExtras.cpp#include”CCParallaxNodeExtras.h"//HacktoaccessCCPointObject(whichisnotapublicclass)classCCPointObject:CCObject{CC_SYNTHESIZE(CCPoint,m_tRatio,Ratio)CC_SYNTHESIZE(CCPoint,m_tOffset,Offset)CC_SYNTHESIZE(CCNode*,m_pChild,Child)//weakref};//NeedtoprovideourownconstructorCCParallaxNodeExtras::CCParallaxNodeExtras(){CCParallaxNode::CCParallaxNode();//callparentconstructor}CCParallaxNodeExtras*CCParallaxNodeExtras::node(){returnnewCCParallaxNodeExtras();}voidCCParallaxNodeExtras::incrementOffset(CCPointoffset,CCNode*node){for(unsignedinti=0;i〈m_pParallaxArray->num;i++){CCPointObject*point=(CCPointObject*)m_pParallaxArray—〉arr[i];CCNode*curNode=point->getChild();if(curNode->isEqual(node)){point->setOffset(ccpAdd(point->getOffset(),offset));break;}}}注意,很不幸的是CCPointObject在Cocos2d中并不是公共的类,所以我们需要借住一些小手段来hack。(重定义它为我们的类,并具有相同的签名).虽然它能工作的很好,但是他的缺点是,如果CCPointObject改动了,你这里也要跟着改动,否则程序会崩溃。代码的重点是incrementOffset方法,他和《如何使用cocos2d制作一个太空射击游戏》中的实现相同,只是用了不同的语言。下一步,选择HelloWorldScene.h,在文件顶部的#include语句之后添加这些代码:#include"CCParallaxNodeExtras。h"然后像下面的代码一样,将private区域中_backgroundNode定义由CCParallaNode改为CCParallaxNodeExtrasCCParallaxNodeExtras*_backgroundNode;然后选择HelloWorldScene.cpp用下面的代码替换掉section#1(_backgroundNode创建的地方)的第一行。_backgroundNode=CCParallaxNodeExtras::node();最后,添加下面的代码,到update方法的底部。CCArray*spaceDusts=CCArray::arrayWithCapacity(2);spaceDusts—>addObject(_spacedust1);spaceDusts->addObject(_spacedust2);for(intii=0;iicount();ii++){CCSprite*spaceDust=(CCSprite*)(spaceDusts->objectAtIndex(ii));floatxPosition=_backgroundNode-〉convertToWorldSpace(spaceDust—>getPosition())。x;floatsize=spaceDust—>getContentSize()。width;if(xPosition〈—size){_backgroundNode->incrementOffset(ccp(spaceDust->getContentSize().width*2,0),spaceDust);}}CCArray*backGrounds=CCArray::arrayWithCapacity(4);backGrounds—〉addObject(_galaxy);backGrounds->addObject(_planetsunrise);backGrounds-〉addObject(_spacialanomaly);backGrounds->addObject(_spacialanomaly2);for(intii=0;iicount();ii++){CCSprite*background=(CCSprite*)(backGrounds—〉objectAtIndex(ii));floatxPosition=_backgroundNode—>convertToWorldSpace(background—>getPosition())。x;floatsize=background->getContentSize().width;if(xPosition〈—size){_backgroundNode->incrementOffset(ccp(2000,0),background);}}你可以看到,NSArray的替代品是基于STL(C++标准库)实现的CCArray.我们用可以帮我们自动释放对象的arrayWithCapacity构造函数。注意这里同样也有一个更先进的CCMutableArray来用于存储集合元素.最后的修改—由于你添加了新文件,你需要把它添加到android工程的Makefile来让他编译正确。于是用Eclipse打开Classes\Android。mk然后改动行LOCAL_SRC_FILES为下面的代码。LOCAL_SRC_FILES:=AppDelegate。cpp\HelloWorldScene.cpp\CCParallaxNodeExtras。cpp编译运行,现在背景可以无限滚动了!添加星星添加星星是格外简洁的,只是添加下面的代码到HelloWorldScene.cpp的init方法的return之前。HelloWorld::addChild(CCParticleSystemQuad::particleWithFile(”Stars1。plist"));HelloWorld::addChild(CCParticleSystemQuad::particleWithFile(”Stars2。plist”));HelloWorld::addChild(CCParticleSystemQuad::particleWithFile(”Stars3.plist"));编译运行,漂亮!他已经开头看起来像一个太空游戏了.使用加速计来移动飞船在之前的Cocos2Dspaceshootertutorial里面,我们使用ios的加速计api来检测加速计输入。很明显,ios下面的加速计api是不行以跨平台的,那么我们怎么办呢?幸运的是,cocos2d—x对加速计进行了封装,我们可以不用关心简略平台api,直接使用抽象后的加速计api就可以了。让我们看看它是怎么工作的吧。首先,在HelloWorldScnee。H头文件里面添加一个新的私有成员变量:float_shipPointsPerSecY;然后,添加一个新的public方法声明:virtualvoiddidAccelerate(CCAcceleration*pAccelerationValue);然后在HelloWorldScene.cpp的init方法的return语句之前添加下列代码:this->setIsAccelerometerEnabled(true);接下来,在HelloWorldScene.CPP文件底部添加下面这些新方法定义:voidHelloWorld::didAccelerate(CCAcceleration*pAccelerationValue){#defineKFILTERINGFACTOR0.1#defineKRESTACCELX-0。6#defineKSHIPMAXPOINTSPERSEC(winSize.height*0.5)#defineKMAXDIFFX0.2doublerollingX;//Cocos2DXinvertsXandYaccelerometerdependingondeviceorientation//inlandscapemoderightx=-yandy=x!!!(Strangeandconfusingchoice)pAccelerationValue-〉x=pAccelerationValue-〉y;rollingX=(pAccelerationValue->x*KFILTERINGFACTOR)+(rollingX*(1.0-KFILTERINGFACTOR));floataccelX=pAccelerationValue->x-rollingX;CCSizewinSize=CCDirector::sharedDirector()-〉getWinSize();floataccelDiff=accelX-KRESTACCELX;floataccelFraction=accelDiff/KMAXDIFFX;_shipPointsPerSecY=KSHIPMAXPOINTSPERSEC*accelFraction;}最后,在update方法的底部添加如下代码:CCSizewinSize=CCDirector::sharedDirector()—>getWinSize();floatmaxY=winSize.height—_ship->getContentSize()。height/2;floatminY=_ship->getContentSize().height/2;floatdiff=(_shipPointsPerSecY*dt);floatnewY=_ship-〉getPosition().y+diff;newY=MIN(MAX(newY,minY),maxY);_ship->setPosition(ccp(_ship—>getPosition()。x,newY));这里的didAccelerate回调函数包含一个CCAcceleration对象,它包含加速计的x、y和z三个方向的数据.我们目前只需要使用x方向的加速计数据就行了,由于我们是沿着设备的x轴进行运动的。注意:cocos2d—x会依据你的设备是处于portait模式还是landscape模式来切换加速计的x和y方向的值。如果是Landscaperight(也就是我们目前的情况),接收到的x值其实是-y,而y值是x。如果是Landscapeleft那么接收到的x值是y,而y值是—x。有点头晕了?呵呵编译,然后在你的iphone和android设备上测试一下吧,现在你可以倾斜你的设备来移动飞船啦!当然,此时,你不能在模拟器上进行测试,必须使用真机.添加陨石是时候给游戏添加一些陨石了!首先在HelloWorldScene。h里面添加下面一些实例变量:CCMutableArray*_asteroids;int_nextAsteroid;float_nextAsteroidSpawn;然后,添加一些新的公有方法声明:floatrandomValueBetween(floatlow,floathigh);voidsetInvisible(CCNode*node);floatgetTimeTick();接下来,回到HelloWorldScene.CPP,然后在文件最后添加刚刚的那些帮助方法的实现:floatHelloWorld::randomValueBetween(floatlow,floathigh){return(((float)arc4random()/0xFFFFFFFFu)*(high-low))+low;}floatHelloWorld::getTimeTick(){timevaltime;gettimeofday(&amp;time,NULL);unsignedlongmillisecs=(time.tv_sec*1000)+(time.tv_usec/1000);return(float)millisecs;}randomValueBetween是一个可以获得指定范围内的随机浮点数的帮助方法.而getTimeTick是一种可移植的方式来得到毫秒级别的时间。接下来,在init方法的最后创建一个陨石的数组:#defineKNUMASTEROIDS15_asteroids=newCCMutableArray();for(inti=0;i<KNUMASTEROIDS;++i){CCSprite*asteroid=CCSprite::spriteWithSpriteFrameName(”asteroid。png”);asteroid->setIsVisible(false);_batchNode->addChild(asteroid);_asteroids->addObject(asteroid);}这里,我们使用cocos2d-x的CCMutableArray类来存储ccsprite的数组。注意,我们这里手动调用new操作符,而不是使用arrayWithCapacity来创建对象,这样可以避开使用autorelease机制。最后,在update方法底部添加下列代码:floatcurTimeMillis=getTimeTick();if(curTimeMillis>_nextAsteroidSpawn){floatrandMillisecs=randomValueBetween(0.20,1。0)*1000;_nextAsteroidSpawn=randMillisecs+curTimeMillis;floatrandY=randomValueBetween(0.0,winSize.height);floatrandDuration=randomValueBetween(2.0,10.0);CCSprite*asteroid=_asteroids->getObjectAtIndex(_nextAsteroid);_nextAsteroid++;if(_nextAsteroid〉=_asteroids-〉count())_nextAsteroid=0;asteroid-〉stopAllActions();asteroid->setPosition(ccp(winSize.width+asteroid->getContentSize().width/2,randY));asteroid->setIsVisible(true);asteroid—>runAction(CCSequence::actions(CCMoveBy::actionWithDuration(randDuration,ccp(—winSize.width-asteroid-〉getContentSize().width,0)),CCCallFuncN::actionWithTarget(this,callfuncN_selector(HelloWorld::setInvisible)),NULL//DONOTFORGETTOTERMINATEWITHNULL(unexpectedinC++)));}再一次说明,这里的代码跟之前的cocos2d代码太像了!注意,这里的callfuncN_selector调用跟objc里面的selector机制太像了!注意:由于CCSequence::actions方法的参数列表采纳的是变长参数,你其实可以忽视掉最后一个NULL参数,由于对于c++来讲,这个参数没有意义。但是,考虑到兼容性的缘由,由于cocos2d-x开发者想保持跟cocos2d的高度全都,所以,这里需要一个NULL终止符。如果你在你的代码里面不供应的话,那么你的程序将会崩溃。最后一步就是添加setInvisible回调函数的实现:voidHelloWorld::setInvisible(CCNode*node){node->setIsVisible(false);}编译并运行,有陨石!下面是iphone3GS的运行效果截图:下面是AndroidSamsungGalaxyS的运行效果截图:放射激光是时候让我们的飞船放射激光了!在HelloWorldScene.h里面添加下列私有成员变量:CCMutableArray*_shipLasers;int_nextShipLaser;现在,添加一个新的公有方法声明:virtualvoidccTouchesBegan(cocos2d::CCSet*touches,cocos2d::CCEvent*event);然后,在HelloWorldScene。cpp的init方法的return语句之前添加下列代码:#defineKNUMLASERS5_shipLasers=newCCMutableArray();for(inti=0;i<KNUMLASERS;++i){CCSprite*shipLaser=CCSprite::spriteWithSpriteFrameName("laserbeam_blue。png");shipLaser->setIsVisible(false);_batchNode—>addChild(shipLaser);_shipLasers->addObject(shipLaser);}this->setIsTouchEnabled(true);最后,在文件的底部实现ccTouchesBegan方法;voidHelloWorld::ccTouchesBegan(cocos2d::CCSet*touches,cocos2d::CCEvent*event){CCSizewinSize=CCDirector::sharedDirector()-〉getWinSize();CCSprite*shipLaser=_shipLasers->getObjectAtIndex(_nextShipLaser++);if(_nextShipLaser>=_shipLasers—〉count())_nextShipLaser=0;shipLaser-〉setPosition(ccpAdd(_ship->getPosition(),ccp(shipLaser-〉getContentSize().width/2,0)));shipLaser->setIsVisible(true);shipLaser->stopAllActions();shipLaser—>runAction(CCSequence::actions(CCMoveBy::actionWithDuration(0.5,ccp(winSize.width,0)),CCCallFuncN::actionWithTarget(this,callfuncN_selector(HelloWorld::setInvisible)),NULL//DONOTFORGETTOTERMINATEWITHNULL));}编译并运行,现在你可以放射激光了!下面是iphone3GS下面的运行截图:下面是AndroidSamsungGalaxyS的运行截图:简洁的碰撞检测接下来,我们想添加一些代码来检测激光和小行星间的碰撞,以及当小行星被撞击时爆炸.完成这项功能的代码和《如何使用cocos2d制作一个太空射击游戏》中的相当相像,但是用到了一些新的语法。注意,我们会介绍C++迭代器来处理CCMutableArray。首先,在HelloWorldScene。h添加一个新的私有变量:int_lives;接着,在HelloWorldScene.h的update函数的底部添加如下代码://AsteroidsCCMutableArray::CCMutableArrayIteratoritAster,itLaser;for(itAster=_asteroids—>begin();itAster!=_asteroids->end();itAster++){CCSprite*asteroid=(CCSprite*)*itAster;if(!asteroid->getIsVisible())continue;for(itLaser=_shipLasers-〉begin();itLaser!=_shipLasers->end();itLaser++){CCSprite*shipLaser=(CCSprite*)*itLaser;if(!shipLaser->getIsVisible())continue;if(CCRect::CCRectIntersectsRect(shipLaser—〉boundingBox(),asteroid->boundingBox())){shipLaser—〉setIsVisible(false);asteroid—>setIsVisible(false);continue;}}if(CCRect::CCRectIntersectsRect(_ship—>boundingBox(),asteroid->boundingBox())){asteroid-〉setIsVisible(false);_ship—>runAction(CCBlink::actionWithDuration(1.0,9));_lives——;}}编译并运行,现在你可以使小行星爆炸了!当然,你会发现当激光碰撞到小行星,他们并没有爆炸就消灭了.这是由于我们没有为爆炸添加粒子效果。之前我们已经将星星添加到了粒子系统中,依据最初的教程,把爆炸加入粒子系统将是相当简洁的任务。把这个当成额外的课外作业吧!成功/失败检测将成功或失败的检测代码转换到Cocos2D-X也是直截了当的。切换回HelloWorldScene.h并在类的声明前添加一个枚举变量:typedefenum{KENDREASONWIN,KENDREASONLOSE}EndReason;现在在HelloWorld类添加两个私有变量:double_gameOverTime;bool_gameOver;接下来,添加两个私有方法的声明;voidendScene(EndReasonendReason);voidrestartTapped();接着,切换到HelloWorldScene。cpp并在init函数的return前添加如下代码:_lives=3;doublecurTime=getTimeTick();_gameOverTime=curTime+30000;在update的结尾,添加如下代码:if(_livesstopAllActions();_ship-〉setIsVisible(false);this-〉endScene(KENDREASONLOSE);}elseif(curTimeMillis>=_gameOverTime){this-〉endScene(KENDREASONWIN);}最后,在文件的结尾添加新方法的实现:voidHelloWorld::restartTapped(){CCDirector::sharedDirector()->replaceScene(CCTransitionZoomFlipX::transitionWithDuration(0。5,this->scene()));//reschedulethis->scheduleUpdate();}voidHelloWorld::endScene(EndReasonendReason){if(_gameOver)return;_gameOver=true;CCSizewinSize=CCDirector::sharedDirector()->getWinSize();charmessage[10]=”YouWin";if(endReason==KENDREASONLOSE)strcpy(message,”YouLose");CCLabelBMFont*label;label=CCLabelBMFont::labelWithString(message,”Arial.fnt");label-〉setScale(0.1);label—>setPosition(ccp(winSize.width/2,winSize。height*0.6));this—〉addChild(label);CCLabelBMFont*restartLabel;restartLabel=CCLabelBMFont::labelWithString("Restart","Arial.fnt");CCMenuItemLabel*restartItem=CCMenuItemLabel::itemWithLabel(restartLabel,this,menu_selector(HelloWorld::restartTapped));restartItem->setScale(0.1);restartItem->setPosition(ccp(winSize。width/2,winSize.height*0.4));CCMenu*menu=CCMenu::menuWithItems(restartItem,NULL);menu->setPosition(CCPointZero);this->addChild(menu);//clearlabelandmenurestartItem—〉runAction(CCScaleTo::actionWithDuration(0.5,1.0));label—〉runAction(CCScaleTo::actionWithDuration(0.5,1.0));//Terminateupdatecallbackthis->unscheduleUpdate();}注意最初的代码版本和Cocos2D—X代码版本的一个区分是我们不得不在游戏开头和结束时定时或取消定时对update的回调。编译并运行,如果你的船撞击太多次就会死!免费的音乐和音效安卓不支持CAF格式的声音文件,所以我们要做的第一件事就是把原始声音文件替换为一种可在安卓上使用的格式。打开终端,输入如下命令(不要忘记在第一个命令中用安卓项目的真实路径替换$PROJECT_HOME,否则命令将无法运行):cd$PROJECT_HOME/Resourcesafconvert-fWAVE-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级语文下册第五单元劳动5综合活动教案北师大版
- 职业病防护与人力资源管理试题及答案
- 2025版高考物理一轮复习第三章牛顿运动定律第2课时课时作业含解析
- 英语情商测试题及答案
- 西医临床临床实验技能试题及答案
- 南宁一模语文试题及答案
- 文化产业管理市场调研方法试题及答案
- 六年级语文下册第二组9和田的维吾尔教学实录新人教版
- 精神病的填空试题及答案
- 小学英语经典诗歌济慈每当我害怕素材
- 新生儿腹泻病护理查房
- 《免疫学检验》课程标准(含课程思政)
- 网络安全的前沿技术与趋势
- DB21-T 3135-2019菲律宾蛤仔浅海底播增殖技术规范
- 非车险销售培训课件
- VTE评估及护理预防
- 《往复活塞式压缩机》课件
- 半夏泻心汤抑制原发性肝细胞癌术后复发的临床应用研究演示稿件
- 2023诗词大会知识竞赛200题题库(含答案)
- TL226 大众试验测试标准
- 公路日常养护费-公路日常养护费用
评论
0/150
提交评论