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

简介: 废话不多说,cocos2d 自带有两套协议 分别是CCTargetedTouchDelegate 和 CCStandardTouchDelegate 这两个都是处理touch inside 但是针对点不同, CCTargeted...这个协议针对单点触控,用户直接操作UITouch 而Standard 传入的是一个NSSet  里面是 当前屏幕触摸的每个触摸点的UITouch ,恩

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

目录
相关文章
|
1月前
|
编解码 测试技术 iOS开发
iPhone 屏幕尺寸和开发适配
【10月更文挑战第23天】iPhone 的屏幕尺寸变化给开发者带来了一定的挑战,但也为创新提供了机遇。通过深入了解不同屏幕尺寸的特点,遵循适配原则和策略,运用合适的技巧和方法,我们能够为用户提供在不同 iPhone 机型上都具有良好体验的应用。在未来,随着技术的不断进步,我们还需要持续学习和适应,以满足用户对优质应用体验的不断追求。
|
1月前
|
编解码 iOS开发 UED
响应式设计在 iPhone 开发适配中的具体应用
【10月更文挑战第23天】响应式设计在 iPhone 开发适配中扮演着至关重要的角色,它能够帮助我们打造出适应不同屏幕尺寸和用户需求的高质量应用。通过合理运用响应式设计的原则和方法,我们可以在提供良好用户体验的同时,提高开发效率和应用的可维护性。
|
4月前
|
数据采集 iOS开发 Python
Chatgpt教你开发iPhone风格计算器,Python代码实现
Chatgpt教你开发iPhone风格计算器,Python代码实现
|
Shell iOS开发
iOS逆向:tweak开发教程(iPhone/tool)
iOS逆向:tweak开发教程(iPhone/tool)
1262 0
iOS逆向:tweak开发教程(iPhone/tool)
|
编解码 iOS开发
iphone 开发的基本入门知识
iphone 开发的基本入门知识
237 0
「镁客早报」iPhone或将在今年采用三摄;传Facebook致力于开发语音助力服务与亚马逊、苹果竞争
亚马逊向美国Alexa设备推免费音乐服务;视频会议软件开发商Zoom纳斯达克上市。
269 0
|
Web App开发 缓存 开发工具