有些技巧你不知道不要緊,但知道後會很牛逼。
-------------------
假如我們遊戲情境中有兩個層,一個是遊戲層,一個是狀態層。遊戲層就是控制遊戲中角色的移動(為了簡便說明,我自動忽視了控制層),狀態曾就是當提示遊戲狀態,當遊戲開始時顯示“game start”幾個字,當遊戲結束時顯示“game over”。那麼,該怎麼實現遊戲層與狀態層間的通訊呢?
有的人馬上說:用單例啊,在狀態層寫一個單例,這樣遊戲層隨時都可以調用。沒錯,單例確實可以解決層之間的通訊,但我在第二篇裡也有說過,單例這東西能不用就不用,太浪費空間。
下面介紹另一種方法:delegate(委託)
首先我建立一個委託的基類
class MyDelegate{public:virtual void onGameStart(void) = 0;//建立遊戲開始的虛函數virtual void onGameEnd(void) = 0;//建立遊戲結束時的虛函數};
下面建立一個GameLayer(遊戲層)
class GameLayer : public cocos2d::Layer{public: static cocos2d::Scene* createScene(); virtual bool init(); CREATE_FUNC(GameLayer); CC_SYNTHESIZE(MyDelegate*,delegator,Delegator);//這一步不理解的看下面};遊戲層的建立步驟是大家最熟悉的CREATE_FUNC()啦,不過可能有的小夥伴對
CC_SYNTHESIZE這貨不是很理解。其實它就是一個宏啦。看下源碼:
#define CC_SYNTHESIZE(varType, varName, funName)\protected: varType varName;\public: virtual varType get##funName(void) const { return varName; }\public: virtual void set##funName(varType var){ varName = var; }看過源碼後,我們把CC_SYNTHESIZE(MyDelegate*,delegator,Delegator);帶進去試下,實際上與下面這幾條代碼是同樣的意思。
protected:MyDelegate* delegate;public:virtual MyDelegate* getDelegator(void) const { return delegate};virtual void setDelegator(MyDelegate* dele) { delegate = dele};
下面建立StatusLayer(狀態層)
//StatusLayer 繼承了MyDelegateclass StatusLayer : public cocos2d::Layer,public MyDelegate{public:virtual bool init();CREATE_FUNC(StatusLayer);void onGameStart() override;//遊戲開始void onGameEnd() override;//遊戲結束};
定義如下:
bool StatusLayer::init(){return true;}void StatusLayer::onGameStart(){CCLOG("Game Start");}void StatusLayer::onGameEnd(){CCLOG("Game Over");}好了,建立完後,就面臨一個問題了:GameLayer該怎麼去調用StatusLayer裡的onGameStart()與onGameEnd()兩個函數呢?
突然想起GameLayer的init()函數還沒有定義,那我就在init中勾引StatusLayer吧。
bool GameLayer::init(){StatusLayer* status_layer = StatusLayer::create();//建立一個狀態層this->setDelegator(status_layer);//設定delegator指向建立的狀態層this->delegator->onGameStart();//通過delegator調用StatusLayer的onGameStart()與onGameEnd()this->delegator->onGameEnd(); return true;}運行結果我就不打出來了。
下面做個簡短的總結吧:
很久很久以前,有一個叫StatusDelegate的智者,他有一種與生俱來的本領:讀心術(可以知道別人的狀態和想法)。他膝下有一女叫雅典娜(StatusLayer)
,慶幸的是雅典娜遺傳到了智者的讀心術。有一個叫蓋倫(GameLayer)的帥氣小夥子非常想學讀心術,於是他拜智者為師。智者告訴蓋倫說:讀心術
是教不來的,想學讀心術只有一個辦法,那就是娶我的女兒雅典娜為妻,然後與她陰陽雙修...最終以她身體為媒介才能擁有讀心術的能力。這個條件太過
苛刻了,我最後問你一遍:你願意嗎?
蓋倫艱難的吞了口口水,激動的說:我願意!
呵呵,這故事太嚴肅了,真不符合我的風格,呵呵。
尊重原創,轉載請註明來源:http://blog.csdn.net/start530/article/details/22829039