Box2dweb - 碰撞接触点

8

我使用的是box2dweb,正在开发一款游戏。在某个时刻,我需要找到“圆形”和“矩形”之间的接触点。我知道可以使用b2ContactListener来实现。我们可以通过实现b2ContactListener并使用Post-Solve事件来接收接触数据。请帮忙!


1
这可能会有所帮助:http://www.iforce2d.net/b2dtut/collision-anatomy - iforce2d
1个回答

16

你已走上正确的轨道,有各种事件可以与b2ContactListener挂钩:

var b2Listener = Box2D.Dynamics.b2ContactListener;

//Add listeners for contact
var listener = new b2Listener;

listener.BeginContact = function(contact) {
    //console.log(contact.GetFixtureA().GetBody().GetUserData());
}

listener.EndContact = function(contact) {
    // console.log(contact.GetFixtureA().GetBody().GetUserData());
}

listener.PostSolve = function(contact, impulse) {
    if (contact.GetFixtureA().GetBody().GetUserData() == 'ball' || contact.GetFixtureB().GetBody().GetUserData() == 'ball') {
        var impulse = impulse.normalImpulses[0];
        if (impulse < 0.2) return; //threshold ignore small impacts
        world.ball.impulse = impulse > 0.6 ? 0.5 : impulse;
        console.log(world.ball.impulse);
    }
}

listener.PreSolve = function(contact, oldManifold) {
    // PreSolve
}

this.world.SetContactListener(listener);

只需删除postSolve代码,并根据需要连接到适当的事件。

Seth Ladd在他的博客中有一些关于碰撞/对其做出反应的很棒的文章。这就是我学到这些东西的地方,完全归功于他。

希望这可以帮助你。

谢谢, Gary


我写了一篇关于它的博客。如果你想,可以去看看。http://thenightowl.xp3.biz/ - Shekhar
终于!JavaScript中的CollisionHandler解释 - Code Whisperer
非常抱歉,我对Box2D一窍不通,如果我添加自己的监听器,并且BeginContactEndContact函数为空,我的脚本会抛出错误并且没有任何渲染。我想要做的就是当物体接触地面时更改其线性阻尼,并在空中时将其恢复为正常值。 - powerbuoy
我的错 :P 没有意识到你需要添加所有4个方法。 - powerbuoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接