iphone开发笔记——Cocos2d CCLayer中的touch

废话不多说,cocos2d 自带有两套协议 分别是CCTargetedTouchDelegate 和 CCStandardTouchDelegate

这两个都是处理touch inside 但是针对点不同, CCTargeted...这个协议针对单点触控,用户直接操作UITouch

而Standard 传入的是一个NSSet  里面是 当前屏幕触摸的每个触摸点的UITouch ,恩最多是十个吧。。

 

那么 target的好处在哪里,standard 完全可以 解决掉所有情况才对吖。

其实不是这样的,先说一下cocos2d 的touch inside 传输机制

 

如果一个东西 想用 touch 协议,那么 除了 在头文件中写上 我使用这个协议 以外,还要引入另外一个东西

CCTouchDispatcher

这个东西是 touch 的管理器

对应两个协议 分别有两个函数

-(void) addStandardDelegate:(id<CCStandardTouchDelegate>) delegate priority:(int)priority;

-(void) addTargetedDelegate:(id<CCTargetedTouchDelegate>) delegate priority:(int)priority swallowsTouches:(BOOL)swallowsTouches;

也就是说某个CCNode 想要使用touch协议 就要在CCTouchDispatcher share类中注册一下,恩这时候 区别就显而易见了

Standard 和 targeted 最主要的区别 就是后面那个swallowsTouches

先不管最后的那个参数是什么 说一下前面两个。 很简单第一个是注册的指针  一般是self 另一个 是优先级 越小越好。。例如CCMenu优先级为-128

这时就能说传输机制了。。。当有touch inside的时候,层与层的传递顺序是这样的 优先级为第一关键字 层的高度为第二关键字排序

注意,这里只能是单独的一个协议的情况当两个共存的时候 稍后再说


现在可以说 这两套协议的区别了。

Standard这套协议,不能过滤掉touch inside 也就说,他会按照优先级给每个层排序。。然后把touch inside 按照顺序 分别传进去,也就是说 从上到下的所有层 只要开启了self.istouchenabled = YES 那么他们都会收到 touch inside  而且目前没发现如何过滤掉,当然了他的优点是 支持多点触控

targeted这套协议呢

这套协议 从接口上 就可以看出 它只支持单点触控,而且就测试来看  多点触控 是当单点触控来用,但是返回的UITouch 就不知道是哪个了

他的好处是 有了那个swallow 选项,即可判断是否 下放 touch 参数

而且呢,他的cctouchbegan函数是个bool值,如果你不返回一个yes的话,后面的 move 和 ended 都不会执行,不用每个函数都蛋疼的判断了,使用的时候 不要用isTouchEnabled这个属性,因为这个属性调用的是addStandardDelegate的那个函数,要么重载,要么手动实现,推荐手动实现。


好了 最后说一下 当混合使用这两套协议 所出现的奇葩问题。。。

demo 1

在hello world上 画了一个 CCMenuItemFont  (因为CCMenu 用的是targeted协议 权限为 -128) 然后给hello worldlayer 开启istouchenabled 

结果是没有收到 label 收到 touch 信息 layer 没收到

demo2 

在原基础上 重载layer的注册函数将 layer的权限改为-200

结果 效果 依旧如demo 1

demo3

关掉istouchenabled 用target协议 权限给-200 其他不变 swallow = yes

结果label 响应不到 touch操作 全被layer 截获

推论1:单指操作时,权限先传递到target  再传递给 standard 无论 standard 权限多高 都不能打断

demo 4

开启多点触控支持

将label换成一张大号的图片

然后在那张图上做双指点击

奇葩的事情发生了。。

根据NSLog返回的情况来看

是layer先 NSlog 然后 image也会NSLog。。。

推论2: 多点触控时 standard 先会有反应。。。然后target 一样会收到。。。。

demo5

两个层 全都开启 is touch enabled

屏蔽掉CCMenu

然后做双指点击

会按照前面说的那个 顺序 先优先级 后高度 NSLog出来。。。

写的有点混乱。。。。

只是笔记罢了。。自己看得懂就好了。。。

http://hi.baidu.com/306996305/blog/item/8be3d4ce1997e422b600c80d.html

上一篇:Java SSM整合mybatis配置文件


下一篇:NSPredicate匹配中文正