
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 事件分发机制源码解析
cocos2dx 3.0 lua tableview 在下载的安装包的 ExtensionTest里 !你的采纳是我前进的动力,
记得好评和采纳,答题不易,互相帮助,
手机提问的朋友在客户端右上角评价点(满意)即可.
如果你认可我的回答,请及时点击(采纳为满意回答)按钮!!
auto listener = EventListenerKeyboard ::create ()listener ->onKeyReleased = []( EventKeyboard ::KeyCode keyCode , Event * event ){
log ("KeyRelease:%d" , keyCode )//TODO对各按键处理
}
_eventDispatcher ->addEventListenerWithSceneGraphPriority ( listener, this )
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)