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

言简意赅,物体的类别掩码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,“与”运算后非零,所以触发了碰撞,直白地说就是笑脸没有穿过白云。

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

我的做法如下:

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

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

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

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

你可能感兴趣的:(cocos2dx,碰撞,物理引擎)