http://cn.cocos2d-x.org/tutorial/show?id=835
http://cn.cocos2d-x.org/tutorial/show?id=2343
Event,EventLisrener,EventDispatcher,Touch
1.Event:Type,isStoped,curTarget
enum class Type
{
TOUCH,
KEYBOARD,
ACCELERATION,
MOUSE,
CUSTOM
};
事件的各类分别为 ,触摸事件, 键盘事件, 加速器事件,鼠标事件, 用户自定义事件。
EventCustom:自定义事件(eventName,userData)
2.EventLisrener(抽象类):Type,onEvent|..listenerID,isRegisterd,paused,isEnabled..
enum class Type
{
UNKNOWN,
TOUCH_ONE_BY_ONE,
TOUCH_ALL_AT_ONCE,
CUSTOM
};
这个类型与Event的类型有一小点不同,就是将触摸事件类型分成了 One by One (一个接一个) 与
All At Once (同时一起)两种
实例:EventListenerCustom,通过create生成实例,关联基类onEvent的方式,
在init中生成一个函数回调关联到基类的onEvent,在回调中执行onEventCustom
3.EventDispatcher(各种map,vector的侦听器列表,add,remove,dispatchEvent)
场景节点优先级一般都是0,侦听器的存放顺序就是小于0,等于0,大于0的顺序,触发时间在渲染前,渲染中,渲染后
listenerMap<listenerID,EventLisrenerVector> ->保存所有事件侦听器的列表
priortyDirtyFlagMap<listenerID,DirtyFlag> ->有脏标记的侦听器的列表
nodeListenersMap<node,vector<EventLisrener>> ->node类型节点的事件侦听器列表
nodePriorityMap<node,int> ->node节点与事件级别的列表
globalZOrderNodeMap<float,vector<Node>> ->节点的Zorder与节点的指针列表
toAddedListeners ->事件分发后加入的侦听器列表
dirtyNodes ->与场景优先级侦听器相关联的node节点
isDispatch ->描述事件分发起是hi否在分发事件
internalCustomListenerIDs ->内部自定义的侦听器索引
add函数:
addEventListenerWithSceneGraPHPriority(listener,node)
设置优先级为0,从注释上我们已经得到这个信息了,这个方法加入的侦听器都是显示对象的,所以优先级都为0
addEventListene(listener):判断当前是否在分发信息
不在分发,强制加入 forceAddEventListener(listener)
正在分发消息那么新加入的侦听器就放到了临时数组_toAddedListeners里面
_listenerMap 用以侦听器类型(就是侦听器的ID)索引,值是一个数组,用来储存侦听同一侦听器ID的所有侦听器对象。
_priorityDirtyFlagMap 用来标记一类ID的侦听器列表是对象是否有变化,侦是侦听器ID,值为侦听级别。
_nodeListenersMap 用来记录结点类型数据的侦听器列表,通俗点说就是以结点为索引所有侦听的事件都存在这个map里面。
_dirtyNodes 现在可以理解什么是脏结点了,就是侦听器有变化的结点。
未完。。。。。
原文链接:https://www.f2er.com/cocos2dx/344514.html