Cocos2d-x制作太空射擊游戲_第1頁(yè)
Cocos2d-x制作太空射擊游戲_第2頁(yè)
Cocos2d-x制作太空射擊游戲_第3頁(yè)
Cocos2d-x制作太空射擊游戲_第4頁(yè)
Cocos2d-x制作太空射擊游戲_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Cocos2d-x 制作太空射擊游戲How to Make a Space Shooter iPho ne Game里創(chuàng)在這篇教程里,我將向你展示如何利用 建的工程制作一個(gè)太空游戲。這里有一個(gè)主要的區(qū)別 一一這次是用跨平臺(tái)的 cocs2d-x開(kāi)發(fā)。這就意味在教程里開(kāi)發(fā)的游戲可以在你的iphone和andorid上運(yùn)行。當(dāng)然,再稍微做修改,你可以讓它在 Windows、Linux或者 Mac下運(yùn)行。這篇教程基于我們?cè)贑OCOS2D-X跨ANDROID&IOS 平臺(tái)開(kāi)發(fā)入門(mén)教程 PART-1里所 創(chuàng)建的內(nèi)容。如果你還沒(méi)有準(zhǔn)備好,那么最好先弄懂前面的工程,然后再繼續(xù)。深吸一口氣,我們就要開(kāi)始

2、啦!Getti ng Started第一件事情就是下載并解壓space game resources ZIP file 。就像我們?cè)谥敖坛汤锩嫣砑觾蓚€(gè)項(xiàng)目里都可以使用的C+類(lèi)一樣,我們需要以同樣的方式來(lái)添加這些資源文件使ios和andriod項(xiàng)目都可以引用同樣的資源。我們把這些文件添加到An droid工程的Resource目錄下面,然后在ios項(xiàng)目里面引用這個(gè)目錄。為了方便添加圖片和其它資源到我們的工程里,我們需要把它們添加到$PROJECT_HOMEResources目錄(請(qǐng)記住 $PROJECT_HOME 是你 Andriod Cocosd-Xproject-samplecocos2d

3、xandroid的位置)。然而,我們的 Eclipse工程只會(huì)顯示$PROJECT_HOMEa ndroid目錄下的文件,所以這確實(shí)是一個(gè)問(wèn)題!幸運(yùn)的是這里有一個(gè)簡(jiǎn)單的變通方案:我們?cè)?PROJECT_HOMEResources目錄下面建立一個(gè)符號(hào)鏈接,指向$PROJECT_HOMEandroid'Resources目錄,這樣Eclipse就可以看至吃們了。接著,打開(kāi)終端,在 $PROJECT_HOMEa ndroid目錄下運(yùn)行如下的命令:1.In -s ./Resources ./Resources.現(xiàn)在拷貝文件到 Resources文件夾。請(qǐng)注意,由于跨平臺(tái)可移植性的原因,你需要避

4、免使 用層級(jí)式的子目錄。盡管子目錄在iOS下運(yùn)行起來(lái)很好,但是它們不一定在An droid上運(yùn)行地很好。舉例來(lái)說(shuō),如果你有一個(gè)Sprites.pvr.ccz 文件在一個(gè) SpriteSheet子目錄里,在An droid里面使用CCSpriteBatchNode:bathNodeWithFile方法將會(huì)調(diào)用失敗并返回一個(gè)空指針。Resource 文件夾下去, 在資源文件里存在一個(gè) 里時(shí),直接替換就可以Resources 目錄下,所以,從 space game resources ZIP file里面把單個(gè)的文件拷貝到請(qǐng)記得不要?jiǎng)?chuàng)建任何子目錄,僅僅拷貝一個(gè)個(gè)的文件過(guò)來(lái)就可以了。字體的子文件夾,從

5、字體文件夾里把所有的文件拷貝到Resources了。此外,在壓縮文件里有個(gè) Classes子文件夾,你不必把它添加到 把它刪除就行了。當(dāng)所有的準(zhǔn)備工作完成后就會(huì)是下面的樣子: i vn m ex q jndrcud.號(hào) 11 口 I I All.旦 i土terneAndFtMdMjjiifesLxml ant prouertleiihbyiid.xmj 冋* R IhtH loCdil.prpeFiii曲J no建ttT j ClassesAndrwil.<nkb- AppO+hfiHie.cpo h AppOhrge.h e- Hp KiaWiif ld<rfie. c w h

6、HeltoWwWSC rne. hT S| Kjt sourai/ app config tut wxfAnat.pmg岡 fronEipKeust.pfig卻一訝I(yíng)A斗.常勺阿上 Ji ntts u*iriw.prjg bg_*ipx Ln;|iingrnd-ly,ipri4 bfl_L|3 取川 MlQinahPlMg (iTyran. comM Ht-M. 14 IJGKjd接下來(lái),讓我們?cè)趇OS工程里引用這些文件,打開(kāi)你的Xcode工程,創(chuàng)建一個(gè)新的 Group叫做SharedResources 。選擇新的Group,在Inspector里點(diǎn)擊按鈕選擇路徑,然后把你在 An droid

7、工程里的資源文件夾選擇上。 IdentityCroup NameSharedResourcesPathRelative to Group:,./././'Projects/ iPhone; Libraries/ cocos2d-x-1.0.1/ »rplecoc:Q5dxandrai d/ResourcesFull Pat? . Users.'rwcnderhchIProject 3/ iPhone/Libraries /cam2d- x-LO.l/嶺小屮代“卯叫呼密com / Resources右鍵點(diǎn)擊SharedResources 組,選擇添加文件,從 An dr

8、oid文件夾里添加所有的文件。目 前,你完成所有的項(xiàng)目配置了!增加一個(gè)太空飛船讓我們?cè)囋?,看是否工作!打開(kāi)ClassesHelloWorldScene.h,在HelloWorld類(lèi)開(kāi)頭加入下面代碼(在已有 public:行的上面)1. private:2.2. cocos2d:CCSpriteBatchNode * _batchNode;4.3. cocos2d:CCSprite * _ship;上面的代碼創(chuàng)建了兩個(gè)私有實(shí)例變量-一個(gè)是sprite batch node ,一個(gè)是太空飛船精靈現(xiàn)在切換到 HelloWorldScene.cpp ,在init方法里,刪除從注釋 一2. add a

9、menu item 到方法 最后的所有代碼,加入下面代碼:1. _batchNode = CCSpriteBatchNode:batchNodeWithFile("Sprites.pvr.ccz");2.2. this->addChild(_batchNode);4.3. CCSpriteFrameCache:sharedSpriteFrameCache()->addSpriteFrames WithFile("Sprites.plist");6.4. _ship = CCSprite:spriteWithSpriteFrameName(&q

10、uot;SpaceFlier_sm_1.p ng");8.9.CCSize wi nSize = CCDirector:sharedDirector()->getWi nSize();10.11. _ship->setPositio n(ccp(wi nSize.width * 0.1, win Size.height *0.5);12.12. _batchNode->addChild(_ship, 1);14.13. return true;注意這些代碼與你過(guò)去使用的Objective-C版的cocos2d非常類(lèi)似。API是有很多相同的地方的,僅僅是有一些與C+的

11、語(yǔ)法不同。在An droid模擬器中編譯運(yùn)行,你應(yīng)該可以看到你的船出現(xiàn)在屏幕上最妙的事情是在iOS上也能運(yùn)行增加視差滾動(dòng)接下來(lái),我們會(huì)加入宇宙背景,使它以視差滾動(dòng)這種很酷的方式來(lái)滾動(dòng)。首先,我們不得不在所有的類(lèi)名前面加上cocos2d:這個(gè)名字空間,這太煩人了!所以在HelloWorldSce ne.h 類(lèi)聲明前加入下面行:1.USING_NS_CC ;接著在HelloWorld的private部分加入一些新的變量(注意我們不再需要加 cocos2d前綴):1. CCParallaxNode *_backgrou ndNode;2.2. CCSprite *_spacedust1;4.3. C

12、CSprite *_spacedust2;6.4. CCSprite *_pla nets un rise;8.5. CCSprite *_galaxy;10.6. CCSprite *_spaciala no maly;12.13.CCSprite *_spaciala no maly2;然后,在HelloWorldSce ne.cpp 的in it方法中,return語(yǔ)句前加入下面代碼:1. / 1) Create the CCParallaxNode2.3._backgrou ndNode = CCParallaxNode: no de() ; 14.5. this->addChi

13、ld(_backgroundNode,-1) ;6.7. / 2) Create the sprites we'll add to the CCParallaxNode8.9. _spacedust1 = CCSprite:spriteWithFile("bg_front_spacedust.png");10.11. _spacedust2 = CCSprite:spriteWithFile("bg_front_spacedust.png");12.13._planetsunrise =CCSprite:spriteWithFile("

14、bg_planetsunrise.png");14.15._galaxy = CCSprite:spriteWithFile("bg_galaxy.png");16.17._spacialanomaly =CCSprite:spriteWithFile("bg_spacialanomaly.png");18.19._spacialanomaly2 =CCSprite:spriteWithFile("bg_spacialanomaly2.png");20.21./ 3) Determine relative movement

15、speeds for space dust andbackground22.23. CCPoint dustSpeed = ccp(0.1, 0.1);24.25.CCPoint bgSpeed = ccp(0.05, 0.05);26.27./ 4) Add children to CCParallaxNode28.29._backgroundNode->addChild(_spacedust1, 0 , dustSpeed ,ccp(0,winSize.height/2) ); / 230.31._backgroundNode->addChild(_spacedust2, 0

16、, dustSpeed ,ccp( _spacedust1->getContentSize().width,winSize.height/2);32.33._backgroundNode->addChild(_galaxy,-1, bgSpeed ,ccp(0,winSize.height * 0.7);34.35._backgroundNode->addChild(_planetsunrise,-1 ,bgSpeed,ccp(600,winSize.height * 0);37. _backgro un dNode->addChild(_spaciala no mal

17、y,-1, bgSpeed,ccp(900,w in Size.height * 0.3);38.38. _backgro un dNode->addChild(_spaciala no maly2,-1, bgSpeed,ccp(1500,w in Size.height * 0.9);再一次說(shuō)明,這段代碼與我們的如何使用cocos2d制作一個(gè)太空射擊游戲非常類(lèi)似,只是有些小的句法變化。你可以比較一下2個(gè)教程在句法上的不同。An droid模擬器中編譯運(yùn)行,你應(yīng)該可以看到一個(gè)宇宙場(chǎng)景的啟動(dòng)同樣的,也能在iphone上運(yùn)行1231崩6790QW j二1VU1 0FAS :D.FGH1 .

18、KLCT1 ”養(yǎng)CV8NM5¥«/ _yTolnn. t60.0丿現(xiàn)在使背景滾動(dòng),在 HelloWorldScene.h中預(yù)先聲明update方法-你可以在private或public部分加入下面代碼,但是既然update方法是內(nèi)部使用的,所以作為一個(gè)private方法更恰當(dāng):1. / scheduled Update2.3.void update(cocos2d:ccTime dt);然后在HelloWorldScene.cpp最后加入下面的方法實(shí)現(xiàn)1. void HelloWorld:update(ccTime dt) 2.2. CCPoi nt backgrou nd

19、ScrollVert = ccp(-1000,0);4.5._backgro un dNode->setPositi on( ccpAdd(_backgro un dNode->getPositi on(), ccpMult(backgrou ndScrollVert,dt);6.7.最后,在init方法末尾(但是在最后的return語(yǔ)句前)調(diào)用scheduleUpdate 方法1.this->scheduleUpdate();編譯運(yùn)行,你將會(huì)看到背景滾動(dòng)!持續(xù)滾動(dòng)bug這時(shí),你應(yīng)該注意到了背景滾出屏幕后沒(méi)有循環(huán),那么我們來(lái)修這個(gè) 在我們的 如何使用 cocos2d 制作一個(gè)

20、太空射擊游戲教程中,我們通過(guò) Objective-c 的 分類(lèi) (category) 擴(kuò)展了 CCParallaxNode 類(lèi)來(lái)實(shí)現(xiàn)。不幸的是, C+ 中是不存在分類(lèi)的,所以我們需要借助繼承來(lái)實(shí)現(xiàn)之。我們將去定義一個(gè) CCParallaxNode 擴(kuò)展類(lèi)來(lái)擴(kuò)展標(biāo)準(zhǔn)的 CCParallaNode 。這樣做雖然不 如 Objective-C 優(yōu)雅,但是有時(shí)我們需要為軟件可移植性做一些犧牲。在 Xcode 中,在 Glasses group 上單擊右鍵,選擇 New File 。選擇 iOSC and C+C+ 文 件末尾,點(diǎn)擊 Next ,為他命名為 CCParallaxNodeExtras.cp

21、p ,存儲(chǔ)到 $PROJECT_HOMEClasses ,然后點(diǎn)擊創(chuàng)建。然后重復(fù)上述過(guò)程,但要選擇 iOSC and C+Header 文件模板,來(lái)創(chuàng)建 CCParallaxNodeExtras.h用下面的代碼替換 CCParallaxNodeExtras.h 中的內(nèi)容1. #ifndef2.3.Cocos2DxFirstIosSample_CCParallaxNodeExtras_h #define4.5.Cocos2DxFirstIosSample_CCParallaxNodeExtras_h #include“cocos2d.h ” U SING_NS_CC; class CCParal

22、laxNodeExtras : public CCParallaxNode6.7. public : / Need to provide our own constructorCCParallaxNodeExtras() ; / just to avoid ugly later cast and also for safety8.9.static CCParallaxNodeExtras * node() ; / Facility method (weexpect to have it soon in COCOS2DX) void incrementOffset(CCPoint10.11. o

23、ffset,CCNode* node) ; ; #endif這里我們?yōu)?CCParallaxNode 添加一個(gè)新的方法 (incrementOffset) ,我們用它來(lái)更新 parallax node 每個(gè) child 的位置。 當(dāng)背景移動(dòng)出屏幕左端的時(shí)候我們會(huì)使用它來(lái)將背景放到屏幕的 右端,來(lái)實(shí)現(xiàn)持續(xù)的滾動(dòng)。 將下面的代碼替換到 CCParallaxNodeExtras.cpp1. #include "CCParallaxNodeExtras.h"2.3./ Hack to access CCPointObject (which is not a public class

24、)4.5. class CCPointObject : CCObject 6.7.CC_SYNTHESIZE(CCPoint, m_tRatio, Ratio)8.9.CC_SYNTHESIZE(CCPoint, m_tOffset, Offset)10.11.CC_SYNTHESIZE(CCNode *,m_pChild, Child) / weak ref12.13. ;14.15./ Need to provide our own constructor16.17.CCParallaxNodeExtras:CCParallaxNodeExtras() 18.19.CCParallaxNo

25、de:CCParallaxNode() ; / call parentconstructor3.CCParallaxNodeExtras * CCParallaxNodeExtras:node() 24.25. return new CCParallaxNodeExtras() ;9.void CCParallaxNodeExtras:incrementOffset(CCPointoffset,CCNode* node)30.31. for( unsigned int i=0;i < m_pParallaxArray->num;i+) 32.

26、33.CCPointObject *point = (CCPointObject*)m_pParallaxArray->arri;34.35.CCNode * curNode = point->getChild() ;36.37. if( curNode->isEqual(node) ) 38.39. point->setOffset( ccpAdd(point->getOffset(), offset) );40.41. break;42.43. 44.45. 46.47. 注意,很不幸的是 CCPointObject 在 Cocos2d 中并不是公共的類(lèi),所以

27、我們需要借住一些 小手段來(lái) hack 。(重定義它為我們的類(lèi),并具有相同的簽名)。雖然它能工作的很好,但是他的缺點(diǎn)是,如果 CCPointObject 改動(dòng)了,你這里也要跟著改 動(dòng),否則程序會(huì)崩潰。代碼的重點(diǎn)是 incrementOffset 方法,他和 如何使用 cocos2d 制作一個(gè)太空射擊游戲 中的實(shí)現(xiàn)相同,只是用了不同的語(yǔ)言。下一步,選擇 HelloWorldScene.h ,在文件頂部的 #include 語(yǔ)句之后添加這些代碼:1. #include "CCParallaxNodeExtras.h"然后像下面的代碼一樣,將 private 區(qū)域中 _backgr

28、oundNode 定義由 CCParallaNode 改為 CCParallaxNodeExtras1. CCParallaxNodeExtras *_backgroundNode;然后選擇 HelloWorldScene.cpp 用下面的代碼替換掉 section #1(_backgroundNode 創(chuàng)建的 地方 )的第一行。1._backgroundNode = CCParallaxNodeExtras:node() ;最后,添加下面的代碼,到 update 方法的底部。1.CCArray *spaceDusts = CCArray:arrayWithCapacity(2) ;2.3.s

29、paceDusts->addObject(_spacedust1) ;4.5.spaceDusts->addObject(_spacedust2) ;6.7.for ( int ii = 0 ; ii count() ; ii+ ) 8.9. CCSprite * spaceDust = (CCSprite *)(spaceDusts->objectAtIndex(ii) ;10.11. float xPosition = _backgroundNode->convertToWorldSpace(spaceDust->getPosition().x ;12.13.

30、float size = spaceDust->getContentSize().width ;14.15. if ( xPosition < -size ) _backgroundNode->incrementOffset(ccp(spaceDust->getConten tSize().width*2,0),spaceDust) ;17. 1.CCArray *backGrounds = CCArray:arrayWithCapacity(4) ;22.23.backGrounds->addObject(_galaxy) ;24.25.ba

31、ckGrounds->addObject(_planetsunrise) ;26.27.backGrounds->addObject(_spacialanomaly) ;28.29.backGrounds->addObject(_spacialanomaly2) ;30.31.for ( int ii = 0 ; ii count() ; ii+ ) 32.33.CCSprite * background = (CCSprite*)(backGrounds->objectAtIndex(ii) ;34.35. float xPosition =_backgroundNo

32、de->convertToWorldSpace(background->getPosition().x ;36.37. float size = background->getContentSize().width ;38.39.if ( xPosition < -size )_backgroundNode->incrementOffset(ccp(2000,0),background) ;40.41. 42.43. 你可以看到, NSArray 的替代品是基于 STL (C+ 標(biāo)準(zhǔn)庫(kù) ) 實(shí)現(xiàn)的 CCArray 。我們用可以幫 我們自動(dòng)釋放對(duì)象的 arrayWi

33、thCapacity 構(gòu)造函數(shù)。注意這里同樣也有一個(gè)更先進(jìn)的 CCMutableArray 來(lái)用于存儲(chǔ)集合元素。最后的修改 -因?yàn)槟闾砑恿诵挛募?,你需要把它添加到android 工程的 Makefile 來(lái)讓他編譯正確。于是用 Eclipse 打開(kāi) ClassesAndroid.mk 然后改動(dòng)行 LOCAL_SRC_FILES 為下面的 代碼。1.LOCAL_SRC_FILES := AppDelegate.cpp 2.3. HelloWorldScene.cpp 4.5.CCParallaxNodeExtras.cpp編譯運(yùn)行,現(xiàn)在背景可以無(wú)限滾動(dòng)了!添加星星添加星星是非常簡(jiǎn)單的,只是添加下

34、面的代碼到 HelloWorldSce ne.cpp 的in it方法的return之前。1. HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(” Starsl.plist");2.2. HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(" Stars2.plist");4.3. HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(" Stars3.plist

35、");編譯運(yùn)行,漂亮!他已經(jīng)開(kāi)始看起來(lái)像一個(gè)太空游戲了。使用加速計(jì)來(lái)移動(dòng)飛船1234s 6890QWERTYI0pAS0F屮GJKLoIX ;CVBNM5YM1-ril/i/T izs在之前的 Cocos2D space shooter tutorial里面,我們使用 ios的加速計(jì)api來(lái)檢測(cè)加速計(jì)輸入。很明顯,ios下面的加速計(jì)api是不可以跨平臺(tái)的,那么我們?cè)趺崔k呢?幸運(yùn)的是,cocos2d-x對(duì)加速計(jì)進(jìn)行了封裝,我們可以不用關(guān)心具體平臺(tái)api,直接使用抽象后的加速計(jì)api就可以了。讓我們看看它是怎么工作的吧。首先,在HelloWorldScnee.H 頭文件里面添加一個(gè)新的私

36、有成員變量:1.float _shipPoi ntsPerSecY;然后,添加一個(gè)新的 public方法聲明:1.virtual void didAccelerate(CCAcceleration*pAccelerationValue);然后在HelloWorldSce ne.cpp的in it方法的return語(yǔ)句之前添加下列代碼:1.this->setlsAccelerometerE nabled(true);接下來(lái),在HelloWorldScene.CPP文件底部添加下面這些新方法定義:1. void HelloWorld:didAccelerate(CCAccelerati on

37、* pAccelerati onV alue) 2.3.#defi ne KFILTERINGFACTOR 0.14.5. #define KRESTACCELX -0.66.7.#define KSHIPMAXPOINTSPERSEC (winSize.height*0.5)8.9.#define KMAXDIFFX 0.210.11.double rollingX ;12.13. / Cocos2DXinverts X and Y accelerometer depending on device orientation14.15./ in landscape mode right x=-

38、y and y=x ! (Strange andconfusing choice)16.17. pAccelerationValue->x = pAccelerationValue->y ;18.19.rollingX = (pAccelerationValue->x * KFILTERINGFACTOR) +(rollingX * (1.0 - KFILTERINGFACTOR);20.21.float accelX = pAccelerationValue->x - rollingX ;22.23.CCSize winSize = CCDirector:shared

39、Director()->getWinSize();24.25.float accelDiff = accelX - KRESTACCELX;26.27.float accelFraction = accelDiff / KMAXDIFFX;28.29. _shipPointsPerSecY = KSHIPMAXPOINTSPERSEC * accelFraction;30.31.最后,在 update 方法的底部添加如下代碼:1.CCSize winSize = CCDirector:sharedDirector()->getWinSize();2.3.float maxY= wi

40、nSize.height - _ship->getContentSize().height/2;4.5.float minY = _ship->getContentSize().height/2;6.7.float diff = (_shipPointsPerSecY * dt) ;8.9. float newY = _ship->getPosition().y + diff;10.11.newY = MIN(MAX(newY, minY), maxY);12.13._ship->setPosition(ccp(_ship->getPosition().x, ne

41、wY);這里的 didAccelerate 回調(diào)函數(shù)包含一個(gè) CCAcceleration 對(duì)象,它包含加速計(jì)的 x、 y 和 z 三個(gè)方向的數(shù)據(jù)。 我們目前只需要使用 x 方向的加速計(jì)數(shù)據(jù)就行了, 因?yàn)槲覀兪茄刂O(shè)備的 x 軸進(jìn)行運(yùn)動(dòng)的。注意 : cocos2d-x 會(huì)根據(jù)你的設(shè)備是處于 portait 模式還是 landscape 模式來(lái)切換加速計(jì)的 x 和 y 方向的值。如果是 Landscape right (也就是我們目前的情況),接收到的x 值其實(shí)是 -y ,而 y 值是 x。如果是 Landscape left 那么接收到的 x 值是 y ,而 y 值是 -x。有點(diǎn)頭暈了?呵呵編

42、譯,然后在你的 iphone 和 android 設(shè)備上測(cè)試一下吧,現(xiàn)在你可以?xún)A斜你的設(shè)備來(lái)移動(dòng) 飛船啦!當(dāng)然,此時(shí),你不能在模擬器上進(jìn)行測(cè)試,必須使用真機(jī)。添加隕石是時(shí)候給游戲添加一些隕石了!首先在 HelloWorldScene.h 里面添加下面一些實(shí)例變量:1. CCMutableArray * _asteroids ;2.3.int _nextAsteroid ;4.5.float _nextAsteroidSpawn ;然后,添加一些新的公有方法聲明:1.float randomValueBetween( float low , float high );2.3.void setIn

43、visible(CCNode * node);4.5.float getTimeTick();接下來(lái),回到 HelloWorldScene.CPP ,然后在文件最后添加剛剛的那些輔助方法的實(shí)現(xiàn):1. float HelloWorld:randomValueBetween( float low , float high )2.3.return (float) arc4random() / 0xFFFFFFFFu) * (high - low)+ low;5.6.7.float HelloWorld:getTimeTick() 8.9.timeval time;10.11.gettimeofday

44、(&amp;time, NULL);12.13.unsigned long millisecs = (time.tv_sec* 1000) + (time.tv_usec/ 1000);14.15. return (float) millisecs;16.17. randomValueBetween 是一個(gè)可以獲得指定范圍內(nèi)的隨機(jī)浮點(diǎn)數(shù)的輔助方法。而 getTimeTick 是一種可移植的方式來(lái)得到毫秒級(jí)別的時(shí)間。接下來(lái),在 init 方法的最后創(chuàng)建一個(gè)隕石的數(shù)組:1.#define KNUMASTEROIDS 152.3._asteroids = new CCMutableArray

45、();4.5.for(int i = 0; i < KNUMASTEROIDS; +i) CCSprite *asteroid= CCSprite:spriteWithSpriteFrameName("asteroid.png");6.7. asteroid->setIsVisible(false) ;8.9._batchNode->addChild(asteroid);10.11._asteroids->addObject(asteroid);12.13.這里, 我們使用 cocos2d-x 的 CCMutableArray 類(lèi)來(lái)存儲(chǔ) ccspri

46、te 的數(shù)組。注意,我們這里 手動(dòng)調(diào)用 new 操作符,而不是使用 arrayWithCapacity 來(lái)創(chuàng)建對(duì)象,這樣可以避免使用 autorelease 機(jī)制。最后,在 update 方法底部添加下列代碼:1.float curTimeMillis = getTimeTick();2.3.if (curTimeMillis > _nextAsteroidSpawn) 4.5. float randMillisecs = randomValueBetween(0.20,1.0) * 1000;6.7._nextAsteroidSpawn = randMillisecs + curTim

47、eMillis;8.9.float randY = randomValueBetween(0.0,winSize.height);10.11.float randDuration = randomValueBetween(2.0,10.0);12.13.CCSprite *asteroid =_asteroids->getObjectAtIndex(_nextAsteroid);14.15._nextAsteroid+;16.17.if (_nextAsteroid >= _asteroids->count()18.19._nextAsteroid = 0;20.21. as

48、teroid->stopAllActions();22.23.asteroid->setPosition( ccp(winSize.width+asteroid->getContentSize().width/2, randY);24.25.asteroid->setIsVisible(true) ;26.27.asteroid->runAction ( CCSequence:actions (28.29.CCMoveBy:actionWithDuration(randDuration,ccp(-winSize.width-astero id->getCon

49、tentSize().width,0) ,30.31.CCCallFuncN:actionWithTarget(this,callfuncN_selector(HelloWorld:s etInvisible) ,32.33. NULL / DONOTFORGETO TERMINATEWITHNULL(unexpected in C+)7.再一次說(shuō)明,這里的代碼跟之前的 cocos2d代碼太像了!注意,這里的 callfuncN_selector 調(diào)用跟objc里面的selector機(jī)制太像了!注意:由于CCSequence:actions方法的參數(shù)列表采用的是變長(zhǎng)參數(shù),你

50、其實(shí)可以忽略掉最后一個(gè)NULL參數(shù),因?yàn)閷?duì)于C+來(lái)講,這個(gè)參數(shù)沒(méi)有意義。但是,考慮到兼容性的原因,因?yàn)?cocos2d-x開(kāi)發(fā)者想保持跟cocos2d的高度一致,所以, 這里需要一個(gè)NULL終止符。如果你在你的代碼里面不提供的話,那么你的程序?qū)?huì)崩潰。最后一步就是添加 setInvisible回調(diào)函數(shù)的實(shí)現(xiàn):1. void HelloWorld:setl nvisible(CCNode * node) 2.3.no de->setlsVisible(false);4.5.編譯并運(yùn)行,有隕石!下面是ipho ne3GS的運(yùn)行效果截圖:F面是 An droid Samsu ng Galaxy

51、 S的運(yùn)行效果截圖:發(fā)射激光是時(shí)候讓我們的飛船發(fā)射激光了!在HelloWorldSce ne.h 里面添加下列私有成員變量:1. CCMutableArray * _shipLasers ;2.3.int _n extShipLaser ;現(xiàn)在,添加一個(gè)新的公有方法聲明:1.virtual void ccTouchesBega n( cocos2d:CCSet* touches,cocos2d:CCEve nt* eve nt);然后,在HelloWorldSce ne.cpp 的in it方法的return語(yǔ)句之前添加下列代碼:1. #defi ne KNUMLASERS 52.2. _sh

52、ipLasers = new CCMutableArray();4.3. for(i nt i = 0; i < KNUMLASERS; +i) CCSprite *shipLaser = CCSprite:spriteWithSpriteFrameName("laserbeam_blue.p ng");6.4. shipLaser->setlsVisible(false);8.5. _batchNode->addChild(shipLaser);10.6. _shipLasers->addObject(shipLaser);.4.5

53、..5.最后,this->setIsTouchEnabled(true) ;在文件的底部實(shí)現(xiàn) ccTouchesBegan 方法;void HelloWorld:ccTouchesBegan(cocos2d:CCSet* touches, cocos2d:CCEvent* event)CCSize winSize = CCDirector:sharedDirector()->getWinSize() ;CCSprite *s

54、hipLaser =_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(

55、) ;shipLaser->runAction( CCSequence:actions (CCMoveBy:actionWithDuration(0.5,ccp(winSize.width,0),CCCallFuncN:actionWithTarget(this,callfuncN_selector(HelloWorld:s etInvisible) ,NULL / DO NOT FORGET TO TERMINATE WITH NULL) ) ;編譯并運(yùn)行,現(xiàn)在你可以發(fā)射激光了!下面是iphone 3GS下面的運(yùn)行截圖:F 面是 An droid Samsu ng Galaxy S的運(yùn)行截圖:簡(jiǎn)單的碰撞檢測(cè)接下來(lái),我們想添加一些代碼來(lái)檢測(cè)激光和小行星間的碰撞,以及當(dāng)小行星被撞擊時(shí)爆炸。 完成這項(xiàng)功能的代碼和如何使用cocos2d制作一個(gè)太空射擊游戲中的相當(dāng)相似,但是用到了一些新

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論