• 欢迎来到GeekFaner

    每周更新一篇教程,轻松学习cocos2d-x

    联系我们
  • 又是一个美好的一天

    每天的太阳都是新的,今天要比昨天好

    联系我们
  • 出发!

    开始今天的课程学习,让我们的明天更美好

    联系我们

课程概述

“Cocos2d-X的事件分发(2)”课程概述

订阅者被成功注册到事件分发器后,事件分发器需要根据相应到的事件进行分发,本节课将重点讲述如何进行事件分发。

教学视频

课程笔记

事件的触发

事件的触发通过函数dispatchEvent或者dispatchCustomEvent来触发。dispatchCustomEvent会自动创建一个CustomEvent;也可以先创建一个CustomEvent的event,然后通过dispatchEvent的方法来触发。

事件的分发

在dispatchEvent的函数中,主要是实现了listenerID对应订阅者的排序,按照顺序调用订阅者的回调函数,最后再将状态更新。

在对listenerID对应订阅者排序的时候,先将优先级list从小到大排列,并找到第一个优先级大于0的订阅者索引,然后将Node对应的订阅者list按照绘制顺序进行排序。并且如果经常排序会导致性能问题,EventDispather采用做标记的办法,在变动做标记的listenerID的时候,就会重新排序,否则就不进行重新排序。在如下函数中会做标记:setLocalZOrder、setGlobalZOrder、setPriority、forceAddEventListener、removeEventListener。如果关联Node或者关联Node的父类Node发生Z变换,就会需要重新排序。

事件允许嵌套,即事件的回调函数中dispatchEvent另外一个事件。在函数中通过DispatchGuard guard(_inDispatch);标记,_inDispatch初始为0,dispatch的时候+1,生命周期结束的时候-1。需要注意的是:嵌套事件中不能执行一个相同的事件,否则会导致死循环。

在事件分发的过程中,优先级高的订阅者可以通过event的stopPropagation选择让事件停止传播

订阅者的修改

在事件分发的过程中修改订阅者的优先级,会在下一次触发事件的时候生效,而通过setEnable、setPause、setRegistered会即时生效。

在事件分发的过程中,订阅者的删除,只是将其标记为setRegistered(false),而在分发结束的时候移除。

在事件分发的过程中,订阅者的添加,只是加入临时数组_toAddedListeners,在所有事件分发结束后将其加入订阅者list。

事件与Node

调用Node的onExit的时候会调用Node及其子Node的pause函数,在pause函数中,会调用pauseEventListenersForTarget方法,调用OnEnter会调用Node及其子Node的resume函数,在resume函数中,会调用resumeEventListenersForTarget方法。

删除Node会自动移除和Node相关的订阅者。

联系我们

笔者制作网站的目的,主要是借用自己之前的知识背景(Android App开发和图形学知识),将自己学习笔记拿出来,和大家一起进行交流,毕竟每个人的知识体系不同,有交流才会有提高,所以欢迎大家通过各种方式和我联系。
网址:www.geekfaner.com
youku教学视频:http://i.youku.com/geekfaner
“百度传课”教学视频(高清版_推荐):http://www.chuanke.com/s2588605.html

wangshuo@geekfaner.com