在移动平台中设备与用户的交互必须通过事件处理完成。用户输入被封装为事件,Cocos2d-x游戏引擎能够接收并处理这些事件,包括触摸事件、键盘事件、鼠标事件、加速度事件和自定义事件等。这里需要注意,不同平台之间事件略有差异,这与硬件有关,如在iOS
平台就无法接收键盘事件,在PC和Mac OS X平台无法接收触摸事件和加速度事件。
Cocos2d-x 用户事件处理机制
一般来说,事件处理机制都有三个角色:事件、事件源和事件处理,其中事件源是事件发生的场所,通常指控件或视图;事件处理者是接收事件并对其进行响应处理。
(1) 事件:
事件类是Event,它的子类主要有:
EventTouch(触摸事件)
EventKeyBoard(键盘事件)
EventMouth(鼠标事件)
EventAcceleration(加速度事件)
EventCustom(自定义事件)
(2) 事件源:
指的是Cocos2d-x中的精灵、层和菜单等节点对象。
(3) 事件处理:
Cocos2d-x中的事件处理者是事件监听类EventListener,它的子类主要有:
EventListenerTouchOneByOne(单点触摸监听器)
EventListenerTouchAllAtOnce(多点触摸监听器)
EventListenerKeyBoard(键盘事件监听器)
EventListenerMouse(鼠标事件监听器)
EventListenerAcceleration(加速度事件监听器)
EventListenerCustom(自定义事件监听器)
1.事件分发器
事件的监听和事件具有对应关系,Cocos2d-x提供了一个事件分发器(EventDispatcher)用于管理这种关系。
EventDispatcher类采用的是单例模式,可以通过Director::getInstance()->getEventDispatcher()获得事件分发对象。
EventDispatcher类中注册事件监听器到事件的函数如下:
(1)指定固定的事件优先级注册监听器,事件优先级决定事件响应的优先级,值越小优先级越高。
void addEventListenerWithFixedPriority(EventListener * listener, int fixedPriority)
(2)把一些控件的显示优先级作为事件优先级,越上层的精灵或层越先响应事件。
void addEventListenerWithSceneGraphPriority(EventListener * listener, Node * node)
当不再进行事件响应时,需要注销事件监听器。主要的注销函数如下:
(1)注销指定事件监听器
void removeEventListener(EventListener * listener)
(2)注销自定义事件监听器
void removeCustomEventListener(EventListener * listener)
(3)注销所有事件监听,注意:使用该函数之后,菜单也不能响应事件了,因为它需要接收触摸事件。
void removeAllEventListeners(EventListener * listener)
2.事件
下面主要介绍五类事件:
2.1 触摸事件
触摸事件可以有“按下”、“移动”和“抬起”的阶段,表示触摸的开始、移动和结束状态。另外,触摸事件的不同阶段都有单点触摸和多点触摸,具体还得看平台和设备。
(1)EventListenerTouchOneByOne(单点触摸监听器)
单点触摸事件中的响应属性:
1)当一个手指触摸屏幕时回调该属性的指定函数。如果返回为true,则可以回调后面两个属性所指定的函数,否则不回调。
std::function<bool(Touch * ,Event *)> onTouchBegan
2)当一个手指在屏幕移动时回调该属性所指定的函数。
std::function<void(Touch * ,Event *)> onTouchMoved
3)当一个手指离开屏幕时回调该属性所指定的函数。
std::function<void(Touch * ,Event *)> onTouchEnded
4)当单点触摸事件被取消时回调该属性所指定的函数
std::function<void(Touch * ,Event *)> onTouchCancelled
(2)EventListenerTouchAllAtOnce(多点触摸监听器)
多点触摸事件中的响应属性:
1)当多个手指触摸屏幕时回调该属性的指定函数。如果返回为true,则可以回调后面两个属性所指定的函数,否则不回调。
std::function<void(const std<