&表示两种运算符,其中一种表示取值运算符,一种是按位与 取值运算符 int a=1; int *p=&a; //其中&a表示的就是把a中的地址取出来,然后赋给指针变量,也就是说&a表示的是变量a在内存中的地址。你可以使用printf函数输出这个地址 按位与运算符 比如a&b;表示把a和b进行二进制的按位与运算 比如8&10,其中8的二进制是0000 1000,而10的二进制是0000 1010,因此 0000 1000(十进制8) & 0000 1010(10进制10) 结果为0000 1000(就是10进制的8) 因此8&10的结果为8 与的计算规则是,如果两个数都都为真(或为1),其结果为真,如果两位数中有一位为假(或为0)者结果为假 1.categoryBits和maskBits组合判断 categoryBits代表该刚体所属的种族,它的值要设置成2的N次方,这是因为其16位二进制数只能有一位是1,其余都是0。 maskBits代表该刚体被允许碰撞的刚体种群(即另一个刚体的categoryBits) 根据这两个属性,引擎给出了一个碰撞筛选规则:uint16 catA = fixtureA.filter.categoryBits; uint16 maskA = fixtureA.filter.maskBits; uint16 catB = fixtureB.filter.categoryBits; uint16 maskB = fixtureB.filter.maskBits; if ((catA & maskB) != 0 && (catB & maskA) != 0) { // fixtures can collide }那么,如何设置刚体的maskBits的值使其允许和一个以上的刚体发生碰撞呢?那就是使用按位或操作:|,
这样该刚体的maskBits和要碰撞的刚体的categoryBits做&操作后,就都不会为0了,
满足了碰撞筛选规则。如下代码所示,cat_b2代表的刚体,被允许和和cat_ground刚体以及cat_b1刚体都发生碰撞:fixturedef.filter.categoryBits = cat_b2; fixturedef.filter.maskBits = cat_ground | cat_b1;
2.group分组判断
这个比较简单,但要使其生效,那么两个刚体的groupIndex属性值必须一致且不为0。接下来再判断其值的正负,
正一定相撞,负一定不相撞。且一旦满足了group分组判断策略,categoryBits和maskBits组合判断策略就无效了。也就是说该判断策略的优先级要高。
如下代码所示,fixture1和fixture2是一定相撞的(相等、不为0,正),而fixture3和fixture4是一定不相撞的(相等,不为0,负):fixture1Def.filter.groupIndex = 1; fixture2Def.filter.groupIndex = 1; fixture3Def.filter.groupIndex = -1; fixture4Def.filter.groupIndex = -1;
除了通过初始化filter的各种属性来指定碰撞规则,还可以通过b2Fixture::SetFilterData函数随时改变刚体框架的filter,
从而根据游戏逻辑需求动态地改变刚体的碰撞规则。
&运算(关于box2d的碰撞过滤)
最新推荐文章于 2019-11-12 20:59:58 发布