Cocosdx制作太空射擊游戲0_第1頁
Cocosdx制作太空射擊游戲0_第2頁
Cocosdx制作太空射擊游戲0_第3頁
Cocosdx制作太空射擊游戲0_第4頁
Cocosdx制作太空射擊游戲0_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Cocos2d-x制作太空射擊游戲在這篇教程里,我將向你展現(xiàn)如何利用HowtoMakeaSpaceShooteriPhoneGame里創(chuàng)建的工程制作一個太空游戲。這里有一個主要的區(qū)分-—這次是用跨平臺的cocs2d—x開發(fā).這就意味在教程里開發(fā)的游戲可以在你的iphone和andorid上運行.當然,再略微做修改,你可以讓它在Windows、Linux或者Mac下運行。這篇教程基于我們在《HYPERLINK"http://www.cocoachina.com/gamedev/gameengine/2012/0428/4206.html"COCOS2D-X跨ANDROID&IOS平臺開發(fā)入門教程PART—1》里所創(chuàng)建的內容.如果你還沒有籌備好,那么最好先弄懂前面的工程,然后再連續(xù)。深吸一口氣,我們就要開頭啦!

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.現(xiàn)在拷貝文件到Resources文件夾。請注意,由于跨平臺可移植性的緣由,你需要避開使用層級式的子名目。盡管子名目在iOS下運行起來很好,但是它們不肯定在Android上運行地很好。舉例來說,如果你有一個Sprites.pvr。ccz文件在一個SpriteSheet子名目里,在Android里面使用CCSpriteBat(yī)chNode::bat(yī)hNodeWithFile方法將會調用失敗并返回一個空指針。所以,從spacegameresourcesZIPfile里面把單個的文件拷貝到Resource文件夾下去,請記得不要創(chuàng)建任何子名目,僅僅拷貝一個個的文件過來就可以了。在資源文件里存在一個字體的子文件夾,從字體文件夾里把全部的文件拷貝到Resources里時,直接替換就可以了。此外,在壓縮文件里有個Classes子文件夾,你不必把它添加到Resources名目下,把它刪除就行了。當全部的籌備工作完成后就會是下面的樣子:接下來,讓我們在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)建了兩個私有實例變量–一個是spritebat(yī)chnode,一個是太空飛船精靈現(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模擬器中編譯運行,你應該可以看到你的船消滅在屏幕上最妙的事情是在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上運行現(xiàn)在使背景滾動,在HelloWorldScene.h中預先聲明update方法–你可以在private或public部分加入下面代碼,但是既然updat(yī)e方法是內部使用的,所以作為一個privat(yī)e方法更恰當://scheduledUpdatevoidupdat(yī)e(cocos2d::ccTimedt);然后在HelloWorldScene。cpp最后加入下面的方法實現(xiàn)voidHelloWorld::update(ccTimedt){CCPointbackgroundScrollVert=ccp(-1000,0);_backgroundNode—>setPosition(ccpAdd(_backgroundNode—>getPosition(),ccpMult(backgroundScrollVert,dt)));}最后,在init方法末尾(但是在最后的return語句前)調用scheduleUpdate方法this->scheduleUpdat(yī)e();編譯運行,你將會看到背景滾動!持續(xù)滾動這時,你應該注意到了背景滾出屏幕后沒有循環(huán),那么我們來修這個bug在我們的《如何使用cocos2d制作一個太空射擊游戲》教程中,我們通過Objective—c的分類(category)擴展了CCParallaxNode類來實現(xiàn)。不幸的是,C++中是不存在分類的,所以我們需要借助繼承來實現(xiàn)之。我們將去定義一個CCParallaxNode擴展類來擴展標準的CCParallaNode.這樣做雖然不如Objective-C優(yōu)雅,但是有時我們需要為軟件可移植性做一些犧牲。在Xcode中,在Glassesgroup上單擊右鍵,選擇NewFile.選擇iOS\CandC++\C++文件末尾,點擊Next,為他命名為CCParallaxNodeExtras.cpp,存儲到$PROJECT_HOME\Classes,然后點擊創(chuàng)建。然后重復上述過程,但要選擇iOS\CandC++\Header文件模板,來創(chuàng)建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這里我們?yōu)镃CParallaxNode添加一個新的方法(incrementOffset),我們用它來更新parallaxnode每個child的位置。當背景移動出屏幕左端的時候我們會使用它來將背景放到屏幕的右端,來實現(xiàn)持續(xù)的滾動。將下面的代碼替換到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制作一個太空射擊游戲》中的實現(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++標準庫)實現(xiàn)的CCArray.我們用可以幫我們自動釋放對象的arrayWithCapacity構造函數。注意這里同樣也有一個更先進的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"));編譯運行,漂亮!他已經開頭看起來像一個太空游戲了.使用加速計來移動飛船在之前的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;}最后,在updat(yī)e方法的底部添加如下代碼: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回調函數包含一個CCAccelerat(yī)ion對象,它包含加速計的x、y和z三個方向的數據.我們目前只需要使用x方向的加速計數據就行了,由于我們是沿著設備的x軸進行運動的。注意:cocos2d—x會依據你的設備是處于portait模式還是landscape模式來切換加速計的x和y方向的值。如果是Landscaperight(也就是我們目前的情況),接收到的x值其實是-y,而y值是x。如果是Landscapeleft那么接收到的x值是y,而y值是—x。有點頭暈了?呵呵編譯,然后在你的iphone和android設備上測試一下吧,現(xiàn)在你可以傾斜你的設備來移動飛船啦!當然,此時,你不能在模擬器上進行測試,必須使用真機.添加隕石是時候給游戲添加一些隕石了!首先在HelloWorldScene。h里面添加下面一些實例變量:CCMutableArray*_asteroids;int_nextAsteroid;float_nextAsteroidSpawn;然后,添加一些新的公有方法聲明:floatrandomValueBetween(floatlow,float(yī)high);voidsetInvisible(CCNode*node);floatgetTimeTick();接下來,回到HelloWorldScene.CPP,然后在文件最后添加剛剛的那些幫助方法的實現(xiàn):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方法的最后創(chuàng)建一個隕石的數組:#defineKNUMASTEROIDS15_asteroids=newCCMutableArray();for(inti=0;i<KNUMASTEROIDS;++i){CCSprite*asteroid=CCSprite::spriteWithSpriteFrameName(”asteroid。png”);asteroid->setIsVisible(false);_bat(yī)chNode->addChild(asteroid);_asteroids->addObject(asteroid);}這里,我們使用cocos2d-x的CCMutableArray類來存儲ccsprite的數組。注意,我們這里手動調用new操作符,而不是使用arrayWithCapacity來創(chuàng)建對象,這樣可以避開使用autorelease機制。最后,在update方法底部添加下列代碼:floatcurTimeMillis=getTimeTick();if(curTimeMillis>_nextAsteroidSpawn){floatrandMillisecs=randomValueBetween(0.20,1。0)*1000;_nextAsteroidSpawn=randMillisecs+curTimeMillis;float(yī)randY=randomValueBetween(0.0,winSize.height);floatrandDurat(yī)ion=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::actionWithDurat(yī)ion(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開發(fā)者想保持跟cocos2d的高度全都,所以,這里需要一個NULL終止符。如果你在你的代碼里面不供應的話,那么你的程序將會崩潰。最后一步就是添加setInvisible回調函數的實現(xiàn):voidHelloWorld::setInvisible(CCNode*node){node->setIsVisible(false);}編譯并運行,有隕石!下面是iphone3GS的運行效果截圖:下面是AndroidSamsungGalaxyS的運行效果截圖:放射激光是時候讓我們的飛船放射激光了!在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::actionWithDurat(yī)ion(0.5,ccp(winSize.width,0)),CCCallFuncN::actionWithTarget(this,callfuncN_selector(HelloWorld::setInvisible)),NULL//DONOTFORGETTOTERMINATEWITHNULL));}編譯并運行,現(xiàn)在你可以放射激光了!下面是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——;}}編譯并運行,現(xiàn)在你可以使小行星爆炸了!當然,你會發(fā)現(xiàn)當激光碰撞到小行星,他們并沒有爆炸就消滅了.這是由于我們沒有為爆炸添加粒子效果。之前我們已經將星星添加到了粒子系統(tǒng)中,依據最初的教程,把爆炸加入粒子系統(tǒng)將是相當簡潔的任務。把這個當成額外的課外作業(yè)吧!成功/失敗檢測將成功或失敗的檢測代碼轉換到Cocos2D-X也是直截了當的。切換回HelloWorldScene.h并在類的聲明前添加一個枚舉變量:typedefenum{KENDREASONWIN,KENDREASONLOSE}EndReason;現(xiàn)在在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);}最后,在文件的結尾添加新方法的實現(xiàn):voidHelloWorld::restartTapped(){CCDirector::sharedDirector()->replaceScene(CCTransitionZoomFlipX::transitionWithDurat(yī)ion(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ū)分是我們不得不在游戲開頭和結束時定時或取消定時對update的回調。編譯并運行,如果你的船撞擊太多次就會死!免費的音樂和音效安卓不支持CAF格式的聲音文件,所以我們要做的第一件事就是把原始聲音文件替換為一種可在安卓上使用的格式。打開終端,輸入如下命令(不要忘記在第一個命令中用安卓項目的真實路徑替換$PROJECT_HOME,否則命令將無法運行):cd$PROJECT_HOME/Resourcesafconvert-fWAVE-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論