CCLayer在Touch事件(Standard Touch Delegate和Targeted Touch Delegate)

在做练习,触摸故障,看到源代码,以了解下触摸事件.

练习操作:直CClayer子类init在 this->setTouchEnabled(true);

事件处理方法覆盖

	virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
	virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
	virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);	

结果按键没反应

由于setTouchEnabled(true); 开启多点触摸,  而事件处理方法是针对单点的,所以不行.

解决方法1.

覆盖事件多点处理方法

	 // default implements are used to call script callback if exist
    	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);

从參数类型CCSet能够看出此參数是集合,应该是多个按的点.

解决方法2.

覆盖onEnter(),加上单点事件托付

onEnter()
{
	CCDirector* pDirector = CCDirector::sharedDirector();
	pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
	CCLayer::onEnter();//这个要要加
}
CClayer::onEnter()
{
	....
    if (m_bTouchEnabled)	//这个m_bTouchEnabled就是setTouchEnabled(true)设置的
    {
        this->registerWithTouchDispatcher();//会设置Standard Touch Delegate,这也是为什么CCLayer默认採纳这样的方式
    }
	.....
}

touch 事件分发顺序

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

来确定派发先后顺序。假设优先级也一样,则依照注冊的顺序派发事件。

-------------------------------------------------------------------------------------------------------------------------

以下是别人总结分享的   http://www.cnblogs.com/pengyingh/articles/2435160.html

Cocos2d 开发中提供了两种touch处理方式,Standard Touch Delegate和 Targeted Touch Delegate方式(參见CCTouchDelegateProtocol.h中源码),CCLayer默认是採用第一种方式(參见CCLayer的 registerWithTouchDispatcher方法)。

CCLayer子类中要能接收touch事件。首先须要激活touch支持。在init方法中设置isTouchEnabled值为YES。

Standard Touch Delegate(CCLayer默认採纳这样的方式)

Standard方法中用户须要重载四个主要的touch处理方法,例如以下:

  1. -(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

touch事件发生时。会调用该方法响应touch事件。假设是单点touch,则仅仅须要调用 UITouch *touch = [touches anyObject],就能够获取touch对象。假设须要响应多点 touch。则须要调用[[event allTouches] allObjects]返回一个UITouch的NSArray对象。然后使用NSArray的objectAtIndex依次訪问各个UITouch对象。

为了获取UITouch对象的坐标(如果该UITouch名称为touch),调用[touch locationInView: [ touch view]]会返回一个UIView相关的坐标viewPoint。

使用Cocos2d的新建应用程序向导创建一个新的cocos2d application时,在xxxAppDelegate类的applicationDidFinishLaunching方法中CCDirector会将UIView转换为支持OpenGL ES的EAGLView。

此时。我们还须要将前面获取的UIView中的viewPoint转换为EAGLView坐标,调用[[CCDirector sharedDirector] convertToGL: viewPoint]就可以实现。

  1. -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
  2. -(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
  3. -(void) ccTouchesCancelled:(NSSet*)touch withEvent:(UIEvent *)event;

这三个方法和ccTouchesBegan类似。

Targeted Touch Delegate方式

在standard方式中的响应处理事件处理的都是NSSet,而 targeted方式仅仅处理单个的UITouch对象,在多点触摸条件下,应该採纳standard方式。在使用targeted方式之前须要重写CCLayer中的registerWithTouchDispatcher方法:

  1. //记得在头文件里导入“CCTouchDispatcher.h”
  2. -(void) registerWithTouchDispatcher {
  3. [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
  4. }

targeted方式中用户须要重载4个主要的处理方法。当中ccTouchBegan必须重写,其它三个是可选的。

  1. - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event; (必须实现)
  2. - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
  3. - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
  4. - (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;

每次touch事件发生时,先调用ccTouchBegan方法,该方法对每一个UITouch进行响应并返回一个BOOL值。若为YES,则兴许的ccTouchMoved、ccTouchEnabled和ccTouchCancelled才会接着响应。

多点触摸支持

在xxxAppDelegate类的applicationDidFinishLaunching方法中增加以下代码

  1. [glView setMultipleTouchEnabled:YES];

addTargetedDelegate:self中的swallowsTouches

关于swallowsTouches

[[CCTouchDispatcher  sharedDispatcher] addTargetedDelegate:self priority:kCCMenuTouchPriority swallowsTouches:YES];

假设 swallowsTouches:YES && touch begin return  yes

那么他的move 和end就接受。,别的类就不再接受了。

假设swallowsTouches:NO &&begin return  yes

那么他的move 和end接受。其他类仍然能够接受。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-11-09 06:10:27

CCLayer在Touch事件(Standard Touch Delegate和Targeted Touch Delegate)的相关文章

移动端touch事件 || 上拉加载更多

前言: 说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉 实现加载更多的插件.然后就留下了个坑:上拉加载的时候会由于用户错误的姿势,例如长按后再touchmove等会出现卡死的假象.(ps:当然, 我不认为是插件的问题,当时的想法是觉得引用的插件存在冲突),于是,我就直接通过封装touch事件完成上拉加载实现分页的功能. 备注:文章最后会加上为实现这个功能我找的一些插件 了解touch事件 在应用touch事件实现上拉加

React-Native系列Android——Touch事件原理及状态效果

Native原生相比于Hybrid或H5最大优点是具有流畅和复杂的交互效果,触摸事件便是其中重要一项,包括点击(Click).长按(LongClick).手势(gesture)等. 以最简单常见的点击(Click)为例,Native组件可以自定义selector,使得被点击的组件具有动态效果,Android 5.0以上甚至可以有涟漪效果(Material Design).而这些在Hybrid或H5中很难实现,很多时候区分它们与原生最简单的方法就是检验点击交互效果. React-Native的强大

菜鸟进阶之Android Touch事件传递(二)

这是touch事件传递系列博客的第二篇,如果想了解touch和click的那些事,请浏览投产事件传递系列的第一篇.http://blog.csdn.net/bingospunky/article/details/43603397 理理思路,我发现touch传递这部分的内容很多,所以每篇博客介绍一个方面比较好.这篇博客主要介绍touch事件传递的现象,一个简单的demo,让大家可以看到touch一步一步传递的过程.下篇博客中在研究源码是怎么实现的.再后面的博客会试图改变这篇文章看到的touch的传

【Android 1.6】View和ViewGroup的touch事件分析和总结

ENV: android 1.6 目前Android版本已经到了7.0(nougat)了,Android 随着版本升级,touch事件的源码也在跟随着系统的升级而写得越来越复杂,加入了很多旁枝末节,这些旁枝末节,对于分析流程是一种干扰:由于Android的版本升级是向下兼容的,万变不离其宗,研究Android早期的版本,可以更容易理解touch事件的分发,本篇以Android1.6版本的源码进行讲解,由简及繁,理解了早期的源码,再进入高版本的研究也会更容易许多. 前言: View事件的派发其实非

自定义View系列教程07--详解ViewGroup分发Touch事件

自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 PS:如果觉得文章太长,那就直接看视频吧 在上一篇中已经分析完了View对于Touch事件的处理,在此基础上分析和理

菜鸟进阶之Android Touch事件传递(三)

费了这么大劲,终于写完了,这是我的原创.转载请说明出处:http://blog.csdn.net/bingospunky/article/details/44156771 这是touch传递系列文章的第三篇,我打算在这篇文章里从源码的角度解释dispatchTouchEvent.onInterceptTouchEvent.onTouchEvent方法的返回值影响touch传递的原理. 如果想了解touch和click的那些事,请浏览touch事件传递系列的第一篇http://blog.csdn.

Cocos2dx之touch事件

今天看了下ccocos2dx touch事件部分的源码,从CCTouch.CCTouchHandler和CCTouchDispatcher简单的做了分析和总结,先直接看源码吧! 1.CCTouch class CC_DLL CCTouch : public CCObject { public: CCTouch() : m_nId(0), m_startPointCaptured(false) {} /** returns the current touch location in OpenGL

cocos2d-x中关于touch事件的响应

原作者:有缘人  来源:新浪微博 地址:http://blog.sina.com.cn/s/blog_6ac2c7260102vvdu.html 一.touch事件响应分为单点触摸响应和多点触摸响应. 单点触摸响应需要重载的方法: virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void

让UITableView响应touch事件

我们知道UITableView没有像UIButton那样可以通过addTarget方法来监听touch事件,因此在某些场合,特别是在UITableViewCell中包含UITextField的时候,我们很有可能想通过点击UITableView的其他地方来取消UITextField的焦点.也许有朋友会说,使用UITapGestureRecognizer手势来取消焦点,这样是可以行得通,但是如果TextField中有clearButton或者其自定义的Button的时候,手势就会吸收掉事件了,导致按