欢迎光临散文网 会员登陆 & 注册

Egret-Box2d (二) 碰撞

2020-11-02 13:44 作者:抑制住a  | 我要投稿

当物体在物理场景中发生碰撞时,会发生一些事情,比如主角碰到怪物死了,所以我们需要获取到碰撞时的一些信息。

首先创建一个碰撞的监听器,并把它添加到世界上。

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,为正发生碰撞,为负不发生碰撞。





Egret-Box2d (二) 碰撞的评论 (共 条)

分享到微博请遵守国家法律