深入cocos2d-x中的touch事件

在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的。

我们最先来看到CCTouchDispatcher这个类, 这个类在cocos2d-x中是管理和分发touch事件, 这个类继承于EGLTouchDelegate:

class CC_DLL EGLTouchDelegate
{
public:virtual void touchesBegan(CCSet* touches, CCEvent* pEvent) = 0;virtual void touchesMoved(CCSet* touches, CCEvent* pEvent) = 0;virtual void touchesEnded(CCSet* touches, CCEvent* pEvent) = 0;virtual void touchesCancelled(CCSet* touches, CCEvent* pEvent) = 0;virtual ~EGLTouchDelegate() {}
};

那么这个类是触摸的开始, 当然这里指的只是cocos2d-x这个库的外层接口, 而不包括openGL的部分。

在CCTouchDispatcher类中有两个方法: addStandardDelegate 和 addTargetedDelegate, 相信大家都用过的, 对, 这就添加多点和单点触摸的方法, 这个类里面定义了两个数组来管理这些添加进来的delegate, 然后当touch事件传到这个类时, 也就是会调用这个类的touchesBegan等这系列方法。而这四个方法都只是调用了下面这个方法:

void touches(CCSet *pTouches, CCEvent *pEvent, unsigned int uIndex);  

而这个方法主要内容就是分发touch事件, 首先分发的是单点事件:

//判断是否有单点的handler
if (uTargetedHandlersCount > 0)
{CCTouch *pTouch;CCSetIterator setIter;for (setIter = pTouches->begin(); setIter != pTouches->end(); ++setIter){pTouch = (CCTouch *)(*setIter);CCTargetedTouchHandler *pHandler = NULL;CCObject* pObj = NULL;//遍历所有单点的handler, 开始分发不同的事件CCARRAY_FOREACH(m_pTargetedHandlers, pObj){pHandler = (CCTargetedTouchHandler *)(pObj);if (! pHandler){break;}bool bClaimed = false;if (uIndex == CCTOUCHBEGAN) //touchBegan{//这里拿到的就是我们经常在ccTouchBegan里面是返回的true or falsebClaimed = pHandler->getDelegate()->ccTouchBegan(pTouch, pEvent);if (bClaimed)//如果为true, 说明这个delegate要处理事情{pHandler->getClaimedTouches()->addObject(pTouch);}} elseif (pHandler->getClaimedTouches()->containsObject(pTouch)){// moved ended canceledbClaimed = true;switch (sHelper.m_type)//分发事件的类型{case CCTOUCHMOVED:pHandler->getDelegate()->ccTouchMoved(pTouch, pEvent);break;case CCTOUCHENDED:pHandler->getDelegate()->ccTouchEnded(pTouch, pEvent);pHandler->getClaimedTouches()->removeObject(pTouch);break;case CCTOUCHCANCELLED:pHandler->getDelegate()->ccTouchCancelled(pTouch, pEvent);pHandler->getClaimedTouches()->removeObject(pTouch);break;}}//如果你返回了true并且你的类swallow掉了touch事件, 那么下面的touch事件就不再继续了if (bClaimed && pHandler->isSwallowsTouches()){if (bNeedsMutableSet){pMutableTouches->removeObject(pTouch);}break;}}}
}

这就是单点的事件了, 所以不论你把类的优先级怎么设置, 单点事件都是在多点事件之前处理的。而多点事件基本类似, 这里就不再赘述了。

然后我们再回到添加delegate的方法上, 来看看优先级的处理, addStandardDelegate 和 addTargetedDelegate都会调用下面这个添加方法:

void CCTouchDispatcher::forceAddHandler(CCTouchHandler *pHandler, CCArray *pArray)
{unsigned int u = 0;CCObject* pObj = NULL;CCARRAY_FOREACH(pArray, pObj){CCTouchHandler *h = (CCTouchHandler *)pObj;if (h){//查找比自己优先级数字大的并在它的位置插入if (h->getPriority() < pHandler->getPriority()){++u;}if (h->getDelegate() == pHandler->getDelegate()){CCAssert(0, "");return;}}}pArray->insertObject(pHandler, u);
}

这个方法主要是按照delegate的优先级来添加delegate, 所以代码中就表明了优先级数字越小, 优先级就越高, 但是这只是针对同种类型的touch事件。

这个类的其他方法, 比如移除delegate等等就不在这里赘述了, 好了, 这篇就到这里了。

注: 本文由啸寒原著,请支持原著!转载请附上原文链接: http://www.cnblogs.com/xiaohan-wu/p/3187994.html

转载于:https://www.cnblogs.com/xiaohan-wu/p/3265081.html

深入cocos2d-x中的touch事件相关推荐

  1. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  2. Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题

    1).按下按钮,不滑动,触发按钮功能 (2).按下按钮,滑动触发滑动事件 这里的按下包含长按和短按情况 首先要解决这个问题需要明白Android中的Touch事件是如何进行处理的,这里有一篇文章:An ...

  3. JavaScript中 Touch 事件详解

    1. touch 事件简介 touchstart 事件:当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发: touchmove 事件:当手指在屏幕上滑动的时候连续地触发.在这个事件发生期间 ...

  4. Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  5. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  6. Android 编程下 Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  7. android touch事件坐标原点,图解Android:Touch事件传递机制

    前言 Android事件管理机制是一名专业Android研发工程师必须要了解的核心知识之一,深入了解一下该机制无论对我们日常开发还是找工作,乃至于对我们的架构思想都有很大的帮助.Android中我们用 ...

  8. android touch事件解析 (从wms到viewgroup)

    不多说,进入正题: 关于Android中的Touch事件分发, 分为 服务端WindowManagerService(WmS,以下都以WmS简称), 负责采集与分发. 经过一些列调用, 会分发到cli ...

  9. Cocos Creator Touch事件与Unity3D Touch事件

    Cocos Creator Touch 事件 cc.Node 有一套完整的事件监听和分发机制.在这套机制之上,提供了一些基础的节点相关的系统事件.因此,在cocos creator中touch事件是与 ...

最新文章

  1. 大学计算机课程改革项目,大学计算机课程改革.ppt
  2. 【Java】方法的重载 (求最大值方法的重载+求和的重载)
  3. javaweb学习总结(二十九)——EL表达式
  4. 在 Eclipse 3.5中在线安装SVN插件
  5. 解决VS2010 beta2 安装后html标签和script智能提示不起作用的问题
  6. Golang系列:打印命令行参数
  7. Codeforce Flea CodeForces - 32C 规律|思维
  8. [转]深入理解linux内核list_head
  9. ansible之二:模块用法
  10. java sendto,Android:套接字-java.net.SocketException:sendto失败:EPIPE(管道断开)
  11. java中的jackson_Java中的JSON数据绑定框架Jackson使用介绍
  12. 如何建立个人商业画布
  13. 【Scratch案例实操】Scratch萌宠运动会 scratch编程案例教学 scratch创意编程 少儿编程教案
  14. 搭建hadoop集群,从安装虚拟机开始直到hadoop成功搭建
  15. Prolog语言介绍(一)
  16. js实现手机摇一摇功能
  17. t5_Sophisticated Algorithmic Strategies(MeanReversion+APO+StdDev_TrendFollowing+APO)_StatArb统计套利_PnL
  18. H5调用Android原生Api
  19. 让PS可以保存为ICO格式
  20. 虚拟直播需要哪些设备?如何搭建虚拟直播团队?

热门文章

  1. StyleCop(C#代码规范分析工具)---2.常用规则介绍(一)
  2. 【BATJ面试必会】Java 基础篇
  3. CC2540开发板学习笔记(一)——LED点亮
  4. 使用nginx做反向代理和负载均衡效果图
  5. Windows系统盘符错乱导致桌面无法加载。
  6. Spark Streaming学习笔记
  7. source insight设置tab键为4个空格
  8. 应用按home键无最近应用
  9. 求伯君:向暴雪学习 金山不求一夜暴富
  10. etcd 集群故障(数据变成只读)