在使用Touch事件时遇到过很多问题,这里总结一下。
首先,IOS为我们提供了以下的方法来得到并传递用户的输入:
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}
(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}
(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {}
(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {}
触摸信息可以直接从touches参数中获取
NSMutableSet *mutableTouches = [touches mutableCopy];
也可使用event参数来获取
NSSet *allTouches = [event allTouches];
Cocos2d用CCTouchDispatcher类分发从IOS获取的触摸事件。它有两种分发方式一种是CCStandardTouchDelegate,一种是CCTargetedTouchDelegate。前者将所有的Touch信息直接传递给实现该协议的对象,而后者则要求实现该代理的类一次只能处理一个事件,并且吃掉该事件,不再传播。
所以CCTargetedTouchDelegate这个协议针对单点触控,而CCStandardTouchDelegate则可以处理当前屏幕触摸的每个触摸点,好像最多是十个吧。CCLayer默认情况下如果设定接受Touch事件,是使用标准协议。
我们可以看到,在注册协议的时候分别对应这样的方式:
-(void) addStandardDelegate:(id<CCStandardTouchDelegate>) delegate priority:(int)priority;
-(void) addTargetedDelegate:(id<CCTargetedTouchDelegate>) delegate priority:(int)priority swallowsTouches:(BOOL)swallowsTouches;
他们的区别在swallowsTouches参数,它表示是否吃掉该事件,而且只在目标协议里有意义。我们来分析各个协议的工作机理:
Standard这套协议,他会按照优先级给每个层排序。然后把touch按照顺序分别传进去,也就是说从上到下的所有层 只要开启了self.istouchenabled = YES 那么他们都会收到touch,而且不可以吃掉该事件。测试显示即使上面一层相应了该事件,它仍然会传递到下一层。
targeted这套协议只支持单点触控,即使是多点触控也当单点触控来用,但是返回的UITouch 就不知道是哪个了。他的好处是有swallow选项,即可判断是否继续传递 touch,而且,他的cctouchbegan函数是个bool值,如果你不返回一个yes的话,后面的 move 和 ended 都不会执行,如果要使用该协议,要在layer中手动设定代理:addStandardDelegate。因为CCLayer内部只注册标准代理。
我们的问题就来了,Standard协议无法吃掉事件,也许多个层都会相应的时候会出问题,而研究target协议实现的源码,也可以发现其实吃掉一个事件很简单,只要在Touch的集合中执行removeObject方法即可。
CCMenu继承了CCLayer,但是它注册的是targeted协议,所以我们很少发现CCMenu的混乱,因为它会将touch吃掉。
摘自:
http://blog.sina.com.cn/s/blog_7a2ffd5c0100v33y.html
分享到:
相关推荐
`cocos2d::Touch::EventTouches`类用于管理一组触摸事件,而`ccTouchesBegan`等方法的参数`Event *event`包含了这些事件的详细信息。 总结起来,Cocos2d-x的触摸事件机制使开发者能够轻松响应用户的触摸操作,结合...
Cocos2D-X是一款强大的跨平台2D游戏开发框架,被广泛应用于iOS、Android、Windows Phone等多平台的游戏开发。本学习笔记将深入探讨如何在Cocos2D-X中处理触屏事件,让游戏能够响应用户的触摸操作。 首先,我们要...
1. CCEventListenerTouchOneByOne:这是cocos2d-x中处理单个触摸事件的基础类。通过继承并重写其`onTouchBegan`、`onTouchMoved`和`onTouchEnded`等方法,我们可以实现基本的手势识别。 2. CCTargetedTouchDelegate...
总结,理解和掌握Cocos2D-X中的事件队列及触屏事件处理对于开发一款成功的移动平台游戏至关重要。通过合理地添加事件监听器、处理不同类型的触屏事件,以及优化事件处理优先级,可以构建出响应迅速、用户体验良好的...
总结来说,这个例子展示了如何在Cocos2d-x中自定义精灵类来处理触摸事件。通过继承`CCSprite`并实现触摸事件回调函数,我们可以让精灵根据触摸状态执行不同的动作。同时,通过创建场景并设置触摸监听,我们确保了...
在cocos2d-x游戏开发中,触摸事件(touch event)是用户与设备屏幕交互的主要方式,对于构建具有触控功能的游戏或应用至关重要。本学习笔记将深入探讨cocos2d-x中的触摸事件处理机制,以及如何在项目中有效地利用...
首先,我们要了解Cocos2d-x中的事件分发系统。在3.0版本之后,事件处理不再直接在节点上进行,而是通过事件监听器(EventListener)和事件分发器(EventDispatcher)来完成。事件分发器负责接收和分发事件到相应的...
例如,当用户触摸屏幕时,我们可以监听Touch事件,触发忍者发射飞镖的动作。这涉及到EventDispatcher的事件监听和处理,以及Action对象的创建和执行,如MoveTo、RotateTo等,来模拟飞镖的飞行轨迹和旋转效果。 ...
在本文中,我们将深入探讨如何在Cocos2d-x中结合Box2d物理引擎实现一个功能,即在用户点击屏幕时随机生成不同类型的刚体,并让它们自然地掉落至地面。这个过程涉及到Cocos2d-x游戏开发的基础,Box2d物理引擎的应用,...
在游戏开发领域,cocos2d-js是一款广泛使用的2D游戏引擎,它允许开发者使用JavaScript进行游戏编程。本文将深入探讨如何在cocos2d-js中实现单击和双击事件,这对于创建交互式游戏或者界面是至关重要的。 首先,我们...
这篇学习笔记将探讨如何在Cocos2d-x 2.2.3版本中处理单击、双击以及三连击事件,这对于创建交互式游戏或者用户界面至关重要。Cocos2d-x是一个流行的跨平台2D游戏引擎,支持多种操作系统,如iOS、Android和Windows等...
总结来说,利用Cocos2d-x 3.2开发大富翁游戏的股市功能涉及到了游戏逻辑设计、用户界面构建、事件处理、数据存储等多个方面。通过以上步骤,我们可以构建一个动态且有趣的股市系统,为玩家提供更丰富多样的游戏体验...
本文将深入探讨如何在Cocos2d-x的TiledMap中实现拖拽功能,以及相关的点击事件处理,以帮助你更好地理解和应用这一技术。 一、TiledMap简介 TiledMap是Cocos2d-x中的一个类,它基于开源的Tiled地图编辑器,允许...
在本文中,我们将深入探讨如何使用Cocos2d-x v2.2.1框架来创建一个涉及多点手势的动画Demo。Cocos2d-x是一个跨平台的2D游戏开发框架,广泛应用于移动设备和桌面平台,支持多种操作系统,如iOS、Android、Windows等。...
在实现这一机制时,开发者可能会采用Cocos2d中的路径(Path)和节点(Node)概念,为敌人设定行走路线,同时通过事件监听来触发防御塔攻击逻辑。 游戏的资源管理是另一个关键方面。在Cocos2d中,图像、音频和数据...
在Cocos Creator中,按钮(Button)是交互设计的重要元素,它可以响应用户的点击行为,触发相应的事件处理。本文将深入探讨三种为按钮添加事件的高级技巧,帮助开发者提升游戏或应用的用户体验。 ### 1. 使用`...
Cocos2d-iPhone提供了触摸监听器(Touch Delegate),使得我们可以监听用户在屏幕上的点击,并据此执行相应的操作,如角色移动或触发事件。 在“魔塔20层”的第八部分,我们可能会遇到如何优化性能的问题。因为游戏...
在游戏开发领域,Creater 3.8.X 是一款基于 Cocos2d-x 的跨平台游戏开发工具,广泛应用于2D游戏的制作。然而,默认情况下,该版本在电脑触摸屏端并不支持触控事件(touch events),而是默认使用鼠标事件来进行交互...
总结起来,这个文档详细阐述了如何在Cocos2d-JS中使用Cocos Studio资源来创建和管理关卡选择界面,包括控件的命名、加载、查找、事件监听和处理。理解并掌握这些步骤和技巧,开发者能够更加自如地构建游戏的UI交互,...