[2.x]cocos2d-x的消息和数据传递

[2.x]cocos2d-x的消息和数据传递,第1张

概述From: http://ju.outofmemory.cn/entry/73761 如何在层间或者场景间进行消息传递,大概是每个初学者都要面对的问题吧。这里介绍cocos2d-x的一种消息/数据传递方式,内置的观察者模式,也称消息通知中心,CCNotificationCenter。 1.CCNotificationCenter CCNotificationCenter是cocos2d-x提供的一

From: http://ju.outofmemory.cn/entry/73761

如何在层间或者场景间进行消息传递,大概是每个初学者都要面对的问题吧。这里介绍cocos2d-x的一种消息/数据传递方式,内置的观察者模式,也称消息通知中心,CCNotificationCenter。

1.CCNotificationCenter

CCNotificationCenter是cocos2d-x提供的一个消息中心,类似于观察者模式,是一个单例类,用于辅助控制消息传递。大概工作原理如下图。


这里以A,B通讯为例,A,B可以是层间或者场景间。假如A要向B发送带数据的消息。那么

(1)B向小心中心注册一个bMsg的消息,告知消息中心,如果消息中心接收到bMsg,必须通知B,以便B采取相应的措施。

(2)A向消息中心发送bMsg消息。

(3)消息中心接收到bMsg,查询有谁在它这里注册了这个消息,发现是B,就通知B有人发送了bMsg。

(4)当然这个消息带有A要传递的数据,而B也不知道到底是谁给它发了bMsg这条消息,除非在传递的数据中指出。

2.相关API
  //获得消息通知中心的一个单例对象    static CCNotificationCenter *sharednotificationCenter(voID);  //销毁通知中心的单例对象   voID purgeNotificationCenter//添加观察者   addobserver(CCObjecttarget,                  SEL_CallFuncO selector                  constcharname                  obj    //移除观察者       removeObserver//移除所有观察者  int removeAllObservers//发送消息   postNotification//发送带数据的消息  *object);

观察者的意思即是等待获取消息的对象,比如上图的B。

3.原理

CCNotificationCenter的实现比较简单,它的内部维护了一个CCArray数组,数组的元素是CCNotificationObserver类型的对象,CCNotificationObserver封装了回调的执行者,回调函数,消息名称以及传递的数据。每次注册,也就是添加观察者,其实就是把这个CCNotificationObserver对象加入通知中心的CCArray数组,而每次的消息发送就是将消息传递给通知中心,由通知中心遍历这个数组,找到一致的消息,调用这些回调函数。其实这样看起来,就像是A在调用B的函数。具体的就自己看下源码吧。

4.示例

这里做了一个场景,包含了2个层,目的是层A向层B发送带数据的消息,层B收到后打印出这条数据。

//ALayer  boolALayer::init()  {       bRet=false;do                CC_BREAK_IF(!cclayer());          CCSize visibleSize =CCDirectorsharedDirector()->getVisibleSize();CcmenuItemImagepCloseItem CcmenuItemImagecreate(              "Closenormal.png""CloseSelected.png"              this              menu_selector::PostMessage));//按钮用于点击发送消息            pCloseItem->setAnchorPointccp(0.5));setpositionvisibleSize.wIDth/2heightCcmenu pMenu pCloseItem NulL          pMenuCCPointZero          addChildpMenu 1          bRettrue}while0returnCCObject pSender)      CCString str=("Hello BLayer!"CCNotificationCenterpostNotification"BMessage"str);//发送带str的消息BMessage  //BLayer  BLayeraddobservercallfuncO_selectorgetMessage),NulL//注册BMessage,如果接收到了,执行getMessage   objstatic_cast//打印出传递的数据  ccloggetCString  ::~purgeNotificationCenter();//释放通知中心单例对象  }
5.注意

使用CCNotificationCenter需要注意以下几点:

(1)一个对象可以注册多个消息,一个消息也可以由多个消息注册。

(2)传递参数,A可以向B传递参数,而B在注册的时候也可以带一个参数,如果这两个数据不是指向同一对象的话,消息不会传递。也就是说要么A传递NulL对象,要么B注册时带NulL对象,要么都不是NulL但必须是同一对象,消息传递才会成功。以下是发送消息执行的判断:

  if(!strcmpobservergetname())&&getobject==object|| observer NulL ))

(3)局部变量的传递,注意到上例,传递的是CCString的一个局部变量(但还是要@R_301_6843@release),从CCNotificationCenter的实现上来看,这是没有问题的,因为数据是在postNotification被调用的,也就是整个函数体并没结束,数据不会被销毁。

6.效果图
7.源码下载

下载地址

原文地址:http://www.fusijie.com/blog/2013/12/03/play-cocos2dx-28/
版权声明:自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0

总结

以上是内存溢出为你收集整理的[2.x]cocos2d-x的消息和数据传递全部内容,希望文章能够帮你解决[2.x]cocos2d-x的消息和数据传递所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1022419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存