版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Cocos2d—x制作太空射擊游戲在這篇教程里,我將向你展現(xiàn)如何利用HowtoMakeaSpaceShooteriPhoneGame里創(chuàng)建的工程制作一個(gè)太空游戲.這里有一個(gè)主要的區(qū)分--這次是用跨平臺(tái)的cocs2d—x開發(fā)。這就意味在教程里開發(fā)的游戲可以在你的iphone和andorid上運(yùn)行。當(dāng)然,再略微做修改,你可以讓它在Windows、Linux或者M(jìn)ac下運(yùn)行。深吸一口氣,我們就要開頭啦!
GettingStarted第一件事情就是下載并解壓spacegameresourcesZIPfile。就像我們?cè)谥敖坛汤锩嫣砑觾蓚€(gè)項(xiàng)目里都可以使用的C++類一樣,我們需要以同樣的方式來(lái)添加這些資源文件使ios和andriod項(xiàng)目都可以引用同樣的資源.我們把這些文件添加到Android工程的Resource名目下面,然后在ios項(xiàng)目里面引用這個(gè)名目。為了便利添加圖片和其它資源到我們的工程里,我們需要把它們添加到$PROJECT_HOME\Resources名目(請(qǐng)記住$PROJECT_HOME是你AndriodCocosd-Xproject-samplecocos2dxandroid的位置)。然而,我們的Eclipse工程只會(huì)顯示$PROJECT_HOME\android名目下的文件,所以這確實(shí)是一個(gè)問題!幸運(yùn)的是這里有一個(gè)簡(jiǎn)潔的變通方案:我們?cè)?PROJECT_HOME\Resources名目下面建立一個(gè)符號(hào)鏈接,指向$PROJECT_HOME\android\Resources名目,這樣Eclipse就可以看到它們了。接著,打開終端,在$PROJECT_HOME\android名目下運(yùn)行如下的命令:ln—s。./Resources./Resources.現(xiàn)在拷貝文件到Resources文件夾。請(qǐng)注意,由于跨平臺(tái)可移植性的緣由,你需要避開使用層級(jí)式的子名目。盡管子名目在iOS下運(yùn)行起來(lái)很好,但是它們不肯定在Android上運(yùn)行地很好。舉例來(lái)說,如果你有一個(gè)Sprites。pvr。ccz文件在一個(gè)SpriteSheet子名目里,在Android里面使用CCSpriteBatchNode::bathNodeWithFile方法將會(huì)調(diào)用失敗并返回一個(gè)空指針。所以,從spacegameresourcesZIPfile里面把單個(gè)的文件拷貝到Resource文件夾下去,請(qǐng)記得不要?jiǎng)?chuàng)建任何子名目,僅僅拷貝一個(gè)個(gè)的文件過來(lái)就可以了。在資源文件里存在一個(gè)字體的子文件夾,從字體文件夾里把全部的文件拷貝到Resources里時(shí),直接替換就可以了。此外,在壓縮文件里有個(gè)Classes子文件夾,你不必把它添加到Resources名目下,把它刪除就行了。接下來(lái),讓我們?cè)趇OS工程里引用這些文件,打開你的Xcode工程,創(chuàng)建一個(gè)新的Group叫做SharedResources.選擇新的Group,在Inspector里點(diǎn)擊按鈕選擇路徑,然后把你在Android工程里的資源文件夾選擇上。右鍵點(diǎn)擊SharedResources組,選擇添加文件,從Android文件夾里添加全部的文件。目前,你完成全部的項(xiàng)目配置了!增加一個(gè)太空飛船讓我們?cè)囋?,看是否工?打開Classes\HelloWo(hù)rldScene.h,在HelloWorld類開頭加入下面代碼(在已有public:行的上面)private:cocos2d::CCSpriteBat(yī)chNode*_batchNode;cocos2d::CCSprite*_ship;上面的代碼創(chuàng)建了兩個(gè)私有實(shí)例變量–一個(gè)是spritebatchnode,一個(gè)是太空飛船精靈現(xiàn)在切換到HelloWorldScene。cpp,在init方法里,刪除從注釋“2.addamenuitem"到方法最后的全部代碼,加入下面代碼:_bat(yī)chNode=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++的語(yǔ)法不同。在Android模擬器中編譯運(yùn)行,你應(yīng)該可以看到你的船消滅在屏幕上。最妙的事情是在iOS上也能運(yùn)行。增加視差滾動(dòng)接下來(lái),我們會(huì)加入宇宙背景,使它以視差滾動(dòng)這種很酷的方式來(lái)滾動(dòng)。首先,我們不得不在全部的類名前面加上cocos2d::這個(gè)名字空間,這太煩人了!所以在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語(yǔ)句前加入下面代碼://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)DeterminerelativemovementspeedsforspacedustandbackgroundCCPointdustSpee(cuò)d=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,bgSpee(cuò)d,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,bgSpee(cuò)d,ccp(1500,winSize.height*0.9));再一次說明,這段代碼與我們的《如何使用cocos2d制作一個(gè)太空射擊游戲》格外類似,只是有些小的句法變化。你可以比較一下2個(gè)教程在句法上的不同。Android模擬器中編譯運(yùn)行,你應(yīng)該可以看到一個(gè)宇宙場(chǎng)景的啟動(dòng),同樣的,也能在iphone上運(yùn)行。現(xiàn)在使背景滾動(dòng),在HelloWorldScene。h中預(yù)先聲明updat(yī)e方法–你可以在private或public部分加入下面代碼,但是既然updat(yī)e方法是內(nèi)部使用的,所以作為一個(gè)private方法更恰當(dāng)://scheduledUpdat(yī)evoidupdate(cocos2d::ccTimedt);然后在HelloWorldScene。cpp最后加入下面的方法實(shí)現(xiàn)voidHelloWo(hù)rld::update(ccTimedt){CCPointbackgroundScrollVert=ccp(-1000,0);_backgroundNode-〉setPosition(ccpAdd(_backgroundNode-〉getPosition(),ccpMult(backgroundScrollVert,dt)));}最后,在init方法末尾(但是在最后的return語(yǔ)句前)調(diào)用scheduleUpdate方法this—〉scheduleUpdat(yī)e();編譯運(yùn)行,你將會(huì)看到背景滾動(dòng)!持續(xù)滾動(dòng)這時(shí),你應(yīng)該注意到了背景滾出屏幕后沒有循環(huán),那么我們來(lái)修這個(gè)bug在我們的《如何使用cocos2d制作一個(gè)太空射擊游戲》教程中,我們通過Objective-c的分類(category)擴(kuò)展了CCParallaxNode類來(lái)實(shí)現(xiàn).不幸的是,C++中是不存在分類的,所以我們需要借助繼承來(lái)實(shí)現(xiàn)之.我們將去定義一個(gè)CCParallaxNode擴(kuò)展類來(lái)擴(kuò)展標(biāo)準(zhǔn)的CCParallaNode。這樣做雖然不如Objective—C優(yōu)雅,但是有時(shí)我們需要為軟件可移植性做一些犧牲.在Xcode中,在Glassesgroup上單擊右鍵,選擇NewFile。選擇iOS\CandC++\C++文件末尾,點(diǎn)擊Next,為他命名為CCParallaxNodeExtras.cpp,存儲(chǔ)到$PROJECT_HOME\Classes,然后點(diǎn)擊創(chuàng)建。然后重復(fù)上述過程,但要選擇iOS\CandC++\Header文件模板,來(lái)創(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添加一個(gè)新的方法(incrementOffset),我們用它來(lái)更新parallaxnode每個(gè)child的位置。當(dāng)背景移動(dòng)出屏幕左端的時(shí)候我們會(huì)使用它來(lái)將背景放到屏幕的右端,來(lái)實(shí)現(xiàn)持續(xù)的滾動(dòng)。將下面的代碼替換到CCParallaxNodeExtras。cpp#include"CCParallaxNodeExtras.h"//HacktoaccessCCPointObject(whichisnotapublicclass)classCCPointObject:CCObject{CC_SYNTHESIZE(CCPoint,m_tRatio,Rat(yī)io)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中并不是公共的類,所以我們需要借住一些小手段來(lái)hack。(重定義它為我們的類,并具有相同的簽名)。雖然它能工作的很好,但是他的缺點(diǎn)是,如果CCPointObject改動(dòng)了,你這里也要跟著改動(dòng),否則程序會(huì)崩潰.代碼的重點(diǎn)是incrementOffset方法,他和《如何使用cocos2d制作一個(gè)太空射擊游戲》中的實(shí)現(xiàn)相同,只是用了不同的語(yǔ)言。下一步,選擇HelloWorldScene.h,在文件頂部的#include語(yǔ)句之后添加這些代碼:#include"CCParallaxNodeExtras.h"然后像下面的代碼一樣,將private區(qū)域中_backgroundNode定義由CCParallaNode改為CCParallaxNodeExtrasCCParallaxNodeExtras*_backgroundNode;然后選擇HelloWorldScene.cpp用下面的代碼替換掉section#1(_backgroundNode創(chuàng)建的地方)的第一行。_backgroundNode=CCParallaxNodeExtras::node();最后,添加下面的代碼,到updat(yī)e方法的底部。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)庫(kù))實(shí)現(xiàn)的CCArray。我們用可以幫我們自動(dòng)釋放對(duì)象的arrayWithCapacity構(gòu)造函數(shù).注意這里同樣也有一個(gè)更先進(jìn)的CCMutableArray來(lái)用于存儲(chǔ)集合元素。最后的修改-由于你添加了新文件,你需要把它添加到android工程的Makefile來(lái)讓他編譯正確。于是用Eclipse打開Classes\Android。mk然后改動(dòng)行LOCAL_SRC_FILES為下面的代碼。LOCAL_SRC_FILES:=AppDelegate。cpp\HelloWorldScene.cpp\CCParallaxNodeExtras.cpp編譯運(yùn)行,現(xiàn)在背景可以無(wú)限滾動(dòng)了!添加星星添加星星是格外簡(jiǎn)潔的,只是添加下面的代碼到HelloWo(hù)rldScene.cpp的init方法的return之前.HelloWorld::addChild(CCParticleSystemQuad::particleWithFile(”Stars1.plist"));HelloWorld::addChild(CCParticleSystemQuad::particleWithFile("Stars2.plist"));HelloWo(hù)rld::addChild(CCParticleSystemQuad::particleWithFile("Stars3.plist”));編譯運(yùn)行,漂亮!他已經(jīng)開頭看起來(lái)像一個(gè)太空游戲了.使用加速計(jì)來(lái)移動(dòng)飛船在之前的Cocos2Dspaceshootertutorial里面,我們使用ios的加速計(jì)api來(lái)檢測(cè)加速計(jì)輸入.很明顯,ios下面的加速計(jì)api是不行以跨平臺(tái)的,那么我們?cè)趺崔k呢?幸運(yùn)的是,cocos2d-x對(duì)加速計(jì)進(jìn)行了封裝,我們可以不用關(guān)心簡(jiǎn)略平臺(tái)api,直接使用抽象后的加速計(jì)api就可以了。讓我們看看它是怎么工作的吧.首先,在HelloWorldScnee(cuò).H頭文件里面添加一個(gè)新的私有成員變量:float_shipPointsPerSecY;然后,添加一個(gè)新的public方法聲明:virtualvoiddidAccelerate(CCAcceleration*pAccelerationValue);然后在HelloWorldScene.cpp的init方法的return語(yǔ)句之前添加下列代碼:this->setIsAccelerometerEnabled(true);接下來(lái),在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;float(yī)minY=_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ù)包含一個(gè)CCAccelerat(yī)ion對(duì)象,它包含加速計(jì)的x、y和z三個(gè)方向的數(shù)據(jù)。我們目前只需要使用x方向的加速計(jì)數(shù)據(jù)就行了,由于我們是沿著設(shè)備的x軸進(jìn)行運(yùn)動(dòng)的。注意:cocos2d-x會(huì)依據(jù)你的設(shè)備是處于portait模式還是landscape模式來(lái)切換加速計(jì)的x和y方向的值。如果是Landscaperight(也就是我們目前的情況),接收到的x值其實(shí)是-y,而y值是x。如果是Landscapeleft那么接收到的x值是y,而y值是—x.有點(diǎn)頭暈了?呵呵編譯,然后在你的iphone和android設(shè)備上測(cè)試一下吧,現(xiàn)在你可以傾斜你的設(shè)備來(lái)移動(dòng)飛船啦!當(dāng)然,此時(shí),你不能在模擬器上進(jìn)行測(cè)試,必須使用真機(jī)。添加隕石是時(shí)候給游戲添加一些隕石了!首先在HelloWorldScene.h里面添加下面一些實(shí)例變量:CCMutableArray*_asteroids;int_nextAsteroid;float_nextAsteroidSpawn;然后,添加一些新的公有方法聲明:floatrandomValueBetween(floatlow,float(yī)high);voidsetInvisible(CCNode*node);floatgetTimeTick();接下來(lái),回到HelloWorldScene.CPP,然后在文件最后添加剛剛的那些幫助方法的實(shí)現(xiàn):float(yī)HelloWo(hù)rld::randomValueBetween(float(yī)low,floathigh){return(((float)arc4random()/0xFFFFFFFFu)*(high—low))+low;}floatHelloWo(hù)rld::getTimeTick(){timevaltime;gettimeofday(&amp;time,NULL);unsignedlongmillisecs=(time。tv_sec*1000)+(time。tv_usec/1000);return(float)millisecs;}randomValueBetween是一個(gè)可以獲得指定范圍內(nèi)的隨機(jī)浮點(diǎn)數(shù)的幫助方法。而getTimeTick是一種可移植的方式來(lái)得到毫秒級(jí)別的時(shí)間。接下來(lái),在init方法的最后創(chuàng)建一個(gè)隕石的數(shù)組:#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類來(lái)存儲(chǔ)ccsprite的數(shù)組。注意,我們這里手動(dòng)調(diào)用new操作符,而不是使用arrayWithCapacity來(lái)創(chuàng)建對(duì)象,這樣可以避開使用autorelease機(jī)制。最后,在update方法底部添加下列代碼:floatcurTimeMillis=getTimeTick();if(curTimeMillis>_nextAsteroidSpawn){floatrandMillisecs=randomValueBetwee(cuò)n(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—〉runA(yù)ction(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機(jī)制太像了!注意:由于CCSequence::actions方法的參數(shù)列表采納的是變長(zhǎng)參數(shù),你其實(shí)可以忽視掉最后一個(gè)NULL參數(shù),由于對(duì)于c++來(lái)講,這個(gè)參數(shù)沒有意義。但是,考慮到兼容性的緣由,由于cocos2d-x開發(fā)者想保持跟cocos2d的高度全都,所以,這里需要一個(gè)NULL終止符。如果你在你的代碼里面不供應(yīng)的話,那么你的程序?qū)?huì)崩潰。最后一步就是添加setInvisible回調(diào)函數(shù)的實(shí)現(xiàn):voidHelloWorld::setInvisible(CCNode*node){node—>setIsVisible(false);}編譯并運(yùn)行,有隕石!下面是iphone3GS的運(yùn)行效果截圖:下面是AndroidSamsungGalaxyS的運(yùn)行效果截圖:放射激光是時(shí)候讓我們的飛船放射激光了!在HelloWorldScene。h里面添加下列私有成員變量:CCMutableArray*_shipLasers;int_nextShipLaser;現(xiàn)在,添加一個(gè)新的公有方法聲明:virtualvoidccTouchesBegan(cocos2d::CCSet*touches,cocos2d::CCEvent*event);然后,在HelloWo(hù)rldScene。cpp的init方法的return語(yǔ)句之前添加下列代碼:#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);最后,在文件的底部實(shí)現(xiàn)ccTouchesBegan方法;voidHelloWo(hù)rld::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));}編譯并運(yùn)行,現(xiàn)在你可以放射激光了!下面是iphone3GS下面的運(yùn)行截圖:下面是AndroidSamsungGalaxyS的運(yùn)行截圖:簡(jiǎn)潔的碰撞檢測(cè)接下來(lái),我們想添加一些代碼來(lái)檢測(cè)激光和小行星間的碰撞,以及當(dāng)小行星被撞擊時(shí)爆炸。完成這項(xiàng)功能的代碼和《如何使用cocos2d制作一個(gè)太空射擊游戲》中的相當(dāng)相像,但是用到了一些新的語(yǔ)法。注意,我們會(huì)介紹C++迭代器來(lái)處理CCMutableArray。首先,在HelloWorldScene.h添加一個(gè)新的私有變量: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--;}}編譯并運(yùn)行,現(xiàn)在你可以使小行星爆炸了!當(dāng)然,你會(huì)發(fā)現(xiàn)當(dāng)激光碰撞到小行星,他們并沒有爆炸就消滅了。這是由于我們沒有為爆炸添加粒子效果.之前我們已經(jīng)將星星添加到了粒子系統(tǒng)中,依據(jù)最初的教程,把爆炸加入粒子系統(tǒng)將是相當(dāng)簡(jiǎn)潔的任務(wù)。把這個(gè)當(dāng)成額外的課外作業(yè)吧!成功/失敗檢測(cè)將成功或失敗的檢測(cè)代碼轉(zhuǎn)換到Cocos2D-X也是直截了當(dāng)?shù)?切換回HelloWorldScene.h并在類的聲明前添加一個(gè)枚舉變量:typedefenum{KENDREASONWIN,KENDREASONLOSE}EndReason;現(xiàn)在在HelloWo(hù)rld類添加兩個(gè)私有變量:double_gameOverTime;bool_gameOver;接下來(lái),添加兩個(gè)私有方法的聲明;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é)尾添加新方法的實(shí)現(xiàn):voidHelloWorld::restartTapped(){CCDirector::sharedDirector()->replaceScene(CCTransitionZoomFlipX::transitionWithDuration(0。5,this—〉scene()));//reschedulethis->scheduleUpdat(yī)e();}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—>runA(yù)ction(CCScaleTo::actionWithDuration(0。5,1。0));//Terminateupdatecallbackthis->unscheduleUpdat(yī)e();}注意最初的代碼版本和Cocos2D—X代碼版本的一個(gè)區(qū)分是我們不得不在游戲開頭和結(jié)束時(shí)定時(shí)或取消定時(shí)對(duì)update的回調(diào)。編譯并運(yùn)行,如果你的船撞擊太多次就會(huì)死!免費(fèi)的音樂和音效安卓不支持CAF格式的聲音文件,所以我們要做的第一件事就是把原始聲音文件替換為一種可在安卓上使用的格式。打開終端,輸入如下命令(不要忘記在第一個(gè)命令中用安卓項(xiàng)目的真實(shí)路徑替換$PROJECT_HOME,否則命令將無(wú)法運(yùn)行):cd$PROJECT_HOME/Resourcesafconvert—fWAVE—dUI8SpaceGame.cafSpaceGame。wavafconvert—fWAVE-dUI8explosion_large。cafexplosion_large.wavafconvert-fWAVE—dUI8laser_ship。caflaser_ship.wav就像你可能猜到的那樣,上面的命令將把文件從CAF格式轉(zhuǎn)換為WAV格式。一旦你轉(zhuǎn)換完文件,回到
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 服務(wù)業(yè)房產(chǎn)買賣合同樣板
- 鐵塔檢修爬架租賃協(xié)議
- 環(huán)衛(wèi)設(shè)計(jì)瓦工施工合同范本
- 物業(yè)裝修監(jiān)管補(bǔ)充協(xié)議
- 綠色建筑水電路施工合同
- 音響工程合伙合同
- 醫(yī)療傳媒企業(yè)專業(yè)技術(shù)人才合同
- 水泥生產(chǎn)承銷協(xié)議書范本
- 智能酒店安全防護(hù)安裝協(xié)議
- 員工出行管理規(guī)則
- 南方黑芝麻集團(tuán)有限責(zé)任公司swot分析
- AutoCAD計(jì)算機(jī)繪圖全套教程
- 機(jī)電控制及可編程序控制器技術(shù)課程設(shè)計(jì)1
- 《變動(dòng)成本法在企業(yè)的應(yīng)用案例分析(論文)》
- 血液透析患者營(yíng)養(yǎng)評(píng)估方法
- YY/T 0698.2-2022最終滅菌醫(yī)療器械包裝材料第2部分:滅菌包裹材料要求和試驗(yàn)方法
- YY/T 0698.9-2009最終滅菌醫(yī)療器械包裝材料第9部分:可密封組合袋、卷材和蓋材生產(chǎn)用無(wú)涂膠聚烯烴非織造布材料要求和試驗(yàn)方法
- JJF 1619-2017互感器二次壓降及負(fù)荷測(cè)試儀校準(zhǔn)規(guī)范
- GB/T 9386-2008計(jì)算機(jī)軟件測(cè)試文檔編制規(guī)范
- GB/T 213-2003煤的發(fā)熱量測(cè)定方法
- 2022年5月14日起實(shí)施的法醫(yī)類司法鑒定執(zhí)業(yè)分類規(guī)定
評(píng)論
0/150
提交評(píng)論