cocos2dx 3.x 物理引擎接触检测掩码、碰撞掩码和类别掩码问题解析

9 篇文章 1 订阅
8 篇文章 0 订阅

言简意赅,物体的类别掩码CategoryBitMask和物体的接触测试掩码ContactTestBitmask逻辑“与”运算结果非零,则触发EventListenerPhysicsContact事件监听器,物体的类别掩码CategoryBitMask和物体的 碰撞掩码CollisionBitmask逻辑“与”运算结果非零,则触发物体碰撞效果。

//类别掩码,默认值0xFFFFFFFF
body->setCategoryBitMask(int bitmask);

//接触检测掩码,默认值0x00000000
body->setContactTestBitmask(int bitmask);

//碰撞掩码,默认值0xFFFFFFFF
body->setCollisionBitmask(int bitmask);
  • 例,笑脸和白云一接触并发生碰撞(注意,接触和碰撞时有区别的,下例说明),笑脸颜色变绿,白云颜色也变绿。如下图:
    这里写图片描述
    在这个例子中要触发物理接触时间EventListenerPhysicsContact,如果用默认值,则笑脸的类别掩码是0xFFFFFFFF,白云的接触检测掩码是0x00000000,“与”运算后是0,同样,白云的类别掩码是0xFFFFFFFF,笑脸的接触检测掩码是0x00000000,“与”运算后也是0,不会触发事件监听器,所以要重新设置其中两方的接触测试掩码,只设置一方也不会触发事件监听器。设置如下:
bodySmile->setContactTestBitmask(0x00000001);
bodyCloud->setContactTestBitmask(0x00000001);

两者的类别掩码和碰撞掩码默认值都是0xFFFFFFFF,“与”运算后非零,所以触发了碰撞,直白地说就是笑脸没有穿过白云。

  • 例,笑脸和白云一接触但不发生碰撞,笑脸颜色变绿,白云颜色也变绿。如下图:
    这里写图片描述
    笑脸和白云的接触检测掩码同上,我们要修改的是碰撞掩码和类别掩码。
//这样改的话,物体body不会跟任何其他物体发生碰撞(但是有接触),
//包括我们给窗口设置的边界框,效果就是落出屏幕外
body->setCollisionBitmask(0x00000000);

我的做法如下:

    //笑脸类别掩码
    bodySmile->setCategoryBitmask(0x02);//0010,只写后4位

    //白云碰撞掩码
    bodyCloud->setCollisionBitmask(0x01);//0001

这样“与”运算为了,两者不会发生碰撞。

-最后要注意的是,碰撞时只要有一方的类别掩码和碰撞掩码与运算为零双方不会碰撞,但是要是触发接触时间需要双方彼此的类别掩码和接触测试掩码与运算非零才可以。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值