cocos2d第五篇--用户事件

在移动平台中用户输入的方式有触摸屏幕,键盘输入和各种传感器。这些用户输入被封装成为事件,列如,在iOS平台有触摸事件和加速度事件等,在Android和windows phone平台有触摸事件,键盘事件和加速度事件等

事件

事件类是Event,类图如下:
cocos2d第五篇--用户事件_第1张图片
屏幕快照 2018-01-08 上午11.07.28.png
  • EventTouch(触摸事件)
  • EventMouse(鼠标事件)
  • EventKeyboard(键盘事件)
  • EventAcceleration(加速度事件)
  • EventCustom(自定义事件)
    事件源是cocos2d中的精灵,层,菜单等节点对象

事件处理者

Cocos2d-x中的事件处理者是事件监听器类EventListener,它的类图如下图:
cocos2d第五篇--用户事件_第2张图片
屏幕快照 2018-01-08 上午11.10.56.png
  • 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().注销所有的事件监听器,需要注意的是,使用该函数后,菜单也不能响应事件了,因为它也需要接受触摸事件。

触摸事件

触摸事件有两个事件监听器:EventListenerTouchOneByOneEventListenerTouchAllAtOnce,分别对应单点触摸和多点触摸。这些监听器有一些触摸事件响应属性,这些属性对应着触摸事件不同阶段。通过设置这些属性能够实现事件与事件处理者函数的关联。EventListenerTouchOneByOne中触摸事件响应属性:
1)std::functiononTouchBegan。当一个手指触碰屏幕时回调该属性所指定的函数。如果函数返回值为true,则可以回调后面的两个属性(onTouchMoved和onTouchEnded)所指定的函数,否则不回调。

2)std::functiononTouchMoved。当一个手指在屏幕移动时回调该属性所指定的函数

3)std::functiononTouchEnded。当一个手指离开屏幕时回调该属性所指定的函数。

4)std::functiononTouchCancelled。当单点触摸事件被取消时回调该属性所指定的函数。

EventListenerTouchAllAtOnce中触摸事件响应属性:
1)std::function&,Event)>onTouchesBegan。当多个手指触碰屏幕时回调该属性所指定的函数
2)std::function&,Event *)onTouchesMoved。当多个手指在屏幕上移动时回调该属性所指定的函数。
3)std::function&,Event *)>onTouchesEnded。当多个手指离开屏幕时回调该属性所指定的函数。
4)std::function&,Event *)>onTouchesCancelled。当多点触摸事件被取消时回调该属性所指定的函数。
使用这些属性的代码片段演示了它们的使用;

  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坐标

单点触摸事件

下面以一个拖动一个精灵对象来实现单点触摸事件

你可能感兴趣的:(cocos2d第五篇--用户事件)