假如我們遊戲場景中有兩個層,乙個是遊戲層,乙個是狀態層。遊戲層就是控制遊戲中角色的移動(為了簡便說明,我自動忽視了控制層),狀態曾就是當提示遊戲狀態,當遊戲開始時顯示「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遊戲記憶...