您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x Touch事件处理机制

2014-03-09 13:55 405 查看
cocos2d-x 提供了一种简单而又灵活的触摸事件派发机制,由于它实现得太灵活,导致一个新手在处理一些复杂的场景时可能会比较难掌握。


一.
如何使用

cocos2d-x提供了两种触摸事件处理机制, 分别是CCStandardTouchDelegate 和 CCTargetedTouchDelegate。

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

virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) 处理用户按下事件

virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) 处理Touch Move 事件

virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) 处理用户放开事件

virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) 处理Touch被打断事件,如来电话了。

在用户注册了一个CCStandardTouchDelegate之后, 所有的触摸事件都会回调到用户自己定义的CCStandardTouchDelegate。

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

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) 处理用户按下事件,若用户需要继续处理该按下对应的后续事件,则return true, 否则,return false.

virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) 处理Touch Move 事件

virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) 处理用户放开事件

virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) 处理Touch被打断事件.

CCTargetedTouchDelegate 和 CCStandardTouchDelegate 有很大的区别。

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

第二,用户必须实现ccTouchBegan 函数,且如果某个用户按下消息需要继续跟踪,则ccTouchBegin返回true, 否则,ccTouchMove等接口不会被调用到。

第三,用户在注册TargetTouchDelegate的时候可以设置bSwallowsTouches标识,若某个TargetTouchDelegate将该标识设为true,且需要处理某个Touch事件(ccTouchBegan返回true),则调到该Delegate之后cocos2d-x不会将Touch消息发送给其他的TargetTouchDelegate和StandardTouchDelegate。

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


二.
Touch 事件派发的顺序

cocos2d-x 首先派发事件给CCTargetedTouchDelegate, 再派发事件给CCStandardTouchDelegate。对于相同类型的TouchDelegate, 则是根据注册的优先级来确定派发先后顺序, 优先级高的(Priority值小的)先调用。如果优先级也一样,则按照注册的顺序派发事件,先注册的后调用。


三.
cocos2d-x实现原理

cocos2d-x 内部处理Touch事件类图如下所示:



如上图所示,CCTouchDispatcher是管理cocos2d-x中所有Touch事件派发的类,CCTouchDispatcher中包含了两个CCTouchHandler的列表,分别存储StandardTouchHandler和 TargetedTouchHandler。同时,CCTouchDispatcher实现了EGLTouchDelegate去接收窗口的触摸消息,当其接收到窗口触摸消息时,调用touches接口将触摸事件传递给TouchDelegate。

当用户调用addStandardDelegate时,CCTouchDispatcher会用用户传入的CCTouchDelegate指针创建一个CCStandardTouchHandler对象并且插入StandardTouchHandler列表中。addTargetedDelegate的实现和addStandardDelegate类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: