Cocos2D遊戲開發中文版重點摘取

cwq9944發表於2012-08-17

Cocos2d顯示

Cocos2d使用多個層級的CCNode物件來決定在什麼地方顯示什麼內容的,所有節點的基類都是CCNode。它包含了位置資訊,但是沒有顯示資訊。它是所有其它節點類的父類,包括兩個最基本的類:CCScene和CCLayer。

CCScene是一個抽象的概念,它的功能是根據畫素座標把物體放置在場景裡相應的地方。所以任何cocos2d場景都會用一個CCScene作為父物件。

CCLayer類本身並不做什麼,它的功能是允許觸控和加速計的輸入。因為大多數遊戲會接受基本的觸控輸入,所以CCLayer通常是第一個被加入CCScene的類。

 

Cocos2d記憶體管理

1.如果你擁有一個物件,它是通過alloc, copy或retain得到,你必須在用完之後釋放它。

2.如果你已經給一個物件傳送了自動釋放資訊,你將不能release它。

CCArray和NSMutableArray,還用任何其它iPhone SDK集合會給第一個新增進來的物件傳送retain資訊,也會給每個刪除的物件傳送release資訊,所以這樣生成的物件可以一直存在,直到從集合裡刪除。在集合裡被刪除以後, 物件會被自動釋放。

 

Cocos2d單例

CCActionManager* sharedManager =CCActionManager::sharedManager();

CCDirector* sharedDirector =CCDirector::sharedDirector();

CCSpriteFrameCache* sharedCache =CCSpriteFrameCache::sharedSpriteFrameCache();

CCTextureCache* sharedTexCache =CCtextureCache::sharedTextureCache();

CCTouchDispatcher* sharedDispatcher =CCTouchDispatcher::sharedDispatcher();

CDAudioManager* sharedManager =CDAudioManager::sharedManager();

SimpleAudioEngine* sharedEngine =SimpleAudioEngine::sahredEngine();

 

Cocos2d導演- CCDirector

CCDirector類是cocos2d遊戲引擎的核心,它儲存著cocos2d的全域性配置設定,同時管理著cocos2d的場景。

CCDirector的主要用處如下:

l 訪問和改變場景

l 訪問cocos2d的配置結節

l 訪問檢視(OpenGL, UIView,UIWindow)

l 暫停、回覆和結束遊戲

l 在UIKit和OpenGL之間轉換座標

CCLayer觸控事件接收

如果你的場景時使用多個CClayer物件,這樣接收收處理外來事件很耗資源, 所以,你不應用使用很多接收外來事件的層, 比較好的處理方式是:只使用一個層來接收和處理事件,如果需要的話,這個層應該通過轉發事件的方式來通知其它節點或類。

CCLayer接收加速計事件

啟用接收加速計事件:isAccelerometerEnabled = Yes;

同樣的,層裡面要加入一下特定的方法來接收加速計事件:

Voidaccelerometer(UIAcceleromoter *)accelerometer

 

CCSprite貼圖大小

我要特別提一下貼圖大小。目前可用於 IOS 設定的貼圖尺寸必須符合”2的n次方”規定,所以貼圖的寬和高必須是2,4,8,16,32,64,128,256,512,1024。在第三代裝置上可以達到2048畫素。貼圖不一定是正方形的,所以8x1024畫素的貼圖完全沒有問題。

例子:假如你的圖片尺寸是260x260,用的是32位顏色,在記憶體裡,貼圖本來只佔279kb左右的空間,但是現在卻使用了整整1mb的空間。

解:這幾乎是原尺寸四倍的內在佔用, 這是國為iOS裝置要求任何貼圖的尺寸必須符合”2的n次方”規定,260x260畫素的貼圖到了iOS裝置中以後,系統會自動生成一張與260x260尺寸最相近的符合”2的n次方”規定的圖片(一張512x512畫素的圖片),以便於把原貼圖放進這個符合規定的”容器”中。而這張512x512畫素的圖片佔用了1mb的記憶體空間。

注: 計算png格式圖片大小的方法:寬* 高 *(位數/4) = 圖片的大小(kb)

 

Cocos2d動作- CCAction

動作是用於在節點上執行某些”動作”的輕量級類。

Cocos2d的動作可以分為兩種型別:一種是即時動作, 它的效果和設定節點屬性一樣,例如設定visible或flipx屬性。另一種是時間間隔動作,這種動作在一段時間之內發生,例如上述程式碼的移動動作。你不需要在這兩動作完成以後將他們從記憶體裡清理出去,cocos2d會自動釋放動作所佔用的記憶體。

動作分類:

l 重複動作: CCRepeatForever

l 舒緩動作: CCEaseAction

l 動作序列: CCSequence

l 即時動作: CCInstantAction

 

Cocos2d多個場景

當你要在不同場景之間進行轉換時,你使用使用新的程式碼。當你用CCDirector::replaceScene方法替換場景時,第個節點都會呼叫CCNode所帶的三個方法。這三個方法是:onEnter,onEnterTransitionDidFinish和onExit。取決於是否使用了CCTransitionScene,onEnter和onExit會在場景鎮定中的某個時間點被呼叫。對於這三個方法,你必須呼叫它們的super方法以避免觸控輸入問題和記憶體洩漏問題。

CCNode三個重要方法講解:

onEnter

a.      節點呼叫init方法以後將會呼叫些方法

b.      如果使用了CCTransitionScene,將會在過渡效果開始以後呼叫此方法。

onEnterTransitionDidFinish

a.      呼叫onEnter以後將會呼叫此方法

b.      如果使用了CCTranistionScene,將會在過渡效果結束後呼叫此方法。

onExit

a.      節點呼叫dealloc方法之前將會呼叫此方法

b.      如果使用了CCTranistionScene,將會在過渡效果結束以後呼叫此方法。

例子:場景轉換 OtherScene->FirstScene(日誌資訊)

1.      scene: OtherScene

2.      init:<OtherScene= 066B2130 | Tag = -1>

3.      onEnter:<OtherScene = 066B2130 | Tag =-1>

4.      //這裡執行了過渡效果

5.      onExit:<FirstScene = 0668DF40 | Tag =-1>

6.      onEnterTransitionDidFinish:<OtherScene = 066B2130 | Tag =-1>

7.      dealloc:<FirstScene = 0668DF40 | Tag =-1>

 

Cocos2d場景載入

注:規則一:永遠不要在一個節點的init方法中呼叫CCDirector的replaceScene方法。規則二:請遵守規則一。不遵守規則的後果是程式崩潰。Director無法容忍一個節點在初始化的同時進行場景替換。

如何以最好的方式實現遊戲關卡

l 每一個關卡都使用一個場景

最直接的方法是每一個關卡都使用一個單獨的場景。你可以為每一個關卡建立一個新的場景類(Scene class), 或者通過把關卡號碼或其它與關卡相關的資訊傳遞給一個通用的關卡場景類(LevelScene class) 用於載入正確的關卡資料。這個方法很適合每個關卡之間沒有多大關係,關卡可以清晰地分開的情況。你可能需要儲存玩家的得分和當前剩餘的生命數,除此之外不需要再儲存其它的資訊了。這種情況下的使用者介面可能是靜態的,或者都多隻有一個暫停按鈕。

l 同一個場景設定多個層作為關卡

如果你有一個複雜的使用者介面,並且在關卡轉換時不允許重置遊戲場景的話,你就需要在同一個場景裡用不同的層來載入和顯示不同的關卡。在轉換關卡時,你可能會將遊戲角色和其它的遊戲物體保持在同一個位置。你可能使用幾個變數來儲存當前的遊戲狀態資訊和使用者介面設定資訊,比如說倉庫裡的物品。如果你使用多個場景作為關卡的話,在轉換關卡的時候,你就需要做很多工作來儲存和重置遊戲設定,還有重置所有的視覺元素。這個方式很適合物品那類或者冒險類遊戲,因為玩家需要在不同的房間之間移動。特別是你想在替換關卡內容的過程中使用動畫的情況下。CCMultiplexLayer 類可被用於這種方式中,它可以同時包含多個節點,但是任意時間只有一個節點是有效的。唯一的缺點是你不能在層之間使用過渡效果。因為任意時間只能有一個層是可視的,所以任何過江效果都是不可能發生的。switchTo、switchToAndReleaseMe

 

Cocos2d的顏色層-CCColorLayer

Cocos2d提供了CCColorLayer類可用於改變背景顏色。

 

繼承自CCSprite的遊戲物體類

我想造成混淆的原因是:最常用來將物體顯示在螢幕上的類是CCSprite。但是實際上你的遊戲角色和CCNode類之間的關係是”有一個”的關係。你的遊戲角色類”有一個”CCSprite用於顯示它自己。在一個”Rogue-like”遊戲中,遊戲角色類”有一個”CCLabel用於顯示它名字。如果你使用OpenGL和許多粒子效果的話,你的角色類就”有一個”粒子效果系統將它自己顯示在螢幕上。

Cocos2d手動預約簡介兩類:CCScheduler、CCTouchDispatcher

CCSchelduler、CCTouchDispathcer預約器一樣,要在dealloc方法中移除。否則,在它們從記憶體中被釋放以後,預約器或觸控高度程式將一直保留對類的參考,從而導致之後的程式崩潰。

 

一些很酷的CCNode類

l CCProgressTimer進度條

l CCParallaxNode視差檢視

l CCRibbon圖片鏈條

l CCMotionStreak拖尾效果


相關文章