课程概述
“Cocos2d-X的事件分发(3)”课程概述
本节课将讲述事件分发中比较复杂的触摸事件与自定义事件,以及其他的一些事件分发相关的知识。
课程笔记
触摸事件
触摸事件是手持设备最复杂最重要的事件,首先需要区分多个触摸点,其次每个触摸点的事件需要通过多次分发以表示开始、移动、结束、取消等状态。
cocos2d-X使用EventTouch来表示一个触摸事件,每个EventTouch记录了当前屏幕上处于相同状态(用EventCode表示)的一组触摸点的集合,由于一个触摸点在不同状态会触发多次事件分发,每个触摸点包含一个唯一的ID,通过Touch的getID获取。
Cocos2d-X将触摸事件对应的是订阅者分为两种,一种是EventListenerTouchAllAtOnce,表示一个多点触摸事件的订阅者,含有4个回调函数,每个状态的回调函数都包含当前所有处于该状态的触摸点,需要用触摸点的ID来区分每个触摸点。另外一种是EventListenerTouchOneByOne,将多个触摸点分为多个事件通知,也含有4个回调函数,其中onTouchBegan必须实现,否则接收不到事件通知。如果返回false,则其他回调函数无法相应,反之亦然。如果屏幕上同时有4个触摸点,则相当于调用了4次EventListenerTouchOneByOne,如果不希望这样,可以类似menu那样做一些判断机制。如果希望阻止触摸点向后面订阅者继续分发,可以在onTouchBegan返回true的情况下,调用setSwallowTouches(true)。
在eventDispatcher内部,先触发EventListenerTouchOneByOne,然后再触发EventListenerTouchAllAtOnce。可以通过onTouchBegan和setSwallowTouches来控制触发的订阅器。如果使用stopPropagation,只会停止一个事件(一个状态)。
触摸点的位置判断,touch事件传入类型为Touch的参数,包含getLocation、getPrevIoUsLocation、getStartLocation、getDelta、getLocationInView、getPrevIoUsLocationInView、getStartLocationInView函数。
元素不可见依然可以接收到触摸事件,需要在onTouchBegan的时候检查元素(以及长辈元素)的可见性。
其他系统事件
EventMouse处理鼠标。
EventAcclereation处理重力加速度。
EventKeyBoard处理键盘。
EventFocus处理焦点事件。
原文地址:
http://www.geekfaner.com/cocos2d-x/ReadCocos2dxSourceCode24.html