cocos2dx CCNotificationCenter的简单实用

来源:互联网 发布:淘宝客服什么时候上班 编辑:程序博客网 时间:2024/05/21 10:56

做过iOS开发的同学,应该很熟悉通知中心(NSNotificationCenter)这个东西,Cocos2d-x引擎中也集成了这个功能,即CCNotificationCenter下面就简单介绍一下。

一般情况下,通知中心主要用在跨页面或者类传递参数,有的时候,一个类做了某个操作后,想让另一个类进行相应的操作,也可以通过通知来实现。

打个比方,有一个mainLayer用来渲染主页面,在这个页面中,点击某个按钮的时候,弹出了一个subLayer,在subLayer中,当点击了某个按钮后,调用networkManager发送网络请求,然后,subLayer就关闭了,这时,如果想让网络请求完成后,将mainLayer中的某个控件隐藏,使用通知中心就方便多了,直接在mainLayer中注册通知,在networkManager网络请求完成的方法中直接发送通知就好了。在这种情况下,如果不适用通知,实现这种功能会变得很复杂,而且,耦合性太强了,如果不使用通知,要先将mainLayer的指针传给subLayer,然后再通过subLayer将mainLayer的指针传给networkManager,然后,在网络请求完成后,通过该指针,调用mainLayer中相应的方法,实现要求的功能。

在这里主要使用了CCNotificationCenter.h中的两个方法

void __NotificationCenter::postNotification(const std::string& name)


void __NotificationCenter::addObserver(Ref *target, SEL_CallFuncO selector,const std::string& name,Ref *sender)


前者用来发送通知,后者用来注册通知,如果想更多的了解其他的方法,可以查看该类的源码。

首先,定义一个宏,来代表该通知的名称,从postNotification和addObserve方法中可以了解到名字只能为string类型:

#define REQUEST_FINISH_NOTIFICATION "requestFinishNotification"


然后,在mainLayer中,注册监听:

CCNotificationCenter::sharedNotificationCenter()->addObserver(this,callfuncO_selector(MainLayer::notificationHandler),REQUEST_FINISH_NOTIFICATION,NULL);


这里的MainLayer::notificationHandler为MainLayer中的事件处理方法,当接收到通知后,会调用,该类如下:

void MainLayer::notificationHandler(Ref* obj){}

在这里写上所需的操作;其次,还要在networkManager中发送通知,当网络请求完成后,发送通知如下:

CCNotificationCenter::sharedNotificationCenter()->postNotification(REQUEST_FINISH_NOTIFICATION);
这样,就完成了通知的注册和发送,这里强调一下,由于是宏定义,所以,需要引入宏定义所在的头文件。

此外,当完成了注册之后,还要在析构函数中移除通知的监听,谁监听,谁就移除,可以使用如下方法:

MainLayer::~MainLayer()  {  CCNotificationCenter::sharedNotificationCenter()->removeObserver(this, REQUEST_FINISH_NOTIFICATION);  //也可以移除全部的监听//    CCNotificationCenter::sharedNotificationCenter()->removeAllObservers(this);  }
这样,就完成了一个简单的cocos2dx的通知功能。
0 0
原创粉丝点击