一、在cocos2.x版本中,大多数事件,包括触摸、键盘等的响应机制,是通过重写父类的虚函数来实现的,这样的事件响应机制耦合度太高,导致的结果就是通用性不好、模块化不高。例如父类中关于触摸事件的虚函数:


二、而在cocos3.x版本中,原来的事件系统得到了较好的升级,演变成了一个较为独立、完善和通用的组件模块,即事件分发系统,不仅可以用来分发各种系统事件,也可以用来分发用户自定义事件。其大致工作流程如下图所示:


1、利用不同的事件订阅者订阅对应的事件,并设置事件响应回调。在cocos中,事件订阅者是EventListener类的一系列子类,包括EventListenerTouch、EventListenerMouse、EventListenerKeyboard、EventListeneracceleration、EventListenerPhysicsContact、EventListenerCustom等;而他们所对应的事件类型,则是一个Event枚举:

/** Type Event type.*/
    enum class Type
    {
        TOUCH,KEYBOARD,acceleration,MOUSE,FOCUS,GAME_CONTROLLER,CUSTOM
    };

最后设置响应事件回调则是填写对应事件订阅者内部的function类型成员变量:


2、向事件监听器提交事件订阅。cocos的事件监听器(Eventdispatcher)统一管理所有的事件,包括系统事件和用户自定义事件。Eventdispatcher可以从继承Node类中的_eventdispatcher成员变量获取,也可以使用Director::getInstance()->getEventdispatcher()获取;然后提交事件订阅则可以使用Eventdispatcher的addEventListenerWithSceneGraPHPriority(),默认以场景顺序为优先级来进行事件的处理,当然也可以使用固定优先级进行提交addEventListenerWithFixedPriority()。

3、4、当有事件发生时,事件监听器便会在事件订阅列表中查找对应事件,然后通知所有提交了该事件的订阅者。这一步Eventdispatcher会进行一个查找通知操作,所以一般提交的事件订阅不宜过多,否则对事件响应的速度会产生一定影响。

5、订阅者接收到事件监听器分发的事件通知后,触发事件回调,进入对应的事件处理逻辑进行响应。

COCOS-3.X事件分发机制-原理的更多相关文章

  1. ios – 链接点击监听器上的WKWebView?

    在WKWebView类中是否存在类似onLinkClickListener的东西?我试着谷歌搜索但没有发现任何东西,我也发现了一些关于simillar类型的stackoverflow的未解答的问题.我需要一个linkClickListener的原因是,当我点击链接并且页面尚未加载时,它不会加载网站.当页面加载了监听器时,我也可以创建一个花哨的加载屏幕.解决方法你可以这样做将WKNavigation

  2. 多个监听器用于委托iOS

    我有一个带有代理didSelectString的类搜索栏.我有一个实现委托的A类和一个实现委托的B类.但是只有来自A类的代理才被执行.代表可以有多个监听器吗?并且如何实现这一点解决方法该委托是单一消息传递协议.如果要发送更改的多个对象,则需要使用NSNotifications.您可以使用通知中心传递对象,如下所示:想要收听通知时并设置选择器

  3. swift中提供属性监听器,可以监听属性的改变

  4. [swift]-属性监听器

    1:swift中监听属性的变化是通过属性监听器来监听OC中监听属性变化是通过set方法来监听属性变化2:代码演示意见反馈邮件:1415429879@qq.com欢迎你们的阅读和赞赏、谢谢!

  5. Swift - 属性监听器

    属性监听器介绍:属性监听器,监听属性的值改变,就像按钮的点击事件一样来监听其他的值改变举例:监听scrollView的contentOffset属性的改变

  6. android – 使用回调/监听器链接RxJava observable

    这是我到目前为止:解决方法调整clemp6r的解决方案,这是另一个既不需要主题也不需要嵌套订阅的解决方案:一般来说,我认为总是可以使用Observable.create()在Observable中包装任何基于回调的异步操作.

  7. Android – 可靠地获取当前位置

    错了,因为如果用户的位置已经稳定,那么我的听众永远不会被调用,因为位置没有改变.但GPS将一直运行,直到我的听众被移除,耗尽电池……获取当前位置的正确方法是什么,而不会误认为当前位置的旧位置?我不介意等几分钟.编辑:有可能我错误的是没有被叫的听众,它可能只需要比我想象的要长一点……

  8. android – 如何在片段打开的自定义对话框中保留监听器?

    我遇到了一些障碍.我的场景非常类似于DialogFragment–retaininglistenerafterscreenrotation所描述的场景建议的解决方案适用于作者,因为他的对话框是从活动中调用的.我的情况完全相同,但我的自定义对话框是从片段而不是活动调用的.(IEActivity->Fragment->Dialog)我实现了相同的解决方案(从调用Fragment设置onResume中的

  9. android如何停止gps

    通过以下代码启动监听器后工作正常.一段时间后,我通过以下代码停止监听器但问题是它仍在搜索我的gps任何解决方案???

  10. ViewPager的Android事件监听器数据绑定

    是否可以使用Android绑定功能将setonPagechangelistener的处理程序绑定到XML文件中的ViewPager?演示显示onClick事件,但我很好奇我可以用它实现多少事件功能.关于数据绑定功能的任何链接也都很棒.谢谢.假设的例子:example_activity.xmlHandler.java编译错误是:错误:(62)在’android’包中找不到属性’onPagechang

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部