Cocos2d-x中的事件调用方式汇总

Cocos2d-x中的事件调用方式汇总,第1张

概述本文基于 cocos2d-x 2.1.5 1. Cocos2d-x 中的回调函数 Cocos2d-x 内部大量使用回调函数来进行消息传递(或者说事件调用)。 例如 CCMenu 的事件触发,CCAction 中的结束回调等等。 具体实现在 cocos2dx/cocoa/CCObject.h 中,这里包含了菜单、Action和shedule的回调。 typedef void (CCObject::*

本文基于 cocos2d-x 2.1.5

1. Cocos2d-x 中的回调函数

Cocos2d-x 内部大量使用回调函数来进行消息传递(或者说事件调用)。 例如 Ccmenu 的事件触发,CCAction 中的结束回调等等。

具体实现在cocos2dx/cocoa/CCObject.h中,这里包含了菜单、Action和shedule的回调。

@H_403_13@typedef voID (CCObject::*SEL_SCHEDulE)(float);SEL_CallFunc)();SEL_CallFuncN)(CCNode*);SEL_CallFuncND)(*, voIDSEL_CallFuncO)(SEL_MenuHandler)(SEL_EventHandler)(CCEventint (SEL_Compare)(*);#define schedule_selector(_SELECTOR) (SEL_SCHEDulE)(&_SELECTOR)#define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)#define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)#define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)#define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)#define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)#define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR)

以菜单组件常用的 menu_selector 来分析。

首先,使用typedef定义了一个成员函数指针 SEL_MenuHandler。

*);

SEL_MenuHandler 是 CCObject 的成员,接收一个 CCObject 指针形参。

用 C++11 提供的方式,也可以这样写:

using SEL_MenuHandler = voID (::*)( 接着,定义进行这种类型转换的宏。

@H_403_13@#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)

这个宏将使用 menu_selector 封装的代码,转换成一个 SEL_MenuHandler 函数指针的定义。(SEL_MenuHandler) 的作用是进行类型强制转换。

让我们看看具体的使用代码,位于 HelloCpp 项目的 ActionTest.cpp 中:

@H_403_13@CcmenuItemImage *item1 = CcmenuItemImage::create(s_pPathB1, s_pPathB2, this,0)">menu_selector(ActionsDemobackCallback) );

在这句代码中,将 ActionDemo::backCallback 这个函数作为指针传递进入 CcmenuItemImage 中。

CcmenuItemImage 在 initWithTarget 方法中将 ActionDemo 的实例 this, 以及 this 中的 backCallback 函数保存为 m_pListener 和 m_pfnSelector 。

@H_403_13@bool CcmenuIteminitWithTarget(CCObject rec,0)">SEL_MenuHandler selector){ setAnchorPoint(ccp(0.5f, 0.5f)); m_pListener rec; m_pfnSelector selector; m_bEnabled = true; m_bSelected false; return true;}

在 CcmenuItemImage 的 activate 方法中,对这个函数指针进行了调用。

voID
activate(){ if (m_bEnabled) { && m_pfnSelector) { (m_pListener->*m_pfnSelector)(this); } }}

若希望对上面函数指针的内容做进一步的了解,可以查看 《C++ Primer中文版(第5版)》6.7 函数指针19.4.2 成员函数指针

2. CCNotificationCenter

CCNotificationCenter 在 cocos2d-x 内部提供了一套观察者模式的实现。

下面是注册观察者的代码。注意这里依然用到了上面提到的函数指针的方法,使用的是callfuncO_selector这个宏。最后一个参数用于保存需要的数据到观察者中,之后可以使用CCNotificationObserver::getobject()来获取到这个数据。

@H_403_13@//定义事件#define CliCK_EVENT "clickEvent"//注册观察者CCNotificationCentersharednotificationCenter()->addobserver(callfuncO_selector(NotifTestSceneonClick),0)">CliCK_EVENT, NulL);//收到事件之后要移除观察者以避免内存泄露onClick(* __obj){ CcmessageBox(static_cast<CCString*>(__obj)getCString(), "onClick"); removeObserver(CliCK_EVENT);}

下面是发送事件的代码。发送事件的同时可以传递一个 CCObject 指针作为数据。

postNotification(&CCString("Hello World"));

CCNotificationCenter 源码位于cocos2dx/support目录中。

3. Signals

我在获取CCArmature动画的播放状态一文中对 Signals 做了介绍。

Signals 并非是 cocos2d-x 内部通信的常用方式,Signals 也并不是 cocos2d-x 核心代码的一部分。

总结

以上是内存溢出为你收集整理的Cocos2d-x中的事件调用方式汇总全部内容,希望文章能够帮你解决Cocos2d-x中的事件调用方式汇总所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存