if ((catA & maskB) != 0 && (catB & maskA) != 0)

它位于Box2d's manual: 6.2中,用于检查两个对象是否应该发生碰撞(过滤后)

最佳答案

catA是对象A的碰撞类别的位字段
maskA是对象A可能与之碰撞的类别的位字段。

例如:

catA  = 100010000010010 // Object A is in 4 collision categories
maskA = 001010000000000 // Object A can collide with too different categories

catB  = 000010001000001 // Object B is in 3 collision categories
maskB = 100000000000000 // Object B can only collide with the category represented by the highest bit

catA和maskB表示catA和maskB中的位均为1,因此为1000000000000000。它不是0,因为对象B可能与最高位的对象发生冲突,并且对象A设置了该位。

catB&maskA表示catB和maskA中的位均为1,因此为0000100000000000。它也不为零,因为对象A可以与第5个最高位类别中的对象发生冲突,而对象B属于该类别。

因此这两个对象可能会发生碰撞。

08-16 12:26