Touch事件处理机制
x引擎中提供了两种不同的触摸事件处理机制,分别是
CCStandardTouchDelegate和
CCTargetedTouchDelegate。通常处理
Touch事件的对象都是
CCLayer类型或者其子类型的层节点,
CCStandardTouchDelegate是层节点默认注册使用的
Touch事件处理机制,在使用
CCStandardTouchDelegate时所有的触摸事件都会以一个集合的形式提供给
Touch事件的回调函数,回调函数需要处理的是多个点的触摸信息。
CCStandardTouchdelegate包含以下四个回调函数:
virtual void ccTouchesMoved(CCSet *pTouches,CCEvent *pEvent):处理触摸点移动事件。
virtual void ccTouchesCancelled(CCSet *pTouches,CCEvent *pEvent):处理
Touch被打断事件,如来电话了。
如果想使用这种
CCLayer提供的默认
Touch事件处理方式,还要在
CCLayer初始化时设置一个开关:调用
setIsTouchEnable(true/false),
true表示开启
Touch事件,
false表示关闭事件处理功能。
CCTargetedTouchDelegate包含以下四个回调函数:
virtual void ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent):处理触摸点移动事件。
virtual void ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent):处理
Touch被打断。
注:在使用
CCTargetedTouchDelegate的
Touch事件处理过程时需要注意以下几点:
(1)
CCTargetedTouchDelegate回调里的参数接收的不是
Touch事件的集合,而是单个的
Touch事件,x引擎在工作的每一帧里都会将多点触摸点拆散成单个的
Touch事件再进行回调。注意,这里已经清楚的说明了,将多个点的处理过程变为在同一帧内的多次单击处理过程。
(2)用户必须实现
ccTouchBegan函数,且如果某个用户按下消息需要继续跟踪,则
ccTouchBegan需要返回
true,如果返回
false则表示不再跟踪此点的
Touch事件,此触摸点上的
ccTouchMove等接口不会被调用。
(3)用户在注册
TargetTouchDelegate的时候可以设置
bSwallowsTouches标识,若某个
TargetTouchDelegate将该标识设为
true,且需要处理某个
Touch事件,则调用到该
Delegate之后Cocos2d-x引擎不会将
Touch消息发送给其他的
TargetTouchDelegate和
StandardTouchDelegate。
x引擎首先派发事件给
CCTargetedDelegate,再派发给
CCStandardTouchDelegate。对于相同类型的
TouchDelegate,则是根据注册的优先级来确定派发先后顺序,数值越小代表优先级越高。如果优先级一样,则按照注册的顺序派发事件,后注册的
TouchDelegate具有优先权。
例子:参考
TestCpp的
ClickAndMove
如果编译时报错:
error C2061: 语法错误: 标识符“CCTouch”
解决办法:加入
cocos2d命名空间USING_NS_CC;