Cocos2dx delegate委托-新闻详情

Cocos2dx delegate委托


发布时间:2016-10-11责任编辑:朱明 浏览:1340


Cocos2dx delegate委托

    假如我们游戏场景中有两个层,一个是游戏层,一个是状态层。游戏层就是控制游戏中角色的移动(为了简便说明,我自动忽视了控制层),状态曾就是当提示游戏状态,当游戏开始时显示“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 继承了MyDelegate  

class 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()两个函数呢?
突然想起GameLayerinit()函数还没有定义,那我就在init中勾引StatusLayer吧。

bool GameLayer::init()  

{  

    StatusLayer* status_layer = StatusLayer::create();//创建一个状态层  

  

    this->setDelegator(status_layer);//设置delegator指向新建的状态层  

  

    this->delegator->onGameStart();//通过delegator调用StatusLayeronGameStart()onGameEnd()  

  

    this->delegator->onGameEnd();  

  

    return true;  

}  

    那么delegate委托就算完成了可以运行查看运行结果。

 

 

春秋工作室   供稿