言简意赅,物体的类别掩码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
这样“与”运算为了,两者不会发生碰撞。