在移动平台中用户输入的方式有触摸屏幕,键盘输入和各种传感器。这些用户输入被封装成为事件,列如,在iOS平台有触摸事件和加速度事件等,在Android和windows phone平台有触摸事件,键盘事件和加速度事件等
事件
事件类是Event,类图如下:-
EventTouch
(触摸事件) -
EventMouse
(鼠标事件) -
EventKeyboard
(键盘事件) -
EventAcceleration
(加速度事件) -
EventCustom
(自定义事件)
事件源是cocos2d中的精灵,层,菜单等节点对象
事件处理者
Cocos2d-x中的事件处理者是事件监听器类EventListener,它的类图如下图:-
EventListenerTouchOneByOne
(单点触摸事件监听器) -
EventListenerTouchAllAtOnce
(多点触摸事件监听器) -
EventListenerKeyboard
(键盘事件监听器) -
EventListenerMouse
(鼠标事件监听器) -
EventListenerAcceration
(加速度事件监听器)
事件分发器
从前面的类图和命名上可以看出事件监听器与事件具有对应关系。例如,键盘事件(EventKeyboard)只能由键盘事件监听器处理(EventListenerKeyboard),他们之间需要在程序中建立关系,这种关系的建立过程被称为“注册监听器”。cocos2d-x提供一个事件分发器负责管理这种关系。
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 removeCustomEventListeners(const std::string & customEventName).
注销自定义事件监听器。 - 3)
void removeAllEventListeners()
.注销所有的事件监听器,需要注意的是,使用该函数后,菜单也不能响应事件了,因为它也需要接受触摸事件。
触摸事件
触摸事件有两个事件监听器:EventListenerTouchOneByOne
和EventListenerTouchAllAtOnce
,分别对应单点触摸和多点触摸。这些监听器有一些触摸事件响应属性,这些属性对应着触摸事件不同阶段。通过设置这些属性能够实现事件与事件处理者函数的关联。EventListenerTouchOneByOne中触摸事件响应属性:
1)std::function
当一个手指触碰屏幕时回调该属性所指定的函数。如果函数返回值为true,则可以回调后面的两个属性(onTouchMoved和onTouchEnded)所指定的函数,否则不回调。
2)std::function
当一个手指在屏幕移动时回调该属性所指定的函数
3)std::function
当一个手指离开屏幕时回调该属性所指定的函数。
4)std::function
当单点触摸事件被取消时回调该属性所指定的函数。
EventListenerTouchAllAtOnce中触摸事件响应属性:
1)std::function
。当多个手指触碰屏幕时回调该属性所指定的函数
2)std::function
。当多个手指在屏幕上移动时回调该属性所指定的函数。
3)std::function
。当多个手指离开屏幕时回调该属性所指定的函数。
4)std::function
。当多点触摸事件被取消时回调该属性所指定的函数。
使用这些属性的代码片段演示了它们的使用;
auto listener = EventListenerTouchOneByOne::create();
listener -> onTouchBegan = CC_CALLBACK_2(HelloWorld::touchBegan,this);
bool HelloWorld::touchBegan(Touch *touch,Event *event)
{
return false;
}
首先需要使用EventListenerTouchOneByOne::create()
来创建单独触摸事件监听器对象。然后设置它的listener -> onTouchBegan
属性,其中CC_CALLBACK_2
是使用CC_CALLBACK_2
宏绑定回调函数,该函数是下面定义的bool HelloWorld::touchBegan(Touch *touch,Event *event)
函数。
触摸事件的空间方面
空间方面就是每个触摸点对象包括了当前位置信息,以及之前的位置信息(如果有的话)下面的函数是可以获得触摸点之前的位置信息:
Vec2 getPreviousLocationInView()//UI坐标
Vec2 getPreviousLocation()//OpenGL坐标
下面的函数是可以获得触摸点当前的位置信息。
Vec2 getLocationInView()//UI坐标
Vec2 getLocation()//OpenGL坐标
单点触摸事件
下面以一个拖动一个精灵对象来实现单点触摸事件