Cocos2dx 小技巧(四)delegate委托

有些技巧你不知道不要緊,但知道后會(huì)很牛逼。

唯美的荷蘭風(fēng)車

假如我們游戲場景中有兩個(gè)層,一個(gè)是游戲?qū)?,一個(gè)是狀態(tài)層。游戲?qū)泳褪强刂朴螒蛑薪巧囊苿?dòng)(為了簡便說明,我自動(dòng)忽視了控制層),狀態(tài)曾就是當(dāng)提示游戲狀態(tài),當(dāng)游戲開始時(shí)顯示“game start”幾個(gè)字,當(dāng)游戲結(jié)束時(shí)顯示“game over”。那么,該怎么實(shí)現(xiàn)游戲?qū)优c狀態(tài)層間的通信呢?
有的人馬上說:用單例啊,在狀態(tài)層寫一個(gè)單例,這樣游戲?qū)与S時(shí)都可以調(diào)用。沒錯(cuò),單例確實(shí)可以解決層之間的通信,但我在第二篇里也有說過,單例這東西能不用就不用,太浪費(fèi)空間。

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

首先我建立一個(gè)委托的基類

class MyDelegate
{
public:
        virtual void onGameStart(void) = 0;//創(chuàng)建游戲開始的虛函數(shù)
        virtual void onGameEnd(void) = 0;//創(chuàng)建游戲結(jié)束時(shí)的虛函數(shù)
};

下面創(chuàng)建一個(gè)GameLayer(游戲?qū)樱?/strong>

class GameLayer : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();  
 
    CREATE_FUNC(GameLayer);
 
    CC_SYNTHESIZE(MyDelegate*,delegator,Delegator);//這一步不理解的看下面
};

游戲?qū)拥膭?chuàng)建步驟是大家最熟悉的CREATE_FUNC()啦,不過可能有的小伙伴對(duì)CC_SYNTHESIZE這貨不是很理解。其實(shí)它就是一個(gè)宏啦??聪?a target="_blank" rel="nofollow">源碼:

#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);帶進(jìn)去試下,實(shí)際上與下面這幾條代碼是同樣的意思。

protected:
    MyDelegate* delegate;
public:
    virtual MyDelegate* getDelegator(void) const { return delegate};
    virtual void setDelegator(MyDelegate* dele) { delegate = dele};

下面創(chuàng)建StatusLayer(狀態(tài)層)

//StatusLayer 繼承了MyDelegate
class StatusLayer : public cocos2d::Layer,public MyDelegate
{
public:
    virtual bool init();
 
    CREATE_FUNC(StatusLayer);
 
    void onGameStart() override;//游戲開始
    void onGameEnd() override;//游戲結(jié)束
};

定義如下:

bool StatusLayer::init()
{
    return true;
}
 
void StatusLayer::onGameStart()
{
    CCLOG("Game Start");
}
 
void StatusLayer::onGameEnd()
{
    CCLOG("Game Over");
}

好了,創(chuàng)建完后,就面臨一個(gè)問題了:GameLayer該怎么去調(diào)用StatusLayer里的onGameStart()與onGameEnd()兩個(gè)函數(shù)呢?
突然想起GameLayer的init()函數(shù)還沒有定義,那我就在init中勾引StatusLayer吧。

bool GameLayer::init()
{
    StatusLayer* status_layer = StatusLayer::create();//創(chuàng)建一個(gè)狀態(tài)層
 
    this->setDelegator(status_layer);//設(shè)置delegator指向新建的狀態(tài)層
 
    this->delegator->onGameStart();//通過delegator調(diào)用StatusLayer的onGameStart()與onGameEnd()
 
    this->delegator->onGameEnd();
 
    return true;
}

運(yùn)行結(jié)果我就不打出來了。

下面做個(gè)簡短的總結(jié)吧:

很久很久以前,有一個(gè)叫StatusDelegate的智者,他有一種與生俱來的本領(lǐng):讀心術(shù)(可以知道別人的狀態(tài)和想法)。他膝下有一女叫雅典娜(StatusLayer)
,慶幸的是雅典娜遺傳到了智者的讀心術(shù)。有一個(gè)叫蓋倫(GameLayer)的帥氣小伙子非常想學(xué)讀心術(shù),于是他拜智者為師。智者告訴蓋倫說:讀心術(shù)
是教不來的,想學(xué)讀心術(shù)只有一個(gè)辦法,那就是娶我的女兒雅典娜為妻,然后與她陰陽雙修...最終以她身體為媒介才能擁有讀心術(shù)的能力。這個(gè)條件太過
苛刻了,我最后問你一遍:你愿意嗎?
蓋倫艱難的吞了口口水,激動(dòng)的說:我愿意!

呵呵,這故事太嚴(yán)肅了,真不符合我的風(fēng)格,呵呵。

尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明來源:https://blog.csdn.net/start530/article/details/22829039

`

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容