Egret-Box2d (二) 碰撞
当物体在物理场景中发生碰撞时,会发生一些事情,比如主角碰到怪物死了,所以我们需要获取到碰撞时的一些信息。
首先创建一个碰撞的监听器,并把它添加到世界上。
this.contact = new b2ContactListener();
this.world.SetContactListener(this.contact)
然后添加上碰撞回调,BeginContact就是刚开始接触的时候,EndContact是最后离开的时候。
this.contact.BeginContact = (contact: b2Contact<b2Shape, b2Shape>) => {
console.log('碰撞开始');
}
this.contact.EndContact=(contact: b2Contact<b2Shape, b2Shape>) => {
console.log('碰撞结束');
}

contact.GetFixtureA().GetBody().GetUserData();
contact.GetFixtureB().GetBody().GetUserData();

同时,夹具(Fixture)中含有过滤(Filter)属性,我们可以使用碰撞过滤来更好的控制碰撞,Filter中有categoryBits和maskBits两个属性,categoryBits的意思是“我是。。。”,maskBits的意思是“我能和。。。碰”。
此时我们把地板设置为2,他能和1碰,把掉落的物体设置为1,他能和2碰(这些数字必须是2的N次方倍)
//地板的
groundFixDef.filter.categoryBits =2;
groundFixDef.filter.maskBits = 1;
//掉落物体的
fixDef.filter.categoryBits = 1;
fixDef.filter.maskBits = 2;
然后他们就发生碰撞了,但如果其中一个不想碰,比如 fixDef.filter.maskBits修改为4,那么他们就无法发生碰撞



我们除了可以用categoryBits和maskBits进行过滤,还可以使用groupIndex,且一旦使用groupIndex,之前的categoryBits和maskBits就无效了,也就是说groupIndex的优先级要高于categoryBits和maskBits。
发生碰撞的条件:两个物体的groupIndex属性值必须相同且不为0,为正发生碰撞,为负不发生碰撞。