cocos2d第五篇--用户事件

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

事件

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

事件处理者

Cocos2d-x中的事件处理者是事件监听器类EventListener,它的类图如下图:
屏幕快照 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::function<bool(Touch *,Event *)>onTouchBegan。当一个手指触碰屏幕时回调该属性所指定的函数。如果函数返回值为true,则可以回调后面的两个属性(onTouchMoved和onTouchEnded)所指定的函数,否则不回调。

2)std::function<void(Touch *,Event *)>onTouchMoved。当一个手指在屏幕移动时回调该属性所指定的函数

3)std::function<void(Touch *,Event *)>onTouchEnded。当一个手指离开屏幕时回调该属性所指定的函数。

4)std::function<void(Touch *,Event *)>onTouchCancelled。当单点触摸事件被取消时回调该属性所指定的函数。

EventListenerTouchAllAtOnce中触摸事件响应属性:
1)std::function<void(const std::vector<Touch *>&,Event)>onTouchesBegan。当多个手指触碰屏幕时回调该属性所指定的函数
2)std::function<void(const std::vector<Touch *>&,Event *)onTouchesMoved。当多个手指在屏幕上移动时回调该属性所指定的函数。
3)std::function<void(const std::vector<Touch *>&,Event *)>onTouchesEnded。当多个手指离开屏幕时回调该属性所指定的函数。
4)std::function<void(const std::vector<Touch *>&,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坐标

单点触摸事件

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实...
    翘楚iOS9阅读 3,213评论 0 13
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,321评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,540评论 19 139
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 6,246评论 4 26
  • 人生或许悲苦,但是请你足够相信 在梦一般的年华里,却要承受含泪的记忆,这泪水不包含欢喜,不代表留恋。不幸的人生,各...
    Lareine_6c39阅读 367评论 0 0

友情链接更多精彩内容