Cocos2d-x游戏开发中的消息机制:CCNotificationCenter的使用

在HTML5游戏开发中,js可以使用Event对象的addEventListener(添加事件监听)、dispatchEvent(触发事件)实现监听机制,如果在coocos2d-x中,去实现这种机制该怎么办?

根据之前PureMVC(JS版)的经验,其中经典的观察者模式可以让我们引用到cocos2d-x中。我们可以尝试着把PureMVC(C++版)中的Notification(我称之为消息机制)引用进来,能让我们很轻易在Cocos2d-x开发的游戏中地实现监听。

其实Cocos2d-x在设计中,本身有用到观察者模式(Observer Model)。使用CCNotificationCenter可以满足我们的需求。

实现步骤:

1、发送消息:

在需要发送消息的地方,调用postNotification方法即可,postNotification有两种,可以不带数据和带数据。

1
2
void postNotification(const char* name);
void postNotification(const char* name,CCObject* data);

name是消息名,是消息唯一标识,在整个游戏过程中是唯一的,因此,我们一般把所有的消息名放在一个头文件中,纺织消息名重复,data是消息体,即发送的数据。

发送通知如下:

1
CCNotificationCenter::sharedNotificationCenter()->postNotification(name);

2、接受消息:

在任何地方,只要你你对某个消息感兴趣(和pureMVC中的listNotification一样),你就可以在那里监听该消息。添加消息监听是在onEnter()里面的:

1
void addObserver(CCObject* target,SEL_CallFuncO callBack,const char* name, CCObject* data);

参数1为事件监听的目标,参数2为回调函数(即接收到消息后执行的函数),参数3为消息名,参数4为消息体。

具体实现如下:

1
2
3
4
5
6
7
void GameLayer::onEnter(){
CCLayer::onEnter();
CCNotificationCenter::sharedNotificationCenter()->addObserver(this,
callfunco_selector(GameLayer::callBack),
name,
NULL
}

3、释放消息观察者:

释放消息观察者是很重要的,不释放的话,会产生内存泄露。我们需要在onExit()方法里面,释放消息观察者。

1
2
3
4
5
6
7
void GameLayer::onExit(){
CCLayer::onExit();
CCNotificationCenter::sharedNotificationCenter()->removeObserver(
this,
name //消息名
)
}
Ravior wechat
微信公众号:万物为媒, 关注一个技术人员的成长之路
写的不错, 点个赞吧!