cocos2dx 触摸相关记录

自定义layer实现触摸

简单2句话:

  setTouchEnabled(true);//启用触摸
  CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); //添加触摸



触摸优先级

优先级值越小,越优先响应

同样优先级,后添加的先响应


多点与单点

多点触摸:addStandardDelegate,对应touches系列函数

单点触摸:addTargetedDelegate,对应touch系列函数,另外,began必须重写


触摸分发

原理:

mSwallowsTouches = false,该层的touch事件若接受处理后,touch事件穿透,进入下个注册touch事件的layer进行处理
mSwallowsTouches =true,当该层处理touch事件的时候,若ccTouchBegan返回true时候,则touch事件被该层接收走,其他优先级较低的,就不会接收到touch事件的处理申请了。

关于ccTouchBegan的返回值

true:
本层的后续Touch事件(move.cancel等)可以被触发,并 阻挡向后层传递
false:
本层的后续Touch事件 不能被触发,并向后传递

具体应用:

1.如何阻塞事件的向后传递?

主要是利用了TargetedTouchDelegate 的一个叫SwallowTouch的参数 ,如果这个开关打开的话,比他优先级低的handler 是收不到触摸响应的,优先级参考之前的部分。

CCMenu 优先级为-128,可以说是内部定义的最高优先级,所以如果自定义需要更高的优先级的话,可以比这个值再小。

mSwallowsTouches = true 并且 ccTouchBegan 返回 true


2.如何让Layer所有触摸同时穿透Begin、Move、End事件?
mSwallowsTouches = false 并且 ccTouchBegan 返回 true

最有用的总结

ccTouchBegan 返回 true 表示同层处理后续事件(吞噬)
ccTouchBegan 返回 false 表示同层不处理后续事件(Move End Cancled)  (击穿)

mSwallowsTouches 设为 true 表示触摸不向下层传递(不一定 如mSwallowsTouches为true began返回false还是会向后传递)
mSwallowsTouches 设为 false 表示触摸向下层传递(不知有啥用)

this->mTouchPriporty 越小,越先接收到触摸
this->mTouchPriporty 同等,越后addChild的越先响应


参考:

http://www.cnblogs.com/sevenyuan/archive/2013/06/25/3154624.html


你可能感兴趣的:(cocos2dx 触摸相关记录)