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

假如我們游戲場景中有兩個(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
`