让我们来看看怎么用CCNotificationCenter。
在用cocos2d做开发的时候,会碰到类似于MFC的消息响应机制,即通过对不同的消息响应不同的事件。
让我们先来看看下面一种情形。现在有5个层和一个玩家。玩家在屏幕上某个位置点击了一下。现在这个点击的坐标要传到子弹上,让子弹沿着直线到这个点。然而子弹只和炮台有关联,而炮台又被置在炮台层上,炮台层则被置在场景层中,场景层才和触摸层有直接关系。所以这条链子是这样的:玩家消息 -> 触摸层 -> 场景层 -> 炮台层(有切换等级按钮) -> 炮台 -> 子弹。现在玩家消息要传到子弹上要走5步的样子,也就意味着每一层都要有一个函数来接受上一层传下来的信息并传到下一层。这是要多少工作量呢,而且一步走错就步步重来,不利于维护。 所以一个消息中心就很重要了。
因为
CCNotificationCenter
是一个全局使用的单例模式,所以每次只要通过调用CCNotificationCenter ::shared
NotificationCenter()就可以获取其实例。结合我们的触摸事件响应,我们利用该单例的post方法把消息传到消息中心中。函数如下
CCNotificationCenter::sharedNotificationCenter
()->postNotification(const char* msg,CCObject* obj);
其中msg即消息的名称,obj即要传入的数据。
我们以cctouchended为例。该函数作用是触摸结束后响应一个事件。函数原型如下:
TouchLayer::ccTouchEnded( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent )
其中pTouch表示触摸的坐标。还有个参数好像没什么用。现在传递一个消息到消息中心可以这么写:
CCNotificationCenter::sharedNotificationCenter
()->postNotification("ccTouchEnded",pTouch);
因为cocos2d里任何对象都是从ccobject类继承过来的,所以可以直接把触摸点一起传到消息中心,现在,消息中心有一条名为
ccTouchEnded的消息了。
然后怎么响应这个消息呢。还是回到我们上面那条链子,我们的目的是让子弹飞到这个点。于是该子弹类里必有一个实现该功能的函数(gotoThePos(
CCTouch *pTouch
))。于是我们在对子弹初始化init的时候,增加一个对响应事件的监听。函数如下:
CCNotificationCenter::sharedNotificationCenter ()-> addObserver(this,callfuncO_selector(Bullet::
gotoThePos
),"ccTouchEnded",NULL);
其中
ccTouchEnded就是消息中心里的消息了,而
callfuncO_selector(Bullet::
gotoThePos
)则是一个响应消息的回调函数,其中gotoThePos就是实现的方法了。