day(6) Cocos2d-x小技巧之delegate(委托)方法

Cocos2d-x小技巧之delegate(委托)方法

star特5302014-06-30 10:08:02826 次阅读

假如我们游戏场景中有两个层,一个是游戏层,一个是状态层。游戏层就是控制游戏中角色的移动(为了简便说明,我自动忽视了控制层),状态层就是提示游戏状态,当游戏开始时显示“game start”几个字,当游戏结束时显示“game over”。那么,该怎么实现游戏层与状态层间的通信呢?


有的人马上说:用单例啊,在状态层写一个单例,这样游戏层随时都可以调用。没错,单例确实可以解决层之间的通信,但是尽量不使用,太浪费空间。

下面介绍另一种方法:delegate(委托)


首先我建立一个委托的基类

1
2
3
4
5
6
<strong> class MyDelegate 
public
         virtual void onGameStart( void ) = 0; //创建游戏开始的虚函数 
         virtual void onGameEnd( void ) = 0; //创建游戏结束时的虚函数 
}; </strong>



下面创建一个GameLayer(游戏层)

1
2
3
4
5
6
7
8
9
10
<strong> class GameLayer : public cocos2d::Layer 
public
     static cocos2d::Scene* createScene(); 
     virtual bool init();   
   
     CREATE_FUNC(GameLayer); 
   
     CC_SYNTHESIZE(MyDelegate*,delegator,Delegator); //这一步不理解的看下面 
}; </strong>

游戏层的创建步骤是大家最熟悉的CREATE_FUNC()啦,不过可能有的小伙伴对CC_SYNTHESIZE这货不是很理解。其实它就是一个宏啦。看下源码:

1
2
3
4
#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);带进去试下,实际上与下面这几条代码是同样的意思。

1
2
3
4
5
protected
     MyDelegate* delegate; 
public
     virtual MyDelegate* getDelegator( void ) const { return delegate}; 
     virtual void setDelegator(MyDelegate* dele) { delegate = dele};


下面创建StatusLayer(状态层)

1
2
3
4
5
6
7
8
9
10
11
//StatusLayer 继承了MyDelegate 
class StatusLayer : public cocos2d::Layer, public MyDelegate 
public
     virtual bool init(); 
   
     CREATE_FUNC(StatusLayer); 
   
     void onGameStart() override; //游戏开始 
     void onGameEnd() override; //游戏结束 
};


定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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吧。

1
2
3
4
5
6
7
8
9
10
11
12
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
}


运行结果我就不打出来了。

来源网址:http://blog.csdn.net/star530/article/details/22829039

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值