Cocos2dx 小技巧(四)delegate委託

來源:互聯網
上載者:User

有些技巧你不知道不要緊,但知道後會很牛逼。
-------------------
假如我們遊戲情境中有兩個層,一個是遊戲層,一個是狀態層。遊戲層就是控制遊戲中角色的移動(為了簡便說明,我自動忽視了控制層),狀態曾就是當提示遊戲狀態,當遊戲開始時顯示“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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.