为什么cocos2d-x3.x版本的碰撞监听不起作用?因为没有设置掩码
2015-03-23 15:03
453 查看
好吧,其实这篇也是临时冒出来的,最近朋友要做个物理游戏,以前做物理还是用box2d,呃,确实要花些功夫才能搞懂其中的精髓,但是听讲这套引擎重新封装了一次,要容易很多,所以就简单尝试了一下,感觉确实要简单不少,不过在这其中还是遇到了些问题,首先就来说说onContactBegin这个回调函数响应问题。
先说说情况,简单做了一个打砖块的游戏,前面一切都很顺利,只是做到碰撞检测的时候,发现回调函数弄死都不调用。开始我以为函数写错了,后来查了api,testCpp都没有错,在3.0的api中,没有关于PhysicsBody,PhysicsWorld这些类的说明,所以大家想查移步到3.2的api中吧。
onContactBegin函数的参数就一个,
bool onContactBegin(PhysicsContact& contact),这和3.0beta版本又有些不同,以前是2个,所以在添加事件监听的时候,不要写错,like this,
?
回调函数是在当两个物体有接触的时候就会响应一次,里面的参数从名字中也能看出来,Contact接触,自然会涉及到两个物体。
好了,下面该到重点了,为啥这个onContactBegin函数不响应呢?问题出在三个掩码值上,这里推荐一下看下这篇博文。
或者打开引擎的源代码,可以在CCPhysicsShape这个头文件里看下这段代码,
?
?
?
说白了,两个物体间,能不能碰撞,能不能发送接触事件信息,关键就看这个三个参数值。
总结来说:
一个body的CategoryBitmask和另一个body的ContactTestBitmask的逻辑与的结果不等于0时,接触事件将被发出,否则不发送。
一个body的CategoryBitmask和另一个body的CollisionBitmask的逻辑与结果不等于0时,会碰撞,否则不碰撞。
这三个参数都有自己的默认值,采用16位表示,
CategoryBitmask, 默认值为 0xFFFFFFFF
ContactTestBitmask, 默认值为 0x00000000
CollisionBitmask, 默认值为 0xFFFFFFFF
大家可以简单的算一下,如果对这个计算不了解,可以查查看哈,或者掏出你电脑上的计算器也可以哇。
按照前面的总结来说,如果我们创建的body都采用默认值的话,那么
CategoryBitmask & ContactTestBitmask = 0
CategoryBitmask & CollisionBitmask = -1
这样看来,情况就清楚了,如果采用默认的数值,碰撞是可以检测的,但是碰撞事件是不会发出的,so我们的onContactBegin就被屏蔽了,那么当然不会做事情。
所以如果想我们的两个物体即发生碰撞又可以检测到,那么很简单,不让它们&的值不等于0就ok了,所以可以将两个需要碰撞的物体的这个三个掩码值都设置成1,
?
?
这样它们之间怎么按位与的结果都是1,就可以有相应了。
?
前面说了接触是肯定有两个物体的,所以打砖块的逻辑在这里就是判断下,其中一个的tag,如果是我们的砖块,说明碰到了,那么我们移除就ok了。
先说说情况,简单做了一个打砖块的游戏,前面一切都很顺利,只是做到碰撞检测的时候,发现回调函数弄死都不调用。开始我以为函数写错了,后来查了api,testCpp都没有错,在3.0的api中,没有关于PhysicsBody,PhysicsWorld这些类的说明,所以大家想查移步到3.2的api中吧。
onContactBegin函数的参数就一个,
bool onContactBegin(PhysicsContact& contact),这和3.0beta版本又有些不同,以前是2个,所以在添加事件监听的时候,不要写错,like this,
?
好了,下面该到重点了,为啥这个onContactBegin函数不响应呢?问题出在三个掩码值上,这里推荐一下看下这篇博文。
或者打开引擎的源代码,可以在CCPhysicsShape这个头文件里看下这段代码,
?
总结来说:
一个body的CategoryBitmask和另一个body的ContactTestBitmask的逻辑与的结果不等于0时,接触事件将被发出,否则不发送。
一个body的CategoryBitmask和另一个body的CollisionBitmask的逻辑与结果不等于0时,会碰撞,否则不碰撞。
这三个参数都有自己的默认值,采用16位表示,
CategoryBitmask, 默认值为 0xFFFFFFFF
ContactTestBitmask, 默认值为 0x00000000
CollisionBitmask, 默认值为 0xFFFFFFFF
大家可以简单的算一下,如果对这个计算不了解,可以查查看哈,或者掏出你电脑上的计算器也可以哇。
按照前面的总结来说,如果我们创建的body都采用默认值的话,那么
CategoryBitmask & ContactTestBitmask = 0
CategoryBitmask & CollisionBitmask = -1
这样看来,情况就清楚了,如果采用默认的数值,碰撞是可以检测的,但是碰撞事件是不会发出的,so我们的onContactBegin就被屏蔽了,那么当然不会做事情。
所以如果想我们的两个物体即发生碰撞又可以检测到,那么很简单,不让它们&的值不等于0就ok了,所以可以将两个需要碰撞的物体的这个三个掩码值都设置成1,
?
?
相关文章推荐
- Quick-cocos2d-x3.3 Study (十六)--------- 碰撞检测,事件监听,设置掩码
- 关于cocos2d中物理引擎碰撞掩码的设置
- Android configuration使用 为什么监听事件onConfigurationChanged没有反应
- Cocos2d-x 3.0final 终结者系列教程01-无论是从cocos2d-x2.x升级到版本cocos2d-x3.x
- playframework设置dist版本的监听端口
- 为什么在css中设置了font-family:" 微软雅黑"没有用
- Android 里ListView设置监听没有反应
- Cocos2d-x 设置竖屏的方法 2.0以上版本
- ListView对象设置点击监听没有响应
- html编写的过程中,为什么font设置属性的时候,第二个属性不起作用
- matplotlib1.1以上版本没有pyplot模块,为什么?
- express 4.14.1版本 npm版本3.10.10版本下 没有layout.js文件的解决方法 页面布局设置的方法
- cocos2d-x 3.0以上版本字体设置问题
- “如果此程序没有正确安装,请选用与此版本兼容的设置重新安装”C#程序的解决办法
- UITableViewCell通过cell.backgroundColor设置背景颜色为什么没有效果
- Cocos2d-x 设置竖屏的方法 2.0以上版本
- sessionState为什么设置TimeOut没有用?
- linux下安装gcc及设置多版本gcc多版本共存(如果enable静态库,会报错,不知道为什么,忽略静态库就没问题了)
- cookie 为什么设置了过期时间 不起作用 浏览器关闭 cookie 就没了
- [寒江孤叶丶的Cocos2d-x之旅_19]Cocos2d-x 3.0 rc2 版本 Label 的setOpacity 函数失效,无法设置透明度问题的解决办法