cocos2d 學習 第二章

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

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實現語音 Cocos2d 聲音API

param url 聲音路徑 cc.audioengine.playmusic url loop 停止背景 param releasedata 是否釋放聲音資料,預設為false cc.audioengine.stopmusic releasedata 暫停背景 cc.audioengine.pau...

COCOS2D 學習教程

1.在cocos2d裡面如何使用texture packer和畫素格式來優化spritesheet spritesheet.html 2.如何使用cocos2d來做乙個簡單的iphone遊戲教程 第一部分 5 程1.html 3.如何使用cocos2d開發乙個簡單的iphone遊戲 旋轉炮塔。第二部...

cocos2d學習筆記

粒子系統,使用系統自己的粒子系統的書寫方法 if cclayer init return false cctexture2d fire cctexturecache sharedtexturecache addimage fire.png ccparticlesystem firepartical ...