Cocos2dx 小技巧(四)delegate委託

2021-06-21 20:29:59 字數 1934 閱讀 5189

假如我們遊戲場景中有兩個層,乙個是遊戲層,乙個是狀態層。遊戲層就是控制遊戲中角色的移動(為了簡便說明,我自動忽視了控制層),狀態曾就是當提示遊戲狀態,當遊戲開始時顯示「game start」幾個字,當遊戲結束時顯示「game over」。那麼,該怎麼實現遊戲層與狀態層間的通訊呢?

有的人馬上說:用單例啊,在狀態層寫乙個單例,這樣遊戲層隨時都可以呼叫。沒錯,單例確實可以解決層之間的通訊,但我在第二篇裡也有說過,單例這東西能不用就不用,太浪費空間。

下面介紹另一種方法:delegate(委託)

首先我建立乙個委託的基類

[cpp]view plain

copy

class mydelegate  

;  

下面建立乙個gamelayer(遊戲層)[cpp]view plain

copy

class gamelayer : public cocos2d::layer  

;  

遊戲層的建立步驟是大家最熟悉的create_func()啦,不過可能有的小夥伴對cc_synthesize這貨不是很理解。其實它就是乙個巨集啦。看下原始碼:

[cpp]view plain

copy

#define cc_synthesize(vartype, varname, funname)\

protected: vartype varname;\  

public: virtual vartype get##funname(void) const \  

public: virtual

void set##funname(vartype var)  

看過原始碼後,我們把cc_synthesize(mydelegate*,delegator,delegator);帶進去試下,實際上與下面這幾條**是同樣的意思。

[cpp]view plain

copy

protected:  

mydelegate* delegate;  

public:  

virtual mydelegate* getdelegator(void) const ;  

virtual

void setdelegator(mydelegate* dele) ;  

下面建立statuslayer(狀態層)[cpp]view plain

copy

//statuslayer 繼承了mydelegate

class statuslayer : public cocos2d::layer,public mydelegate  

;  

定義如下:[cpp]view plain

copy

bool statuslayer::init()  

void statuslayer::ongamestart()  

void statuslayer::ongameend()    

好了,建立完後,就面臨乙個問題了:gamelayer該怎麼去呼叫statuslayer裡的ongamestart()與ongameend()兩個函式呢?

突然想起gamelayer的init()函式還沒有定義,那我就在init中勾引statuslayer吧。[cpp]view plain

copy

bool gamelayer::init()    

執行結果我就不打出來了。

Cocos2dx 小技巧(六)斷言CCAssert

這篇介紹的是讓廣告勞苦群眾又愛又恨的ccassert!ccassert,也就是斷言啦,當然了功能和斷點也挺相似的。使用斷言可以建立更穩定,品質更好且不易於出錯的 具體用法看下面 cpp view plain copy ccassert cond,msg 斷言表示式cond為真,如果不為真,則顯示字串...

Cocos2dx 小技巧(六)斷言CCAssert

ccassert,也就是斷言啦,當然了功能和斷點也挺相似的。使用斷言可以建立更穩定,品質更好且不易於出錯的 具體用法看下面 cpp view plain copy ccassert cond,msg 斷言表示式cond為真,如果不為真,則顯示字串msg資訊 下面舉第乙個例子 cpp view pla...

cocos2dx優化記憶體技巧

一 記憶體優化原則 為了優化應用記憶體,你應該知道是什麼消耗了你應用的大部分記憶體,答案就是texture 紋理 它幾乎佔據了90 的應用記憶體。那麼我們應該盡力去減小我們應用的紋理記憶體使用,否則我們的應用程序可能會被系統殺死。為了減少記憶體警告,這裡我們給出兩個普遍的關於cocos2dx遊戲記憶...