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

来源:互联网 发布:横版2d游戏源码unity 编辑:程序博客网 时间:2024/05/10 08:05

废话不多说,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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机刷机失败开不了机怎么办 华为刷机失败开不了机怎么办 银行卡信息被盗密码被改该怎么办 全民k歌手机话筒有杂音怎么办 手机刷机清除数据需要密码怎么办 oppo手机屏锁密码忘了怎么办 华为手机摔了一下开不了机怎么办 华为v9手机删除隐私空间了怎么办 华为荣耀畅玩5x卡顿怎么办 淘宝买家收到货后恶意退款怎么办 手机淘宝申请退款后不想退了怎么办 买房交首付时的收据发票掉了怎么办 苹果商城消费提示问题忘记了怎么办 psd文件超过2g不能存储怎么办 手机拍的照片做微信头像太大怎么办 上传的照片在等待中传不上去怎么办 淘宝购物车里的图片模糊怎么办 天猫超市一箱饮料少两瓶怎么办 网上卖一件代发顾客要退货怎么办 京东买东西卖家拒绝发货怎么办 淘宝不小心退款给买家了怎么办 不小心智能清理了淘宝物流怎么办 移动卡绑定了太多东西换联通怎么办 淘宝上卖出的东西快递弄丢了怎么办 京东第三方不确认收货怎么办? 天猫评价被判定为广告怎么办 天猫一个订单用卷分单退货怎么办 天猫对已付款成功后自动退款怎么办 拼多多新人红包减价卖家怎么办 魔力宝贝手机版注册人数已满怎么办 买家投诉虚假签收淘宝卖家该怎么办 手机淘宝商家老打骚扰电话怎么办 手机上查询详单忘记服务密码怎么办 淘宝上的东西买过就找不到了怎么办 刚刚开的淘宝企业店没有流量怎么办 有图片怎么在淘宝找不到商品怎么办 白色高跟鞋鞋面磨脏了怎么办弄干净 我跟鞋后跟磨烂的脚怎么办? 内衣买回来有一股刺鼻的味道怎么办 裁剪袖子开口偏了1公分怎么办 对于这乱扔垃圾不听劝者该怎么办