理解一个触摸事件可以从时间和空间两方面考虑。

1、触摸事件的时间方面

触摸事件的在时间方面,如下图所示,可以有不同的“按下”、“移动”和“抬起”等阶段,表示触摸是否刚刚开始、是否正在移动或处于静止状态,以及何时结束,也就是手指何时从屏幕抬起。此外,触摸事件的不同阶段都可以有单点触摸或多点触摸,是否支持多点触摸还要看设备和平台。

触摸事件有两个事件监听器:EventListenerTouchOneByOne和EventListenerTouchAllAtOnce ,分别对应单点触摸和多点触摸。这些监听器有一些触摸事件响应属性,这些属性对应着触摸事件不同阶段。通过设置这些属性能够实现事件与事件处理者函数的关联。

EventListenerTouchOneByOne中触摸事件响应属性:

std::function<bool(Touch*,Event*)> onTouchBegan。当一个手指触碰屏幕时回调该属性所指定函数。如果函数返回值为true,则可以回调后面的两个属性(onTouchMoved和onTouchEnded)所指定的函数,否则不回调。

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

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

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

说明 std::function是一种通用的函数封装。std::function的实例可以是任何可以调用的目标,这些目标包括:函数、Lambda表达式、绑定表达式以及其它函数对象等。

EventListenerTouchAllAtOnce 中触摸事件响应属性:

std::function<void(conststd::vector<Touch*>&, Event*)> onTouchesBegan。当多个手指触碰屏幕时回调该属性所指定的函数。

std::function<void(conststd::vector<Touch*>&, Event*)> onTouchesEnded。当多个手指在屏幕上移动时回调该属性所指定的函数。

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

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

使用这些属性的代码片段演示了它们的使用:

  1. auto listener =EventListenerTouchOneByOne::create();
  2. listener->onTouchBegan =CC_CALLBACK_2(HelloWorld::touchBegan, this);
  3. ... ...
  4. bool HelloWorld::touchBegan(Touch*touch, Event* event) {
  5. ......
  6. returnfalse;
  7. }

首先我们需要使用EventListenerTouchOneByOne::create()创建单独触摸事件监听器对象。然后设置它的listener->onTouchBegan属性,其中CC_CALLBACK_2(HelloWorld::touchBegan, this)是使用CC_CALLBACK_2宏绑定回调函数,该函数是下面定义的bool HelloWorld::touchBegan(Touch*touch, Event* event)函数。

其它触摸事件的阶段也需要采用类似的代码,这里不再赘述。

2、触摸事件的空间方面

空间方面就是每个触摸点(Touch)对象包含了当前位置信息,以及之前的位置信息(如果有的话),下面的函数是可以获得触摸点之前的位置信息:

Point getPreviousLocationInView()                 //UI坐标

Point getPreviousLocation()                            //OpenGL坐标

下面的函数是可以获得触摸点当前的位置信息。

Point getLocationInView()                      //UI坐标

Point getLocation()                                           //OpenGL坐标

更多内容请关注Cocos2d-x系列图书《Cocos2d-x实战(卷Ⅰ):C++开发》
本书交流讨论网站:http://www.cocoagame.net
欢迎加入cocos2d-x技术讨论群:257760386、327403678

Cocos2d-x中触摸事件的更多相关文章

  1. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  2. cocos2dx 中触摸事件分发一些解读

    触摸事件分发中几个代码解读: 怎么说呢,感觉cocos2dx中的消息分发机制,相对于android中触摸事件分发机制要简单的多.因为android中要做区域判断,过滤器,以及父子组件分发给谁等等的逻辑 ...

  3. 一个demo让你彻底理解Android中触摸事件的分发

    注:本文涉及的demo的地址:https://github.com/absfree/TouchDispatch 1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOW ...

  4. UIView中触摸事件touchBegin

    UIView触摸事件touchBegin 等一系列方法 1)手指按下 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; ...

  5. 【转载】Quick 中的触摸事件

    原文地址 http://cn.cocos2d-x.org/article/index?type=quick_doc&url=/doc/cocos-docs-master/manual/fram ...

  6. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  7. 图解Android触摸事件分发

    Android中触摸事件传递过程中最重要的是dispatchTouchEvent().onInterceptTouchEvent()和onTouchEvent()方法. View和Activity有d ...

  8. iOS开发系列之触摸事件

    基础知识 三类事件中触摸事件在iOS中是最常用的事件,这里我们首先介绍触摸事件. 在下面的例子中定义一个KCImage,它继承于UIView,在KCImage中指定一个图片作为背景.定义一个视图控制器 ...

  9. 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...

随机推荐

  1. Swift学习笔记五

    基础运算符 Swift的大部分运算符和C及OC相同,也分一元二元多元的,这里只记录一些Swift特有的性质或写法. 赋值运算符( = ) 在等号右边是一个有多个值的元组时,它的成员值可以分解并同时分别 ...

  2. Codeforces Round #330 (Div. 1) A. Warrior and Archer 贪心 数学

    A. Warrior and Archer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/594 ...

  3. Codeforces Round #328 (Div. 2) A. PawnChess 暴力

    A. PawnChess Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/592/problem/ ...

  4. 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit ...

  5. delphi TPopupMenu.Popup

      procedure TPopupMenu.Popup(X, Y: Integer);     这个点是相对桌面的而不是窗体的   GetCursorPos是鼠标的位置 鼠标动这个点就不一样   v ...

  6. springMVC中的Controller里面定义全局变量

    转自:http://notebookdong.iteye.com/blog/1869852 使用SpringMVC的时候,如果想要在Controller中定义一个全局变量,并且实现在不同用户访问程序的 ...

  7. iOS开发——数据持久化Swift篇&文件目录路径获取(Home目录,文档目录,缓存目录等)

    文件目录路径获取(Home目录,文档目录,缓存目录等)   iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒.下面介绍常用的程序文件夹目录:   1,Home ...

  8. 面向对象设计原则OO

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  9. Ng-include 例子

    <body> <div ng-app="myApp"> <div ng-controller="firstController"& ...

  10. Redis 数据备份与恢复

    Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 redis 127.0.0.1: ...