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中是这样模毁塌敬的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)