if ((catA & maskB) != 0 && (catB & maskA) != 0)
它位于Box2d's manual: 6.2,用于检查两个对象是否应该碰撞(过滤后)
答案 0 :(得分:2)
它检查catA与maskB至少有一个共同的'1'位,而catB至少有一个带maskA的公共'1'位。
例如,如果catA为3(二进制00000011)且maskB为10101010),则(catA& maskB)!= 0为真,因为catA& maskB是00000010。
这称为掩蔽,这意味着只保留感兴趣的位。
你经常有这种结构:
#define READ 1
#define WRITE 2
#define READWRITE (READ|WRITE)
#define DIRECTORY 4
int i=getFileInfo("myfile");
if(i & READWRITE)puts("you can read or write in myfile");
if(i & DIRECTORY)puts("myfile is a directory");
BTW,“i& DIRECTORY”的意思与“(i& DIRECTORY)!= 0”相同
答案 1 :(得分:0)
符号&
是按位AND运算符。因此,声明
(catA & maskB) != 0
检查这两个项目中是否有任何位重叠。它首先检查A是否先针对B检查A,然后针对A检查B.
答案 2 :(得分:0)
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可以与第五高位类别中的对象发生碰撞,而对象B属于该类别。
因此两个物体可能会发生碰撞。
答案 3 :(得分:0)
我知道很多C / C ++程序员喜欢简洁,但我发现通过将此测试移动到一个函数中可以使这种类型的代码更具可读性(如果需要,可以内联它)。他们也可以通过将代码移动到一个命名良好的方法来摆脱评论。
if (FixturesCanCollide() )
{
}
你实际上可以将比较丢弃到!= 0(尽管为了清晰起见你可能更喜欢它,无论哪种方式,它都可能编译成相同的代码。
inline bool FixturesCanCollide()
{
return (catA & maskB) && (catB & maskA);
}