版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Cocos2d-x制作太空射擊游戲在這篇教程里,我將向你展示如何利用HowtoMakeaSpaceShooteriPhoneGame里創(chuàng)建的工程制作一個太空游戲。這里有一個主要的區(qū)別——這次是用跨平臺的cocs2d-x開發(fā)。這就意味在教程里開發(fā)的游戲可以在你的iphone和andorid上運行。當(dāng)然,再稍微做修改,你可以讓它在Windows、Linux或者M(jìn)ac下運行。這篇教程基于我們在《COCOS2D-X跨ANDROID&IOS平臺開發(fā)入門教程PART-1》里所創(chuàng)建的內(nèi)容。如果你還沒有準(zhǔn)備好,那么最好先弄懂前面的工程,然后再繼續(xù)。深吸一口氣,我們就要開始啦!
GettingStarted第一件事情就是下載并解壓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.現(xiàn)在拷貝文件到Resources文件夾。請注意,由于跨平臺可移植性的原因,你需要避免使用層級式的子目錄。盡管子目錄在iOS下運行起來很好,但是它們不一定在Android上運行地很好。舉例來說,如果你有一個Sprites.pvr.ccz文件在一個SpriteSheet子目錄里,在Android里面使用CCSpriteBatchNode::bathNodeWithFile方法將會調(diào)用失敗并返回一個空指針。所以,從spacegameresourcesZIPfile里面把單個的文件拷貝到Resource文件夾下去,請記得不要創(chuàng)建任何子目錄,僅僅拷貝一個個的文件過來就可以了。在資源文件里存在一個字體的子文件夾,從字體文件夾里把所有的文件拷貝到Resources里時,直接替換就可以了。此外,在壓縮文件里有個Classes子文件夾,你不必把它添加到Resources目錄下,把它刪除就行了。當(dāng)所有的準(zhǔn)備工作完成后就會是下面的樣子:接下來,讓我們在iOS工程里引用這些文件,打開你的Xcode工程,創(chuàng)建一個新的Group叫做SharedResources。選擇新的Group,在Inspector里點擊按鈕選擇路徑,然后把你在Android工程里的資源文件夾選擇上。右鍵點擊SharedResources組,選擇添加文件,從Android文件夾里添加所有的文件。目前,你完成所有的項目配置了!增加一個太空飛船讓我們試試,看是否工作!打開Classes\HelloWorldScene.h,在HelloWorld類開頭加入下面代碼(在已有public:行的上面)private:cocos2d::CCSpriteBatchNode*_batchNode;cocos2d::CCSprite*_ship;上面的代碼創(chuàng)建了兩個私有實例變量–一個是spritebatchnode,一個是太空飛船精靈現(xiàn)在切換到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模擬器中編譯運行,你應(yīng)該可以看到你的船出現(xiàn)在屏幕上最妙的事情是在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模擬器中編譯運行,你應(yīng)該可以看到一個宇宙場景的啟動同樣的,也能在iphone上運行現(xiàn)在使背景滾動,在HelloWorldScene.h中預(yù)先聲明update方法–你可以在private或public部分加入下面代碼,但是既然update方法是內(nèi)部使用的,所以作為一個private方法更恰當(dāng)://scheduledUpdatevoidupdate(cocos2d::ccTimedt);然后在HelloWorldScene.cpp最后加入下面的方法實現(xiàn)voidHelloWorld::update(ccTimedt){CCPointbackgroundScrollVert=ccp(-1000,0);_backgroundNode->setPosition(ccpAdd(_backgroundNode->getPosition(),ccpMult(backgroundScrollVert,dt)));}最后,在init方法末尾(但是在最后的return語句前)調(diào)用scheduleUpdate方法this->scheduleUpdate();編譯運行,你將會看到背景滾動!持續(xù)滾動這時,你應(yīng)該注意到了背景滾出屏幕后沒有循環(huán),那么我們來修這個bug在我們的《如何使用cocos2d制作一個太空射擊游戲》教程中,我們通過Objective-c的分類(category)擴展了CCParallaxNode類來實現(xiàn)。不幸的是,C++中是不存在分類的,所以我們需要借助繼承來實現(xiàn)之。我們將去定義一個CCParallaxNode擴展類來擴展標(biāo)準(zhǔn)的CCParallaNode。這樣做雖然不如Objective-C優(yōu)雅,但是有時我們需要為軟件可移植性做一些犧牲。在Xcode中,在Glassesgroup上單擊右鍵,選擇NewFile。選擇iOS\CandC++\C++文件末尾,點擊Next,為他命名為CCParallaxNodeExtras.cpp,存儲到$PROJECT_HOME\Classes,然后點擊創(chuàng)建。然后重復(fù)上述過程,但要選擇iOS\CandC++\Header文件模板,來創(chuàng)建CCParallaxNodeExtras.h用下面的代碼替換CCParallaxNodeExtras.h中的內(nèi)容#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這里我們?yōu)镃CParallaxNode添加一個新的方法(incrementOffset),我們用它來更新parallaxnode每個child的位置。當(dāng)背景移動出屏幕左端的時候我們會使用它來將背景放到屏幕的右端,來實現(xiàn)持續(xù)的滾動。將下面的代碼替換到CCParallaxNodeExtras.cpp#include"CCParallaxNodeExtras.h"http://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制作一個太空射擊游戲》中的實現(xiàn)相同,只是用了不同的語言。下一步,選擇HelloWorldScene.h,在文件頂部的#include語句之后添加這些代碼:#include"CCParallaxNodeExtras.h"然后像下面的代碼一樣,將private區(qū)域中_backgroundNode定義由CCParallaNode改為CCParallaxNodeExtrasCCParallaxNodeExtras*_backgroundNode;然后選擇HelloWorldScene.cpp用下面的代碼替換掉section#1(_backgroundNode創(chuàng)建的地方)的第一行。_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++標(biāo)準(zhǔn)庫)實現(xiàn)的CCArray。我們用可以幫我們自動釋放對象的arrayWithCapacity構(gòu)造函數(shù)。注意這里同樣也有一個更先進(jìn)的CCMutableArray來用于存儲集合元素。最后的修改-因為你添加了新文件,你需要把它添加到android工程的Makefile來讓他編譯正確。于是用Eclipse打開Classes\Android.mk然后改動行LOCAL_SRC_FILES為下面的代碼。LOCAL_SRC_FILES:=AppDelegate.cpp\HelloWorldScene.cpp\CCParallaxNodeExtras.cpp編譯運行,現(xiàn)在背景可以無限滾動了!添加星星添加星星是非常簡單的,只是添加下面的代碼到HelloWorldScene.cpp的init方法的return之前。HelloWorld::addChild(CCParticleSystemQuad::particleWithFile("Stars1.plist"));HelloWorld::addChild(CCParticleSystemQuad::particleWithFile("Stars2.plist"));HelloWorld::addChild(CCParticleSystemQuad::particleWithFile("Stars3.plist"));編譯運行,漂亮!他已經(jīng)開始看起來像一個太空游戲了。使用加速計來移動飛船在之前的Cocos2Dspaceshootertutorial里面,我們使用ios的加速計api來檢測加速計輸入。很明顯,ios下面的加速計api是不可以跨平臺的,那么我們怎么辦呢?幸運的是,cocos2d-x對加速計進(jìn)行了封裝,我們可以不用關(guān)心具體平臺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回調(diào)函數(shù)包含一個CCAcceleration對象,它包含加速計的x、y和z三個方向的數(shù)據(jù)。我們目前只需要使用x方向的加速計數(shù)據(jù)就行了,因為我們是沿著設(shè)備的x軸進(jìn)行運動的。注意:cocos2d-x會根據(jù)你的設(shè)備是處于portait模式還是landscape模式來切換加速計的x和y方向的值。如果是Landscaperight(也就是我們目前的情況),接收到的x值其實是-y,而y值是x。如果是Landscapeleft那么接收到的x值是y,而y值是-x。有點頭暈了?呵呵編譯,然后在你的iphone和android設(shè)備上測試一下吧,現(xiàn)在你可以傾斜你的設(shè)備來移動飛船啦!當(dāng)然,此時,你不能在模擬器上進(jìn)行測試,必須使用真機。添加隕石是時候給游戲添加一些隕石了!首先在HelloWorldScene.h里面添加下面一些實例變量:CCMutableArray*_asteroids;int_nextAsteroid;float_nextAsteroidSpawn;然后,添加一些新的公有方法聲明:floatrandomValueBetween(floatlow,floathigh);voidsetInvisible(CCNode*node);floatgetTimeTick();接下來,回到HelloWorldScene.CPP,然后在文件最后添加剛剛的那些輔助方法的實現(xiàn):floatHelloWorld::randomValueBetween(floatlow,floathigh){return(((float)arc4random()/0xFFFFFFFFu)*(high-low))+low;}floatHelloWorld::getTimeTick(){timevaltime;gettimeofday(&time,NULL);unsignedlongmillisecs=(time.tv_sec*1000)+(time.tv_usec/1000);return(float)millisecs;}randomValueBetween是一個可以獲得指定范圍內(nèi)的隨機浮點數(shù)的輔助方法。而getTimeTick是一種可移植的方式來得到毫秒級別的時間。接下來,在init方法的最后創(chuàng)建一個隕石的數(shù)組:#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的數(shù)組。注意,我們這里手動調(diào)用new操作符,而不是使用arrayWithCapacity來創(chuàng)建對象,這樣可以避免使用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調(diào)用跟objc里面的selector機制太像了!注意:由于CCSequence::actions方法的參數(shù)列表采用的是變長參數(shù),你其實可以忽略掉最后一個NULL參數(shù),因為對于c++來講,這個參數(shù)沒有意義。但是,考慮到兼容性的原因,因為cocos2d-x開發(fā)者想保持跟cocos2d的高度一致,所以,這里需要一個NULL終止符。如果你在你的代碼里面不提供的話,那么你的程序?qū)罎?。最后一步就是添加setInvisible回調(diào)函數(shù)的實現(xiàn):voidHelloWorld::setInvisible(CCNode*node){node->setIsVisible(false);}編譯并運行,有隕石!下面是iphone3GS的運行效果截圖:下面是AndroidSamsungGalaxyS的運行效果截圖:發(fā)射激光是時候讓我們的飛船發(fā)射激光了!在HelloWorldScene.h里面添加下列私有成員變量:CCMutableArray*_shipLasers;int_nextShipLaser;現(xiàn)在,添加一個新的公有方法聲明: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);最后,在文件的底部實現(xiàn)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));}編譯并運行,現(xiàn)在你可以發(fā)射激光了!下面是iphone3GS下面的運行截圖:下面是AndroidSamsungGalaxyS的運行截圖:簡單的碰撞檢測接下來,我們想添加一些代碼來檢測激光和小行星間的碰撞,以及當(dāng)小行星被撞擊時爆炸。完成這項功能的代碼和《如何使用cocos2d制作一個太空射擊游戲》中的相當(dāng)相似,但是用到了一些新的語法。注意,我們會介紹C++迭代器來處理CCMutableArray。首先,在HelloWorldScene.h添加一個新的私有變量:int_lives;接著,在HelloWorldScene.h的update函數(shù)的底部添加如下代碼://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--;}}編譯并運行,現(xiàn)在你可以使小行星爆炸了!當(dāng)然,你會發(fā)現(xiàn)當(dāng)激光碰撞到小行星,他們并沒有爆炸就消失了。這是因為我們沒有為爆炸添加粒子效果。之前我們已經(jīng)將星星添加到了粒子系統(tǒng)中,根據(jù)最初的教程,把爆炸加入粒子系統(tǒng)將是相當(dāng)簡單的任務(wù)。把這個當(dāng)成額外的課外作業(yè)吧!勝利/失敗檢測將勝利或失敗的檢測代碼轉(zhuǎn)換到Cocos2D-X也是直截了當(dāng)?shù)?。切換回HelloWorldScene.h并在類的聲明前添加一個枚舉變量:typedefenum{KENDREASONWIN,KENDREASONLOSE}EndReason;現(xiàn)在在HelloWorld類添加兩個私有變量:double_gameOverTime;bool_gameOver;接下來,添加兩個私有方法的聲明;voidendScene(EndReasonendReason);voidrestartTapped();接著,切換到HelloWorldScene.cpp并在init函數(shù)的return前添加如下代碼:_lives=3;doublecurTime=getTimeTick();_gameOverTime=curTime+30000;在update的結(jié)尾,添加如下代碼:if(_livesstopAllActions();_ship->setIsVisible(false);this->endScene(KENDREASONLOSE);}elseif(curTimeMillis>=_gameOverTime){this->endScene(KENDREASONWIN);}最后,在文件的結(jié)尾添加新方法的實現(xiàn):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代碼版本的一個區(qū)別是我們不得不在游戲開始和結(jié)束時定時或取消定時對update的回調(diào)。編譯并運行,如果你的船撞擊太多次就會死!免費的音樂和音效安卓不支持CAF格式的聲音文件,所以我們要做的第一件事就是把原始聲音文件替換為一種可在安卓上使用的格式。打開終端,輸入如下命令(不要忘記在第一個命令中用安卓項目的真實路徑替換$PROJECT_HOME,否則命令將無法運行):cd$PROJECT_HOME/Resourcesafconvert-fWAVE-dUI8SpaceGam
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 升學(xué)宴家長致辭(匯編15篇)
- 魯抗醫(yī)藥2024年度向特定對象發(fā)行A股股票方案的論證分析報告
- 前臺行政工作總結(jié)(15篇)
- 二年級語文教學(xué)工作計劃4篇
- 學(xué)生通訊錄系統(tǒng)課程設(shè)計
- 湖南常德市2024年九年級(上)物理期末模擬試卷附參考答案
- 同學(xué)聚會校長致辭【五篇】
- 做銷售合同范本(2篇)
- 《職場溝通》電子教案 項目三 職場溝通傾聽技能準(zhǔn)備
- 2025年會計、審計及稅務(wù)服務(wù)項目建議書
- 電力建設(shè)施工質(zhì)量驗收及評定規(guī)程-第1部分:土建工程
- 醫(yī)院消防安全知識試題及答案
- 高中體育足球教案
- 2025屆內(nèi)蒙古赤峰市、呼和浩特市高考考前模擬物理試題含解析
- 三年級數(shù)學(xué)(上)計算題專項練習(xí)附答案
- 臨床醫(yī)學(xué)內(nèi)科學(xué)消化系統(tǒng)疾病教案脂肪性肝病教案
- 2024年江蘇省南通市中考英語試卷(含答案解析)
- 期末練習(xí)(試題)-2024-2025學(xué)年譯林版(三起)(2024)英語三年級上冊
- 成人中心靜脈導(dǎo)管(CVC)堵塞風(fēng)險評估及預(yù)防-2024團體標(biāo)準(zhǔn)
- DL∕T 5342-2018 110kV~750kV架空輸電線路鐵塔組立施工工藝導(dǎo)則
- 安全治本攻堅三年行動方案及重大事故隱患會議紀(jì)要(完整版)
評論
0/150
提交評論