Cocos2d-x制作太空射击游戏.doc_第1页
Cocos2d-x制作太空射击游戏.doc_第2页
Cocos2d-x制作太空射击游戏.doc_第3页
Cocos2d-x制作太空射击游戏.doc_第4页
Cocos2d-x制作太空射击游戏.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文由麦可网收集整理,转载请注明出处。Cocos2d-x制作太空射击游戏在这篇教程里,我将向你展示如何利用 How to Makea Space Shooter iPhone Game里创建的工程制作一个太空游戏。这里有一个主要的区别这次是用跨平台的cocs2d-x开发。这就意味在教程里开发的游戏可以在你的iphone和andorid上运行。当然,再稍微做修改,你可以让它在Windows、Linux或者Mac下运行。深吸一口气,我们就要开始啦!Getting Started第一件事情就是下载并解压 space game resources ZIP file。就像我们在之前教程里面添加两个项目里都可以使用的C+类一样,我们需要以同样的方式来添加这些资源文件使ios和andriod项目都可以引用同样的资源。我们把这些文件添加到Android工程的Resource目录下面,然后在ios项目里面引用这个目录。为了方便添加图片和其它资源到我们的工程里,我们需要把它们添加到 $PROJECT_HOMEResources目录(请记住 $PROJECT_HOME是你AndriodCocosd-X project-samplecocos2dxandroid的位置)。然而,我们的Eclipse工程只会显示$PROJECT_HOMEandroid目录下的文件,所以这确实是一个问题!幸运的是这里有一个简单的变通方案:我们在$PROJECT_HOMEResources 目录下面建立一个符号链接,指向$PROJECT_HOMEandroidResources目录,这样Eclipse就可以看到它们了。接着,打开终端,在$PROJECT_HOMEandroid目录下运行如下的命令:1 ln-s./Resources./Resources.现在拷贝文件到Resources文件夹。请注意,由于跨平台可移植性的原因,你需要避免使用层级式的子目录。尽管子目录在iOS下运行起来很好,但是它们不一定在Android上运行地很好。举例来说,如果你有一个Sprites.pvr.ccz文件在一个SpriteSheet子目录里,在Android里面使用CCSpriteBatchNode:bathNodeWithFile方法将会调用失败并返回一个空指针。所以,从 space game resources ZIP file里面把单个的文件拷贝到Resource文件夹下去,请记得不要创建任何子目录,仅仅拷贝一个个的文件过来就可以了。在资源文件里存在一个字体的子文件夹,从字体文件夹里把所有的文件拷贝到Resources里时,直接替换就可以了。此外,在压缩文件里有个Classes子文件夹,你不必把它添加到Resources目录下,把它删除就行了。接下来,让我们在iOS工程里引用这些文件,打开你的Xcode工程,创建一个新的Group叫做SharedResources。选择新的Group,在Inspector里点击按钮选择路径,然后把你在Android工程里的资源文件夹选择上。右键点击SharedResources组,选择添加文件,从Android文件夹里添加所有的文件。目前,你完成所有的项目配置了!增加一个太空飞船让我们试试,看是否工作!打开ClassesHelloWorldScene.h,在HelloWorld类开头加入下面代码(在已有public:行的上面)2 private:34 cocos2d:CCSpriteBatchNode*_batchNode;56 cocos2d:CCSprite*_ship;上面的代码创建了两个私有实例变量 一个是sprite batch node,一个是太空飞船精灵现在切换到HelloWorldScene.cpp,在init方法里,删除从注释“2. add a menu item”到方法最后的所有代码,加入下面代码:7 _batchNode=CCSpriteBatchNode:batchNodeWithFile(Sprites.pvr.ccz);89 this-addChild(_batchNode);1011 CCSpriteFrameCache:sharedSpriteFrameCache()-addSpriteFramesWithFile(Sprites.plist);1213 _ship=CCSprite:spriteWithSpriteFrameName(SpaceFlier_sm_1.png);1415 CCSizewinSize=CCDirector:sharedDirector()-getWinSize();1617 _ship-setPosition(ccp(winSize.width*0.1,winSize.height*0.5);1819 _batchNode-addChild(_ship,1);2021 returntrue;注意这些代码与你过去使用的Objective-C版的cocos2d 非常类似。API是有很多相同的地方的,仅仅是有一些与C+的语法不同。在Android模拟器中编译运行,你应该可以看到你的船出现在屏幕上。最妙的事情是在iOS上也能运行。增加视差滚动接下来,我们会加入宇宙背景,使它以视差滚动这种很酷的方式来滚动。首先,我们不得不在所有的类名前面加上cocos2d:这个名字空间,这太烦人了!所以在HelloWorldScene.h类声明前加入下面行:22 USING_NS_CC;接着在HelloWorld的private部分加入一些新的变量(注意我们不再需要加cocos2d前缀):23 CCParallaxNode*_backgroundNode;2425 CCSprite*_spacedust1;2627 CCSprite*_spacedust2;2829 CCSprite*_planetsunrise;3031 CCSprite*_galaxy;3233 CCSprite*_spacialanomaly;3435 CCSprite*_spacialanomaly2;然后,在HelloWorldScene.cpp的init方法中,return语句前加入下面代码:36 /1)CreatetheCCParallaxNode3738 _backgroundNode=CCParallaxNode:node();/13940 this-addChild(_backgroundNode,-1);4142 /2)CreatethespriteswelladdtotheCCParallaxNode4344 _spacedust1=CCSprite:spriteWithFile(bg_front_spacedust.png);4546 _spacedust2=CCSprite:spriteWithFile(bg_front_spacedust.png);4748 _planetsunrise=CCSprite:spriteWithFile(bg_planetsunrise.png);4950 _galaxy=CCSprite:spriteWithFile(bg_galaxy.png);5152 _spacialanomaly=CCSprite:spriteWithFile(bg_spacialanomaly.png);5354 _spacialanomaly2=CCSprite:spriteWithFile(bg_spacialanomaly2.png);5556 /3)Determinerelativemovementspeedsforspacedustandbackground5758 CCPointdustSpeed=ccp(0.1,0.1);5960 CCPointbgSpeed=ccp(0.05,0.05);6162 /4)AddchildrentoCCParallaxNode6364 _backgroundNode-addChild(_spacedust1,0,dustSpeed,ccp(0,winSize.height/2);/26566 _backgroundNode-addChild(_spacedust2,0,dustSpeed,ccp(_spacedust1-getContentSize().width,winSize.height/2);6768 _backgroundNode-addChild(_galaxy,-1,bgSpeed,ccp(0,winSize.height*0.7);6970 _backgroundNode-addChild(_planetsunrise,-1,bgSpeed,ccp(600,winSize.height*0);7172 _backgroundNode-addChild(_spacialanomaly,-1,bgSpeed,ccp(900,winSize.height*0.3);7374 _backgroundNode-addChild(_spacialanomaly2,-1,bgSpeed,ccp(1500,winSize.height*0.9);再一次说明,这段代码与我们的如何使用cocos2d制作一个太空射击游戏非常类似,只是有些小的句法变化。你可以比较一下2个教程在句法上的不同。Android模拟器中编译运行,你应该可以看到一个宇宙场景的启动,同样的,也能在iphone上运行。现在使背景滚动,在HelloWorldScene.h中预先声明update方法 你可以在private或public部分加入下面代码,但是既然update方法是内部使用的,所以作为一个private方法更恰当:75 /scheduledUpdate7677 voidupdate(cocos2d:ccTimedt);然后在HelloWorldScene.cpp 最后加入下面的方法实现78 voidHelloWorld:update(ccTimedt)7980 CCPointbackgroundScrollVert=ccp(-1000,0);8182 _backgroundNode-setPosition(ccpAdd(_backgroundNode-getPosition(),ccpMult(backgroundScrollVert,dt);8384 最后,在init方法末尾(但是在最后的return语句前)调用scheduleUpdate方法85 this-scheduleUpdate();编译运行,你将会看到背景滚动!持续滚动这时,你应该注意到了背景滚出屏幕后没有循环,那么我们来修这个bug在我们的 如何使用cocos2d制作一个太空射击游戏教程中,我们通过Objective-c的分类(category)扩展了CCParallaxNode类来实现。不幸的是,C+中是不存在分类的,所以我们需要借助继承来实现之。我们将去定义一个CCParallaxNode扩展类来扩展标准的CCParallaNode。这样做虽然不如Objective-C优雅,但是有时我们需要为软件可移植性做一些牺牲。在Xcode中,在Glasses group上单击右键,选择New File。选择iOSC and C+C+文件末尾,点击Next,为他命名为CCParallaxNodeExtras.cpp,存储到$PROJECT_HOMEClasses,然后点击创建。然后重复上述过程,但要选择iOSC and C+Header文件模板,来创建CCParallaxNodeExtras.h用下面的代码替换CCParallaxNodeExtras.h中的内容86 #ifndef8788 Cocos2DxFirstIosSample_CCParallaxNodeExtras_h#define8990 Cocos2DxFirstIosSample_CCParallaxNodeExtras_h#include“cocos2d.h”USING_NS_CC;classCCParallaxNodeExtras:publicCCParallaxNode9192 public:/NeedtoprovideourownconstructorCCParallaxNodeExtras();/justtoavoiduglylatercastandalsoforsafety9394 staticCCParallaxNodeExtras*node();/Facilitymethod(weexpecttohaveitsooninCOCOS2DX)voidincrementOffset(CCPoint9596 offset,CCNode*node);#endif这里我们为CCParallaxNode添加一个新的方法(incrementOffset),我们用它来更新parallax node 每个 child 的位置。当背景移动出屏幕左端的时候我们会使用它来将背景放到屏幕的右端,来实现持续的滚动。 将下面的代码替换到CCParallaxNodeExtras.cpp97 #includeCCParallaxNodeExtras.h9899 /HacktoaccessCCPointObject(whichisnotapublicclass)100101 classCCPointObject:CCObject102103 CC_SYNTHESIZE(CCPoint,m_tRatio,Ratio)104105 CC_SYNTHESIZE(CCPoint,m_tOffset,Offset)106107 CC_SYNTHESIZE(CCNode*,m_pChild,Child)/weakref108109 ;110111 /Needtoprovideourownconstructor112113 CCParallaxNodeExtras:CCParallaxNodeExtras()114115 CCParallaxNode:CCParallaxNode();/callparentconstructor116117 118119 CCParallaxNodeExtras*CCParallaxNodeExtras:node()120121 returnnewCCParallaxNodeExtras();122123 124125 voidCCParallaxNodeExtras:incrementOffset(CCPointoffset,CCNode*node)126127 for(unsignedinti=0;inum;i+)128129 CCPointObject*point=(CCPointObject*)m_pParallaxArray-arri;130131 CCNode*curNode=point-getChild();132133 if(curNode-isEqual(node)134135 point-setOffset(ccpAdd(point-getOffset(),offset);136137 break;138139 140141 142143 注意,很不幸的是CCPointObject在Cocos2d中并不是公共的类,所以我们需要借住一些小手段来hack。(重定义它为我们的类,并具有相同的签名)。虽然它能工作的很好,但是他的缺点是,如果CCPointObject改动了,你这里也要跟着改动,否则程序会崩溃。代码的重点是incrementOffset方法,他和 如何使用cocos2d制作一个太空射击游戏中的实现相同,只是用了不同的语言。下一步,选择HelloWorldScene.h,在文件顶部的#include 语句之后添加这些代码:144 #includeCCParallaxNodeExtras.h然后像下面的代码一样,将private区域中_backgroundNode定义由CCParallaNode改为CCParallaxNodeExtras145 CCParallaxNodeExtras*_backgroundNode;然后选择HelloWorldScene.cpp 用下面的代码替换掉section #1(_backgroundNode创建的地方)的第一行。146 _backgroundNode=CCParallaxNodeExtras:node();最后,添加下面的代码,到update 方法的底部。147 CCArray*spaceDusts=CCArray:arrayWithCapacity(2);148149 spaceDusts-addObject(_spacedust1);150151 spaceDusts-addObject(_spacedust2);152153 for(intii=0;iicount();ii+)154155 CCSprite*spaceDust=(CCSprite*)(spaceDusts-objectAtIndex(ii);156157 floatxPosition=_backgroundNode-convertToWorldSpace(spaceDust-getPosition().x;158159 floatsize=spaceDust-getContentSize().width;160161 if(xPositionincrementOffset(ccp(spaceDust-getContentSize().width*2,0),spaceDust);162163 164165 166167 CCArray*backGrounds=CCArray:arrayWithCapacity(4);168169 backGrounds-addObject(_galaxy);170171 backGrounds-addObject(_planetsunrise);172173 backGrounds-addObject(_spacialanomaly);174175 backGrounds-addObject(_spacialanomaly2);176177 for(intii=0;iicount();ii+)178179 CCSprite*background=(CCSprite*)(backGrounds-objectAtIndex(ii);180181 floatxPosition=_backgroundNode-convertToWorldSpace(background-getPosition().x;182183 floatsize=background-getContentSize().width;184185 if(xPositionincrementOffset(ccp(2000,0),background);186187 188189 你可以看到,NSArray的替代品是基于STL (C+标准库) 实现的CCArray。我们用可以帮我们自动释放对象的arrayWithCapacity构造函数。注意这里同样也有一个更先进的CCMutableArray来用于存储集合元素。最后的修改-因为你添加了新文件,你需要把它添加到android工程的Makefile来让他编译正确。于是用Eclipse打开ClassesAndroid.mk然后改动行LOCAL_SRC_FILES为下面的代码。190 LOCAL_SRC_FILES:=AppDelegate.cpp191192 HelloWorldScene.cpp193194 CCParallaxNodeExtras.cpp编译运行,现在背景可以无限滚动了!添加星星添加星星是非常简单的,只是添加下面的代码到HelloWorldScene.cpp的init方法的return之前。195 HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(Stars1.plist);196197 HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(Stars2.plist);198199 HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(Stars3.plist);编译运行,漂亮!他已经开始看起来像一个太空游戏了。 使用加速计来移动飞船在之前的Cocos2D space shooter tutorial里面,我们使用ios的加速计api来检测加速计输入。很明显,ios下面的加速计api是不可以跨平台的,那么我们怎么办呢?幸运的是,cocos2d-x对加速计进行了封装,我们可以不用关心具体平台api,直接使用抽象后的加速计api就可以了。让我们看看它是怎么工作的吧。首先,在HelloWorldScnee.H头文件里面添加一个新的私有成员变量:200 float_shipPointsPerSecY;然后,添加一个新的public方法声明:201 virtualvoiddidAccelerate(CCAcceleration*pAccelerationValue);然后在HelloWorldScene.cpp的init方法的return语句之前添加下列代码:202 this-setIsAccelerometerEnabled(true);接下来,在HelloWorldScene.CPP文件底部添加下面这些新方法定义:203 voidHelloWorld:didAccelerate(CCAcceleration*pAccelerationValue)204205 #defineKFILTERINGFACTOR0.1206207 #defineKRESTACCELX-0.6208209 #defineKSHIPMAXPOINTSPERSEC(winSize.height*0.5)210211 #defineKMAXDIFFX0.2212213 doublerollingX;214215 /Cocos2DXinvertsXandYaccelerometerdependingondeviceorientation216217 /inlandscapemoderightx=-yandy=x!(Strangeandconfusingchoice)218219 pAccelerationValue-x=pAccelerationValue-y;220221 rollingX=(pAccelerationValue-x*KFILTERINGFACTOR)+(rollingX*(1.0-KFILTERINGFACTOR);222223 floataccelX=pAccelerationValue-x-rollingX;224225 CCSizewinSize=CCDirector:sharedDirector()-getWinSize();226227 floataccelDiff=accelX-KRESTACCELX;228229 floataccelFraction=accelDiff/KMAXDIFFX;230231 _shipPointsPerSecY=KSHIPMAXPOINTSPERSEC*accelFraction;232233 最后,在update方法的底部添加如下代码:234 CCSizewinSize=CCDirector:sharedDirector()-getWinSize();235236 floatmaxY=winSize.height-_ship-getContentSize().height/2;237238 floatminY=_ship-getContentSize().height/2;239240 floatdiff=(_shipPointsPerSecY*dt);241242 floatnewY=_ship-getPosition().y+diff;243244 newY=MIN(MAX(newY,minY),maxY);245246 _ship-setPosition(ccp(_ship-getPosition().x,newY);这里的didAccelerate回调函数包含一个CCAcceleration对象,它包含加速计的x、y和z三个方向的数据。我们目前只需要使用x方向的加速计数据就行了,因为我们是沿着设备的x轴进行运动的。注意: cocos2d-x会根据你的设备是处于portait模式还是landscape模式来切换加速计的x和y方向的值。如果是Landscape right(也就是我们目前的情况),接收到的x值其实是-y,而y值是x。如果是Landscape left那么接收到的x值是y,而y值是-x。有点头晕了?呵呵编译,然后在你的iphone和android设备上测试一下吧,现在你可以倾斜你的设备来移动飞船啦!当然,此时,你不能在模拟器上进行测试,必须使用真机。添加陨石是时候给游戏添加一些陨石了!首先在 HelloWorldScene.h里面添加下面一些实例变量:247 CCMutableArray*_asteroids;248249 int_nextAsteroid;250251 float_nextAsteroidSpawn;然后,添加一些新的公有方法声明:252 floatrandomValueBetween(floatlow,floathigh);253254 voidsetInvisible(CCNode*node);255256 floatgetTimeTick();接下来,回到HelloWorldScene.CPP,然后在文件最后添加刚刚的那些辅助方法的实现:257 floatHelloWorld:randomValueBetween(floatlow,floathigh)258259 return(float)arc4random()/0xFFFFFFFFu)*(high-low)+low;260261 262263 floatHelloWorld:getTimeTick()264265 timevaltime;266267 gettimeofday(&time,NULL);268269 unsignedlongmillisecs=(time.tv_sec*1000)+(time.tv_usec/1000);270271 return(float)millisecs;272273 randomValueBetween 是一个可以获得指定范围内的随机浮点数的辅助方法。而 getTimeTick 是一种可移植的方式来得到毫秒级别的时间。接下来,在init方法的最后创建一个陨石的数组:274 #defineKNUMASTEROIDS15275276 _asteroids=newCCMutableArray();277278 for(inti=0;isetIsVisible(false);281282 _batchNode-addChild(asteroid);283284 _asteroids-addObject(asteroid);285286 这里,我们使用cocos2d-x的CCMutableArray类来存储ccsprite的数组。注意,我们这里手动调用new操作符,而不是使用arrayWithCapacity来创建对象,这样可以避免使用autorelease机制。最后,在update方法底部添加下列代码:287 floatcurTimeMillis=getTimeTick();288289 if(curTimeMillis_nextAsteroidSpawn)290291 floatrandMillisecs=randomValueBetween(0.20,1.0)*1000;292293 _nextAsteroidSpawn=randMillisecs+curTimeMillis;294295 floatrandY=randomValueBetween(0.0,winSize.height);296297 floatrandDuration=randomValueBetween(2.0,10.0);298299 CCSprite*asteroid=_asteroids-getObjectAtIndex(_nextAsteroid);300301 _nextAsteroid+;302303 if(_nextAsteroid=_asteroids-count()304305 _nextAsteroid=0;306307 asteroid-stopAllActions();308309 asteroid-setPosition(ccp(winSize.width+asteroid-getContentSize().width/2,randY);310311 asteroid-setIsVisible(true);312313 asteroid-runAction(CCSequence:actions(314315 CCMoveBy:actionWithDuration(randDuration,ccp(-winSize.width-asteroid-getContentSize().width,0),316317 CCCallFuncN:actionWithTarget(this,callfuncN_selector(HelloWorld:setInvisible),318319 NULL/DONOTFORGETTOTERMINATEWITHNULL(unexpectedinC+)320321 );322323 再一次说明,这里的代码跟之前的cocos2d代码太像了!注意,这里的callfuncN_selector调用跟objc里面的selector机制太像了!注意:由于CCSequence:actions方法的参数列表采用的是变长参数,你其实可以忽略掉最后一个NULL参数,因为对于c+来讲,这个参数没有意义。但是,考虑到兼容性的原因,因为cocos2d-x开发者想保持跟cocos2d的高度一致,所以,这里需要一个NULL终止符。如果你在你的代码里面不提供的话,那么你的程序将会崩溃。最后一步就是添加setInvisible回调函数的实现:324 voidHelloWorld:setInvisible(CCNode*node)325326 node-setIsVisible(false);327328 编译并运行,有陨石!下面是iphone3GS的运行效果截图:下面是Android Samsung Galaxy S的运行效果截图:发射激光是时候让我们的飞船发射激光了!在HelloWorldScene.h里面添加下列私有成员变量:329 CCMutableArray*_shipLasers;330331 int_nextShipLaser;现在,添加一个新的公有方法声明:332 virtualvoidccTouchesBegan(cocos2d:CCSet*touches,cocos2d:CCEvent*event);然后,在HelloWorldScene.cpp的init方法的return语句之前添加下列代码:333 #defineKNUMLASERS5334335 _shipLasers=newCCMutableArray();336337 for(inti=0;isetIsVisible(false);340341 _batchNode-addChild(shipLaser);342343 _shipLasers-addObject(shipLaser);344345 346347 this-setIsTouchEnabled(true);最后,在文件的底部实现ccTouchesBegan方法;348 voidHelloWorld:ccTouchesBegan(cocos2d:CCSet*touches,cocos2d:CCEvent*event)349350 351352 CCSizewinSize=CCDirector:sharedDirector()-getWinSize();353354355356 CCSprite*shipLaser=_shipLasers-getObjectAtIndex(_nextShipLaser+);357358 if(_nextShipLaser=_shipLasers-count()359360 _nextShipLaser=0;361362 shipLaser-setPosition(ccpAdd(_ship-getPosition(),ccp(shipLaser-getContentSize().width/2,0);363364 shipLaser-setIsVisible(true);365366 shipLaser-stopAllActions();367368 shipLaser-runAction(CCSequence:actions(369370 CCMoveBy:actionWithDuration(0.5,ccp(winSize.width,0),371372 CCCallFuncN:actionWithTarget(this,callfuncN_selector(HelloWorld:setInvisible),373374 NULL/DONOTFORGETTOTERMINATEWITHNULL375376 );377378 编译并运行,现在你可以发射激光了!下面是iphone 3GS下面的运行截图:下面是Android Samsung Galaxy S的运行截图:简单的碰撞检测接下来,我们想添加一些代码来检测激光和小行星间的碰撞,以及当小行星被撞击时爆炸。完成这项功能的代码和如何使用cocos2d制作一个太空射击游戏中的相当相似,但是用到了一些新的语法。注意,我们会介绍C+迭代器来处理CCMutableArray。首先,在HelloWorldScene.h添加一个新的私有变量:379 int_lives;接着,在HelloWorldScene.h的update函数的底部添加如下代码:380 /Asteroids381382 CCMutableArray:CCMutableArrayIteratoritAster,itLaser;383384 for(itAster=_asteroids-begin();itAster!=_asteroids-end();itAster+)385386 CCSprite*asteroid=(CCSprite*)*itAster;387388 if(!asteroid-getIsVisible()389390 continue;391392 for(itLaser=_shipLasers-begin();itLaser!=_shipLasers-end();itLaser+)393394 CCSprite*shipLaser=(CCSprite*)*itLaser;395396 if(!shipLaser-getIsVisible()397398 continue;399400 if(CCRect:CCRectIntersectsRect(shipLaser-boundingBox(),asteroid-boundingBox()401402 shipLaser-setIsVisible(false);403404 asteroid-setIsVisible(false);405406 continue;407408 409410 411412 if(CCRect:CCRectIntersectsRect(_ship-boundingBox(),asteroid-boundingBox()413414 asteroid-setIsVisible(false);415416 _ship-runAction(CCBlink:actionWithDuration(1.0,9);417418 _lives-;419420 421422 编译并运行,现在你可以使小行星爆炸了!当然,你会发现当激光碰撞到小行星,他们并没有爆炸就消失了。这是因为我们没有为爆炸添加粒子效果。之前我们已经将星星添加到了粒子系统中,根据最初的教程,把爆炸加入粒子系统将是相当简单的任务。把这个当成额外的课外作业吧!胜利/失败检测将胜利或失败的检测代码转换到Cocos2D-X也是直截了当的。切换回HelloWorldScene.h并在类的声明前添加一个枚举变量:423 typedefenum424425 KENDREASONWIN,426427 KENDREASONLOSE428429 EndReason;现在在HelloWorld类添加两个私有变量:430 double_gameOverTime;431432 bool_gameOver;接下来,添加两个私有方法的声明;433 voidendScene(EndReasonendReason);434435 voidrestartTapped();接着,切换到HelloWorldScene.cpp并在init函数的return前添加如下代码:436 _lives=3;437438 doublecurTime=getTimeTick();439440 _gameOverTime=curTime+30000;在update的结尾,添加如下代码:441 if(_livesstopAllActions();442443 _ship-setIsVisible(false);444445 this-endScene(KENDREASONLOSE);446447 elseif(curTimeMillis=_gameOverTime)448449 this-endScene(KENDREASONWIN);450451 最后,在文件的结尾添加新方法的实现:452 voidHelloWorld:restartTapped()453454 CCDirector:sharedDirector()-replaceScene455456 (CCTransitionZoomFlipX:transitionWithDuration(0.5,this-scene();457458 /reschedule459460 this-scheduleUpdate();461462 463464 voidHelloWorld:endScene(EndReasonendReason)465466 if(_gameOver)467468 return;469470 _gameOver=true;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论