cocos2d-x触摸相关

   // 触摸相关

通常继承CCLayer后必须重写以下 触摸相关

    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);

稍微讲解下这几个函数的作用

ccTouchesBegan接受的是你点击屏幕的那一下的信息

ccTouchesMoved接受的是手指在屏幕上滑动/停留的信息

ccTouchesEnded 接受手指离开屏幕的那下下~

ccTouchesCancelled很罕见的情况才会用到这厮,例如,突然来电话啦~没电啦..不过话说通常的游戏也不会在那时候进行处理。

还要注意的一个问题,上面几个函数都是有单数形式的,即Touch后面没有es复数词缀,支持的是单点触摸,但由于单点触摸在CCLayer中需要自己去注册.

 

 

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, 则是根据注册的优先级来确定派发先后顺序。如果优先级也一样,则按照注册的顺序派发事件。

三. cocos2d-x实现原理

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

 

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

当用户调用addStandardDelegate时,CCTouchDispatcher会用用户传入的CCTouchDelegate指针创建一个CCStandardTouchHandler对象并且插入StandardTouchHandler列表中。addTargetedDelegate的实现和addStandardDelegate类似。

 

 

 

 

 

 

posted @ 2013-08-03 14:41  闲人轩  阅读(275)  评论(0编辑  收藏  举报