Cocos2dx 小技巧(四)delegate委托

Cocos2dx 小技巧(四)delegate委托,第1张

概述尊重原创,转载请注明来源:http://blog.csdn.net/start530/article/details/22829039 有些技巧你不知道不要紧,但知道后会很牛逼。 ------------------- 假如我们游戏场景中有两个层,一个是游戏层,一个是状态层。游戏层就是控制游戏中角色的移动(为了简便说明,我自动忽视了控制层),状态曾就是当提示游戏状态,当游戏开始时显示“game s

尊重原创,转载请注明来源:http://blog.csdn.net/start530/article/details/22829039


有些技巧你不知道不要紧,但知道后会很牛逼。
-------------------
假如我们游戏场景中有两个层,一个是游戏层,一个是状态层。游戏层就是控制游戏中角色的移动(为了简便说明,我自动忽视了控制层),状态曾就是当提示游戏状态,当游戏开始时显示“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);带进去试下,实际上与下面这几条代码是同样的意思。


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()两个函数呢?
突然想起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)的帅气小伙子非常想学读心术,于是他拜智者为师。智者告诉盖伦说:读心术 是教不来的,想学读心术只有一个办法,那就是娶我的女儿雅典娜为妻,然后与她阴阳双修...最终以她身体为媒介才能拥有读心术的能力。这个条件太过 苛刻了,我最后问你一遍:你愿意吗? 盖伦艰难的吞了口口水,激动的说:我愿意! 呵呵,这故事太严肃了,真不符合我的风格,呵呵。

总结

以上是内存溢出为你收集整理的Cocos2dx 小技巧(四)delegate委托全部内容,希望文章能够帮你解决Cocos2dx 小技巧(四)delegate委托所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1031150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存