cocos2dx 3.10 事件机制

cocos2dx 3.10 事件机制,第1张

cocos2dx的事件机制里存在三类: Event、EventListener、EventDispatcher

先理解一下它们之间的关系

当我们按下按钮时(Event),会触发一个特定的事件(EventListener相当于回调函数),而这个特定的事件又存储在EventDispatcher里,可能按下这个按钮会触发多个事件,而事件的先后就是靠EventDispatcher来决定的。

Event的相关类

当出现来自鼠标,键盘,触屏,摇杆等输入源的输入时,这个事实称之为事件

引擎无时无刻都在感受事件。

Event

可以看出Event主要包含三个变量,一个是事件类型_type(也就是定义的枚举类型:触摸、键盘等),isStopped判断事件仔冲是否停止,只要事件停止,其相关的Listener都要停止callback调用。

EventTouch

它对应于四种触摸 *** 作,不同的EventCode可以告诉Listener来调用不同的callback。

EventCustom

它是用户自定义事件,userData记录用户自定义数据,另一个eventName是用户给事件取的别名

上面的源码都有英文注释,我就不多解释了,我只说一个最重要的_isRegistered,它判断事件有没有被注册,如果没有被注册就不会触发。(如何注册事件?将事件加入dispatcher)

在讲它之前,我们先了解槐戚橡一下它的一个重要变量。

sceneGraphListeners: 一个事件(比如说触摸事件),需要按照一定的响应序列,依次对这些Node进行事件响应,所以该类型的事件都会绑定一个与此相关联的node,并且 响应顺序是与node在scene下的zorder相关的 。该类型下的事件优先级统一为0。(与渲染树有关)

fixedListeners: 优先级根据 fixedPriority 的数值从小往大排序

只要出现了删除,修改,添加监听器的时候,监听器列表需要重新排序,都需要设置相应的 DirtyFlag *** 作。但是 Cocos-2dx v3.10 里面的 updateListeners 函数有删除监听器的 *** 作,然而并没有设置相应的 DirtyFlag *** 作。

会抛出下面的异常

Gt0Index() 方法其实就是获取到当前监听器中 fixedPriority == 0 的监听器在监听器向量中的位置,它 只有在给 Listener 排序的时候会设铅旁置,但是如果更新了对应 ListenerID 的向量(EventListenerVector),但是没有重新排序,就会出现 _gt0Index 未及时更新的情况 ,导致抛出这个异常。

引用:

Cocos2dx游戏引擎(3.x)----新的事件分发机制

cocos2dx之event事件(一)

cocos2dx之event事件(三):事件分发器EventDispatcher

Cocos2dx-v3.10 事件分发机制源码解析

auto b = Button::create(".png")

b->旦衫备addTouchEventListener([](Ref*pSender,Widget::TouchEventType type){........})

cocos2dx中是这样模毁塌敬的


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

原文地址: http://outofmemory.cn/bake/11993826.html

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

发表评论

登录后才能评论

评论列表(0条)

保存