&运算(关于box2d的碰撞过滤)

&表示两种运算符,其中一种表示取值运算符,一种是按位与
取值运算符
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,
从而根据游戏逻辑需求动态地改变刚体的碰撞规则。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值