cocos2d-x Touch事件处理机制

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类似。

你可能感兴趣的:(cocos2d-x Touch事件处理机制)