from http://www.2cto.com/kf/201308/236359.html


注:下面这位同学对于cocos2d-x 2.x中的触摸机制分析简直可以说是清晰到家了。

重要补充:

  下面这位同学说得还少了一点,至少我使用当前的COCOS2D-X 2.2.4中测试发现,注册任务不一定非要在registerWithTouchDispatcher方法中实现(当然,这个地方注册可以看作是标准位置吧)。我在init函数中注册也是可以的。当然是调试通过我才这样下结论的!

在Cocos2d-x中提供两种触摸事件处理机制:CCStandardTouchDelegate和CCTargetedTouchDelegate。

一、如何使用

0、默认情况下CCLayer都是没有启动触摸事件的

所以需要在初始化函数中  this->setTouchEnabled(true); 启用触摸事件处理。

1、首先需要在 registerWithTouchDispatcher() 方法中注册处理触摸事件的机制。

[cpp]
void HelloWorld::registerWithTouchDispatcher() 

    //Standard Touch  
    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 0); 
    //Targeted Touch  
//    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);  
}

void HelloWorld::registerWithTouchDispatcher()
{
    //Standard Touch
    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 0);
    //Targeted Touch
//    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
}

PS: CCLayer的默认registerWithTouchDispatcher实现是注册为CCStandardTouchDelegate, 另外,在调用的时候不能自己调用registerWithTouchDispatcher,而应该调用

this->setTouchEnabled(true);

注意:我们在使用触摸事件机制的时候进行了注册,那么显然在使用后,需要进行remove的处理吧,其实这部分的内容不需要我们手动处理,移除的操作会自动在OnExit时候执行,所以不需要我们去关心!

2、实现回调函数

在两种实现机制中都分别指定了处理触摸事件的回调函数,所以用户在注册了不同的处理机制后,就需要实现响应的回调函数。

(1)Standard Touch

在CCStandardTouchDelegate包含四个回调函数,分别如下:

CCStandardTouchDelegate 默认事件
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); 处理按下事件
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); 处理按下并移动事件
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); 处理松开事件
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent); 处理打断事件
①这些回调函数中的参数,接收到的touch触摸是CCSet类型,说明是多点的touch。那么就可以实现多点触摸的处理了。如果要想实现多点触摸,那么首先需要在

[cpp]
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中设置:

[cpp]
//设置多点触摸  
    [__glView setMultipleTouchEnabled:YES];

//设置多点触摸
    [__glView setMultipleTouchEnabled:YES];

那么在回调函数中就可以进行多点触摸的处理了:

[cpp]
void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) 

    CCLog("tap count = %d",pTouches->count()); 
     
    for (CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch ++) { 
         
        CCTouch *pCurTouch = (CCTouch*)(*iterTouch); 
        CCPoint point = pCurTouch->getLocation(); 
        CCLog("%f,%f",point.x,point.y); 
    } 
}

void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
    CCLog("tap count = %d",pTouches->count());
   
    for (CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch ++) {
       
        CCTouch *pCurTouch = (CCTouch*)(*iterTouch);
        CCPoint point = pCurTouch->getLocation();
        CCLog("%f,%f",point.x,point.y);
    }
}

(2)Target Touch

CCTargetedTouchDelegate 包含下面四个回调函数:

CCTargetedTouchDelegate
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 处理用户按下事件,true表示继续处理, 否则false.
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); 处理按下并移动事件
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); 处理松开事件
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); 处理打断事件
CCTargetedTouchDelegate 和 CCStandardTouchDelegate 有很大的区别。

第一,CCTargetedTouchDelegate 回调里的参数接收的不是Touch事件的集合(CCSet),而是单个的Touch事件,cocos2d-x会将多点触摸拆散成单个的Touch事件再进行回调。即事件参数不再是集合,而是一次只传入一个触摸点。

第二,用户必须实现ccTouchBegan 函数,且如果某个用户按下消息需要继续跟踪,则ccTouchBegin返回true, 否则,ccTouchMoved,ccTouchEnded等接口不会被调用到。即ccTouchBegan方法返回一个布尔值,表示声明是否要捕捉这个 触摸点,只有在此方法中捕捉到的触摸点才会继续引发其他3个事件,否则此触摸点的其他事件都会被忽略。

第三,注意到

[cpp]
void CCTouchDispatcher::addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches)

void CCTouchDispatcher::addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches)

在addTargetedDelegate方法中,前两个参数分别对应触摸接收对象和优先级,其中优先级是一个整型参数,值越低,则优先级越高,也就越早获得触摸事件。通常,为了获得较高的优先级,可以将其指定为负数。

其中的第三个参数较为有趣,表明了是否"吞噬"一个触摸,如果设置为true,一个触摸一旦被捕捉,那么所有优先级更低的接收对象都无法接收到触摸。即用 户在注册TargetTouchDelegate的时候可以设置bSwallowsTouches标识,若某个TargetTouchDelegate将 该标识设为true,且需要处理某个Touch事件(ccTouchBegan

返回true),则调到该Delegate之后cocos2d-x不会将Touch消息发送给其他的TargetTouchDelegate和StandardTouchDelegate。

例如:CCMenu就是一个会"吞噬"且优先级为-128的触摸接收器,由于它的优先级很高,所以菜单按钮总能获得触摸响应。

二、touch 事件分发顺序

cocos2d-x 首先派发事件给CCTargetedTouchDelegate, 再派发事件给CCStandardTouchDelegate。对于相同类型的TouchDelegate, 则是根据注册的优先级

来确定派发先后顺序。如果优先级也一样,则按照注册的顺序派发事件。

Cocos2d-x Touch事件处理机制(better)相关推荐

  1. Cocos2d-x Touch事件处理机制

    一.两种机制的四种不同的事件 CCStandardTouchDelegate 默认事件 virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pE ...

  2. Android之滑动事件冲突解决 Touch事件处理机制总结

    android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解.  一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN- ...

  3. ​iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景.

    2019独角兽企业重金招聘Python工程师标准>>> 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在 ...

  4. Android中事件处理机制一分钟理清思路

    刚开始对我事件处理机制的概念还挺模糊的,而网上的讲解又很杂很乱.那么现在在这里你可以快速理清事件处理机制了. 首先用处肯定得知道: 事件处理机制就是为了应对嵌套式的布局中强焦点和弱焦点的点击事件进行自 ...

  5. java事件处理模型_从零开始理解JAVA事件处理机制(3)

    我们连续写了两小节的教师-学生的例子,必然觉得无聊死了,这样的例子我们就是玩上100遍,还是不知道该怎么写真实的代码.那从本节开始,我们开始往真实代码上面去靠拢. 事件最容易理解的例子是鼠标事件:我们 ...

  6. Android平台的事件处理机制和手指滑动例子

    Android平台的事件处理机制有两种 基于回调机制的事件处理:Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通过重写View中的这些回调方法来实现需要的响应事件. 基于 ...

  7. Android中的事件处理机制

    Android提供了强大的事件处理机制,它包括两套处理机制: 1.基于监听的事件处理 2.基于回调的事件处理 对于Android基于监听的事件处理,主要的做法是为Android界面组件绑定特定的事件监 ...

  8. QT开发(十二)——QT事件处理机制

    一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...

  9. Android基于监听的事件处理机制

    Android提供了强大的事件处理机制,主要包括两大类: 1,基于监听的事件处理机制:主要做法是为Android界面组件绑定特定的事件监听器 2,基于回调的事件处理机制:主要做法是重写Android组 ...

最新文章

  1. python注入_Python如何考虑代码注入安全?
  2. win10计算机右键属性打不开,win10系统右键计算机无法打开属性窗口的解决技巧...
  3. 什么是心理测试系统软件,心理测评系统是什么
  4. 再见,付费录屏软件!我用70行Python代码打造免费版!
  5. 项目经理的软技能提升——知行合一
  6. 青蛙跳台阶问题暨斐波那契数列
  7. break continue
  8. 解决ubuntu的firefox上网速度慢[转]
  9. STL之set的应用
  10. webstorm 破解
  11. 尔雅 科学通史(吴国盛) 个人笔记及课后习题 2018 第七章 实验传统的兴起
  12. H3C基础配置命令(一)
  13. MacOS为什么无法删除ABC或日语输入法
  14. python随机生成licence plate numer
  15. 乐鑫Esp32学习之旅 23 安信可 esp32-a1s 音频开发板移植最新 esp-adf 音频框架,小试牛刀如何实现在线文字转语音播放。
  16. 有关HTML的学习笔记
  17. 【01】花卉识别-基于tensorflow2.3实现
  18. 大数据要学什么?看看这份大数据课程大纲
  19. 关于移动端token解决方案
  20. 美国计算机专业的大学,美国计算机专业什么大学好

热门文章

  1. MVC4发布到IIS,出现HTTP 错误 404.0 - Not Found的解决方法
  2. MySQL的IFNULL解决判空问题
  3. 解决chrome浏览器adobe flash player不是最新版本亲测可用的方法
  4. 不推荐使用getResources()。getColor()[重复]
  5. wget命令下载文件并另存为不同的文件名
  6. 如何默认选择一个单选按钮? [重复]
  7. 在WPF中,x:Name和Name属性之间有什么区别?
  8. vue 父循环怎么拿子循环中的值_Vue 父组件循环使用refs调用子组件方法出现undefined的问题...
  9. slam无人车清除地图残影
  10. 分页标签commons.tld,NavigationTag,Page