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
;
}
|