cocos2d 學習 第二章

2022-08-05 12:30:18 字數 3364 閱讀 9941

1、“helloworld_prefix.pch”標頭檔案的作用是給編譯過程加速。

你應該把不常變化的框架(frameworks)標頭檔案新增到字首標頭檔案(prefix header)中。這樣 的話,在編譯的時候,框架的**會被預先編譯,所有的類都將可以使用這些 標頭檔案。不幸的是,這樣做也有一個缺點:如果字首標頭檔案裡其中一個標頭檔案 發生了變化,你的所有**將會重新編譯。這就是為什麼你應該只新增那些極 少或者從來都不變化的標頭檔案到字首標頭檔案中。 

#ifdef __objc__

#import #import #import "cocos2d.h"

#endif 

它通過在特定時間點從 ios 接收訊息來追蹤應用程式的狀態變化。 例如,可以通過它來處理諸如使用者接到來電或記憶體不足時應用程式需要採取的措施。 

3、動畫間隔(animation interval) 

動畫間隔決定了cocos2d更新螢幕的頻率。此設定影響遊戲可以達到的最大幀率。 不過,動畫間隔並不等於多少幀每秒。正相反,它表示的是cocos2d更新螢幕的 頻率。這就是為什麼它的引數是1.0/60 – 因為1除以60等於0.0167秒,這是在兩次螢幕更新之間的時間間隔。 

在某些時候,把幀率設為30幀每秒可能更合適。對於那些很複雜的遊戲,它們 的幀率可能在30和60幀每秒之間上下浮動的很厲害,設定一個低一點的幀率會 對這樣的遊戲有所幫助。當你設定了一個低一點的幀率,而且遊戲可以穩定的 保持在這個幀率,使用者的體驗會比使用一個高一些但是不穩定的幀率要好很多人的感覺是很複雜的東西。

ios裝置不支援超過60幀每秒的幀率,它的螢幕重新整理率被鎖定在60幀每秒(hz)。如果強迫cocos2d以超過60幀每秒的速度進行渲染,在最好的情況下可能會不產生任何效果。在最差的情況下,你的幀率可能反而會下降。如果你想讓cocos2d執行在最快的幀率下,把動畫間隔設定為1.0/60。 

啟用 fps 顯示後,在螢幕的左下角將會顯示一個小數字。這是你程式的執行幀 率,也就是每秒螢幕會被重新整理的幀數。理想狀態下,你的遊戲應該執行在 60 幀每秒的幀率,特別是那些動作遊戲。有一些遊戲,比如大多數的益智遊戲,30 幀每秒就可以滿足要求。 

4、“helloworldlayer”類:包含了所有用於顯 示hello world標籤的**。 

cocos2d是使用了多個層級的ccnode物件來決定在什麼地方顯示什麼內容的。

所有節點的基類都是ccnode類。它包含了位置資訊,但是沒有顯示資訊。它是所有其他節點類的父類,包括兩個最基本的類:ccscene和cclayer。 

ccscene 類是一個抽象概念,它僅用於根據物件的畫素座標把物件放置到場景中正確的位置。所以,ccscene 節點通常是整個 cocos2d 場景體系的根節點。多數時候只有一個執行著的場景,不過從一個場景過渡到另一個場景的情況是例外。 

cclayer 類本身幾乎沒有什麼功能,但它可用於接收觸控和加速計輸入。 它常被用作 ccscene 的第一個子節點,因為每個遊戲至少都會使用觸控輸入的功能。

開啟 helloworldlayer.h 標頭檔案,你會看到 helloworldlayer 類派生自 cclayer 類。那 麼,ccscene 類在什麼地方發揮作用呢?

由於 ccscene 類是抽象概念,因此建立場景的預設方式是通過類中的靜態初始化方法 “+(id) scene”來完成的。該方法建立了一個普通的 ccscene 物件,並把 helloworldlayer 類的一個例項新增到剛建立的 ccscene 物件中。ccscene 幾乎永遠都是用這種方式建立並 使用的。下面列舉一個通用的“+(id) scene”方法示例:

+(ccscene *) scene  //

首先執行它

首先,用 ccscene 類的靜態初始化器“+(id) node”建立一個 ccscene 物件。然後用 同樣的方法建立一個 helloworldlayer 物件,並把它新增到剛建立的 ccscene 物件中。最 後把這個 ccscene 物件返回給呼叫者。 

5、在 objective-c 中,我們 必須手動呼叫父類的 init 方法,該操作不會自動完成。我們之所以用 self 來接收返回值, 是為了防止返回值為 nil 的情況發生。 

-(id) init

return self;

}

cclabelttf 類使用 truetype 字型在螢幕上繪製文字。 

cclabelttf 物件是通過它的一個靜態初始化方法建立的,該方法會返回一個 新建立的 cclablettf 例項,並把該物件新增到自動釋放池中。為了防止該物件在 init 方 法結束後從記憶體中釋放,必須呼叫[self addchild:label]訊息把它新增為 self 的子節點。同時, 該標籤的 position 屬性被設定為螢幕**。注意,既可以在呼叫 addchild 方法前對 position 屬性賦值,也可以在呼叫後進行賦值。 

6、ccnode 類的靜態初始化方法是“+(id) node”。以下**將向 self 傳送 alloc 訊息,這 等效於在 ccnode 的實現中呼叫[ccnode alloc]:

+(id) node

上面對 self 的呼叫方法更加普遍,而且對於 c++程式設計師來說應該也更容易接受。

現在可以用靜態初始化方法來重寫 ccnode 的生成方法。不出所料,**變得很簡潔: // allocate a new instance of ccnode

ccnode* mynode = [ccnode node];

// do something with mynode ...

這就是使用自動釋放物件的妙處。你不必再記著給物件傳送釋放訊息。每一次 cocos2d 進入下一幀,那些不再使用的自動釋放物件將被自動地釋放。但這樣做也有一個缺點:如 果使用上述**,然後在下一幀或者以後想要訪問 mynode 物件時,你就會發現它已經不 在記憶體中了。如果這時傳送訊息給它,將導致程式出現 exc_bad_access 錯誤而崩潰。

簡單地把 ccnode* mynode 變數當作類成員變數並不意味著物件使用的記憶體會被自動 保留下來。如果想在下一幀或者以後的幀中訪問自動釋放物件,就必須保留它。並且,如 果沒有顯式地將其新增為子節點,那麼之後還是需要對其進行手動釋放。

有一種可以更好地使用自動釋放物件的方法,並且不需要顯式地呼叫 retain 方法——可 以將生成的ccnode物件作為子節點新增到另一個派生自ccnode 的物件中,甚至可以刪 除成員變數而直接依賴 cocos2d 來儲存物件:

-(void) init

-(void) update:(cctime)delta

7、isimulate 應用程式(www.vimov.com/isimulate)是一個寶貴的開發工具,它允許 ios 設 備向執行在 ios 模擬器中的應用程式傳送加速計、gps、羅盤和多點觸控事件。 

8、cclog 巨集對蘋果的 nslog 方法進行了封裝,所以 cclog 只在除錯構建時才被編譯, 在釋出構建時被刪除。 

cocos2d x

引用 官網 各遊戲引擎 cocos2d x是一個開源的移動2d遊戲框架,mit許可證下發布的。這是一個c cocos2d iphone專案的...

cocos2d x(概括)

x 包含兩個意思 一方面是c 的檔案擴充套件cxx,表示該專案是由c 編寫 另一方面意味這交叉,跨平臺。 主要功能 1 流程控制 非常容易管理不同場景之間的流程控制。 2 精靈 快速而方便的精靈。 3 動作 可組合精靈的動作。 4 特效 包括波浪 旋轉和透鏡等特性。 5 平面地圖 支援平面地圖和45度角...

cocos2D單例

單例 singleton 是一個很易於理解的概念。在 cocos2d x 引擎中,我們能看到大量單例的身影, 它們大部分出現在一些系統資源管理類中。單例模式保證了全域性有且只有一個例項物件,保證自動地初始化該物件,使得 程式在任何時候任何地方都可以訪問 獲取該物件。 例如,cocos2d x 的遊戲流...