三消游戲SushiCrush s01e01_第1頁
三消游戲SushiCrush s01e01_第2頁
三消游戲SushiCrush s01e01_第3頁
三消游戲SushiCrush s01e01_第4頁
三消游戲SushiCrush s01e01_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、三消游戲SushiCrush s01e01   游戲框架:為了使項目的代碼結(jié)構(gòu)清晰,好的前期規(guī)劃是很有必要的,下圖是該節(jié)游戲工程的主要類結(jié)構(gòu),先從整體看一下,項目的組織結(jié)構(gòu),然后我們會對其內(nèi)部實現(xiàn)做些解說。其中:l AppDelegate.cpp:程序入口,分辨率適配設(shè)置。l PlayLayer.cpp:游戲場景層,游戲中所有的Node節(jié)點(diǎn)都在其內(nèi),它同時負(fù)責(zé)管理SushiSprite。l SushiSprite.cpp:壽司精靈層,即游戲中可被消除和操作的對象。在本章節(jié)教程中,我們將主要完成以下功能:分辨率適配壽司的創(chuàng)建、布局和下落程序入口AppDelegate

2、.cpp是Cocos2d-x自動生成的一個類,它控制著游戲的生命周期,是Cocos2d-x游戲的通用入口文件,類似于一般 Windows 工程中主函數(shù)所在的文件。打開AppDelegate.cpp文件,在applicationDidFinishLaunching()函數(shù)中我們可以設(shè)置第一個啟動的游戲場景:復(fù)制代碼 1. autoscene =PlayLayer:createScene(); 2. director->runWithScene(scene);分辨率適配為了能更好的適應(yīng)各種分辨率大小和屏幕寬高比的移動終端設(shè)備,游戲的開始,我們還是先來看看分辨率的適配設(shè)置。 

3、;打開AppDelegate.cpp文件,在applicationDidFinishLaunching函數(shù)里面添加如下代碼,以便我們的游戲,能夠更好的適應(yīng)不同的運(yùn)行環(huán)境。復(fù)制代碼 1. / 分辨率適配 2. glview->setDesignResolutionSize(320.0,480.0,ResolutionPolicy:FIXED_WIDTH); 3. std:vector<std:string>searchPath;searchPath.push_back("w640"); 4. CCFileUtils:getInstance()->set

4、SearchPaths(searchPath); 5. director->setContentScaleFactor(640.0/320.0);設(shè)計分辨率是通過setDesignResolutionSize(width, height, resolutionPolicy)方法來設(shè)置的,第一,二個參數(shù)分別是設(shè)計分辨率的寬度和高度,第三個參數(shù)是你想要的模式。這里設(shè)置的分辨率大小是開發(fā)時為基準(zhǔn)的屏幕分辨率大小。模式有五種:EXACT_FIT 整個游戲內(nèi)容都會在屏幕內(nèi)可見,并且不用提供比例系數(shù)。x,y會被拉伸,使內(nèi)容鋪滿屏幕,所以可能會出現(xiàn)形變,所有的應(yīng)用程序看起來可能會是拉伸或者壓縮的。NO

5、_BORDER 一個方向鋪滿屏幕,另外一個方向超出屏幕,不會變形,但是可能有一些裁剪。SHOW_ALL 該模式會盡可能按原始寬高比放大游戲世界,同時使得游戲內(nèi)容全部可見。內(nèi)容不會形變,不過可能會出現(xiàn)兩條黑邊,即屏幕中會有留白。FIXED_WIDTH 該模式會橫向放大游戲世界內(nèi)的內(nèi)容以適應(yīng)屏幕的寬度,縱向按原始寬高比放大。FIXED_HEIGHT 與上一中模式相反。setSearchPaths()方法設(shè)置資源搜索路徑,這里w640是搜索的文件夾名。setContentScaleFactor()方法設(shè)置內(nèi)容縮放因子,顧名思義,就是設(shè)置整個游戲內(nèi)容放大或者縮小的比例系數(shù)。壽司精靈 SushiSpri

6、teSushiSprite類繼承于Sprite,用來創(chuàng)建單個的壽司精靈,下面是它的類定義:復(fù)制代碼 1. class SushiSprite :  public Sprite 2. 3. public:  4. static SushiSprite *create(int row, int col);/ 隨機(jī)創(chuàng)建不同種類的壽司精靈 static float getContentWidth();/ 得到精靈圖片的寬(精靈圖片為正方形,寬等于高),方便后面計算精靈在場景中的位置。 5.  / 暫時沒用到,在下一節(jié)的教程中我們將用來定位行列。  6. CC_S

7、YNTHESIZE(int, m_row, Row);  7. CC_SYNTHESIZE(int, m_col, Col);  8. CC_SYNTHESIZE(int, m_imgIndex, ImgIndex);CC_SYNTHESIZE的定義如下:復(fù)制代碼 1.2. #define CC_SYNTHESIZE(varType, varName, funName) 3. protected: varType varName; 4. public: virtual varType get#funName(void) const return varName; 5. pu

8、blic: virtual void set#funName(varType var) varName = var; CC_SYNTHESIZE的作用是定義一個保護(hù)型的變量,并聲明一個getfunName函數(shù)和setfunName函數(shù),你可以用getfunName函數(shù)得到變量的值,用setfunName函數(shù)設(shè)置變量得值。 參數(shù)varType是變量的類型,m_row是變量名,funName是要聲明函數(shù)的“后半截”名字,如:CC_SYNTHESIZE(int, m_row, Row)的作用是聲明一個int型的m_row變量和一個函數(shù)名為getRow以及setRow的函數(shù)。壽司精靈的創(chuàng)建:

9、復(fù)制代碼 1. SushiSprite*SushiSprite:create(introw,intcol) 2. 3. SushiSprite*sushi =newSushiSprite(); 4. sushi->m_row =row; 5. sushi->m_col =col; 6. sushi->m_imgIndex =arc4random()%TOTAL_SUSHI; 7. sushi->initWithSpriteFrameName(sushiNormalsushi->m_imgIndex); 8. sushi->autorelease(); 9.

10、returnsushi; 10. arc4random()方法獲取隨機(jī)數(shù)比較精確,并且不需要生成隨即種子,arc4random() % TOTAL_SUSHI是獲得 0 TOTAL_SUSHI 1之間的整數(shù)。游戲主場景 PlayLayerPlayLayer是游戲的主場景,同時也負(fù)責(zé)管理SushiSprite,在該章教程中,PlayLayer里我們只實現(xiàn)了壽司的布局和它的下落。下面我們會詳細(xì)講解,先看看PlayLayer的初始化:復(fù)制代碼 1. boolPlayLayer:init() 2. 3. if(!Layer:init() 4. returnfalse; 5. 6. / 創(chuàng)建游戲背景 7

11、. SizewinSize =Director:getInstance()->getWinSize(); 8. autobackground =Sprite:create("background.png"); 9. background->setAnchorPoint(Point(0,1); 10. background->setPosition(Point(0,winSize.height); 11. this->addChild(background); 12. / 初始化壽司精靈表單 13. SpriteFrameCache:getInstan

12、ce()->addSpriteFramesWithFile("sushi.plist"); 14. spriteSheet =SpriteBatchNode:create("sushi.pvr.ccz"); 15. addChild(spriteSheet); 16. / 初始化矩陣的寬和高,MATRIX_WIDTH、MATRIX_HEIGHT通過宏定義 17. m_width =MATRIX_WIDTH; 18. m_height =MATRIX_HEIGHT; 19. / 初始化壽司矩陣左下角的點(diǎn) 20. m_matrixLeftBottomX

13、 =(winSize.width -SushiSprite:getContentWidth()*m_width -(m_width -1)*SUSHI_GAP)/2; 21. m_matrixLeftBottomY =(winSize.height -SushiSprite:getContentWidth()*m_height -(m_height -1)*SUSHI_GAP)/2; 22. / 初始化數(shù)組intarraySize =sizeof(SushiSprite*)*m_width *m_height; 23. /數(shù)組尺寸大小m_matrix =(SushiSprite*)malloc

14、(arraySize); 24. /為m_matrix分配內(nèi)存,這里m_matrix是指向指針類型的指針,其定義為:SushiSprite *m_matrix。所以可以理解為m_matrix是一個指針數(shù)組 25. memset(void*)m_matrix,0,arraySize); 26. /初始化數(shù)組m_matrix/初始化壽司矩陣initMatrix(); 27. return true;上面的初始化函數(shù)中有以下幾點(diǎn)需要說明一下:plist 和 pvr.ccz文件SpriteFrameCache和SpriteBatchNode壽司矩陣起始點(diǎn)的初始化壽司精靈如何布局1. plist 和 p

15、vr.ccz文件游戲中一般會有比較多的圖片資源,如果有很多很多的資源,那加載這些資源是非常費(fèi)時間和內(nèi)存的,所以如何高效地使用圖片資源對于一款游戲是相當(dāng)重要的。在Cocos2d中,我們一般會將圖片資源打包成一張大圖,這樣加載圖片不僅節(jié)省了空間,而且還提升了速度。在Cocos2d-x引擎開發(fā)中,常又到的兩種圖片編輯打包工具,即 Zwoptex 和 Texturepacker。我們的教程里用到的是Texturepacker,你可以到它的官方網(wǎng)站下載并安裝。打開Texturepacker,界面如下圖所示。 Texturepacker工具的每個設(shè)置項都給出了相應(yīng)的提示信息,這里就不一一介紹。接

16、下來,你就可以根據(jù)提示把本章節(jié)所需要的6張壽司圖片資源打包了。導(dǎo)出的時候勾選 outputTexture formatzlib compr.PVR,然后單擊Publish按鈕進(jìn)行導(dǎo)出,這樣就會導(dǎo)出我們需要的plist 和 pvr.ccz文件了。 plist文件是圖片信息的屬性列表文件。PVR圖像是專門為ios設(shè)備上面的PowerVR圖形芯片指定的圖像容器。它們在ios設(shè)備上非常好用,因為可以直接加載到顯卡上面,而不需要經(jīng)過中間的轉(zhuǎn)化。pvr.ccz文件則是pvr文件格式的壓縮格式,使用這種圖片格式的好處有兩點(diǎn):1、可以使你的應(yīng)用程序更小,因為圖片是被壓縮過了的。2、你的游戲能夠啟動地

17、更快。2. SpriteFrameCache和SpriteBatchNode上面,我們用TexturePacker工具打包生成了plist和pvr.ccz文件,那么下一步,我們就該獲取plist中的信息了。 Cocos2d中SpriteFrameCache通常用來處理plist文件,并能與SpriteBatchNode結(jié)合使用來達(dá)到批處理渲染精靈的目的。精靈幀緩存類SpriteFrameCache 精靈幀緩存類SpriteFrameCache 用來存儲精靈幀,緩存精靈幀有助于提高程序的效率。 SpriteFrameCache是一個單例模式,不屬于某個精靈,是所有精靈共享使用

18、的。精靈批處理節(jié)點(diǎn)SpriteBatchNode 當(dāng)你需要渲染顯示兩個或兩個以上相同的精靈時,如果逐個渲染精靈,每一次渲染都會調(diào)用 OpenGL ES 的 draw 函數(shù),這樣做自然降低了渲染效率。不過幸好,Cocos2d為開發(fā)者提供了一個SpriteBatchNode類,它能一次渲染多個精靈。并可以用來批處理這些精靈,比如我們游戲中的壽司精靈。用SpriteBatchNode作為父層來創(chuàng)建子精靈,并且使用它來管理精靈類,這樣可以提高程序的效率。在init()方法中調(diào)用SpriteFrameCache的addSpriteFramesWithFile方法,傳入plist文件名稱,它會從

19、plist屬性列表文件的元數(shù)據(jù)部分獲取各個紋理的紋理名,載入到紋理緩存中。并解析屬性列表文件,使用SpriteFrame對象來內(nèi)部地跟蹤所有精靈的信息。在Cocos2d中高效使用圖片總結(jié):使用TexturePacker打包圖片成pvr.ccz文件,使用SpriteBatchNode優(yōu)化繪制,使用SpriteFrameCache緩存讀取,使用spriteWithFrameName獲取單張圖片。3. 壽司矩陣起始點(diǎn)的初始化在游戲中,我們用來存儲SushiSprite的數(shù)據(jù)結(jié)構(gòu)是一個指針數(shù)組,其實它也就相當(dāng)于一個矩陣。壽司矩陣的起始點(diǎn)其實就是壽司精靈開始布局的起始點(diǎn),在我們的游戲教程中,它位于屏幕的

20、左下角,它由左下角的點(diǎn)開始逐行逐列的初始化壽司精靈。計算該點(diǎn)的公式如下:復(fù)制代碼 1. m_matrixLeftBottomX =(winSize.width -SushiSprite:getContentWidth()*m_width -(m_width -1)*SUSHI_GAP)/2; 2. m_matrixLeftBottomY =(winSize.height -SushiSprite:getContentWidth()*m_height -(m_height -1)*SUSHI_GAP)/2;其原理可簡單描述為下圖所示的過程(只以計算m_matrixLeftBottomX的值為例,

21、即X軸方向坐標(biāo)值):  看原理圖其實就已經(jīng)一目了然了,上圖N代表的是橫向布局的壽司精靈數(shù),m_matrixLeftBottomX的值 ( 屏幕的寬 壽司的寬N個壽司 ( N-1 )壽司之間的間隙) 2。4. 如何布局加載完壽司精靈圖片,計算好壽司精靈布局的起始點(diǎn)以后,我們就可以開始壽司精靈的布局和它的下落顯示了,下面是代碼行:復(fù)制代碼 1. /矩陣的初始化 2. voidPlayLayer:initMatrix() 3. for(introw =0;row <m_height;row+) 4. for(intcol =0;col <m_width;col+) 5

22、. createAndDropSushi(row,col); 6. /創(chuàng)建SushiSprite,并下落到指定位置 7. voidPlayLayer:createAndDropSushi(introw,intcol) 8. Sizesize =Director:getInstance()->getWinSize(); 9. SushiSprite*sushi =SushiSprite:create(row,col); 10. / 創(chuàng)建并執(zhí)行下落動畫 11. PointendPosition =positionOfItem(row,col); 12. PointstartPosition

23、=Point(endPosition.x,endPosition.y +size.height /2); 13. sushi->setPosition(startPosition); 14. floatspeed =startPosition.y /(2*size.height);sushi->runAction(MoveTo:create(speed,endPosition); 15. /將壽司添加到精靈表單里。注意,如果沒有添加到精靈表單里,而是添加到層里的話,就不會得到性能的優(yōu)化。 16. spriteSheet->addChild(sushi); 17. /給指定位置的數(shù)組賦值 18. m_matrixrow *m_width +col=sushi; 19. /得到對應(yīng)行列精靈的坐標(biāo)值 20. PointPlayLayer:positionOfItem(introw,intcol) 21. floatx =m_matrixLeftBottomX +(SushiSprite:getCont

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論