Box2D库 - 当动态物体卡在静态物体和另一个动态物体之间时,为什么碰撞不能正常工作?

时间:2016-02-29 10:13:42

标签: java c++ libgdx box2d

例如,一个动态的身体在一个角落里,无限地走向那个角落的墙壁(需要是一个静止的身体)。如果另一个身体向同一方向行走,并与第一个身体发生碰撞,则碰撞将被完全忽略。这是发生这种情况的唯一情况。

在这下照片: enter image description here

在下一个世界步骤中,绿色矩形与红色球重叠。如果没有静态物体,则碰撞工作正常。

提前致谢。

1 个答案:

答案 0 :(得分:2)

具体是Box2D。如果一个动态物体垂直向另一个动态物体移动并且在它们的路径上有一个静态物体,那么动态物体无论如何都会相互重叠。 为了解决这个问题,您可以使用接触式侦听器来捕捉物体碰撞的瞬间,并根据红体的位置直接设置绿体的位置。这样的事情:

public class CoreClass extends Game {


Array<Body> bodies = new Array<Body>();
World world = new World(new Vector2(0.0f, 0.0f), true);

Body bodyRed;
Body bodyGreen;
private float prevX;
private float prevY;

@Override
public void create() {
    BodyDef bodyBD = new BodyDef();
    bodyBD.type = BodyType.DynamicBody;

    FixtureDef bodyFD = new FixtureDef();
    bodyFD.density = 1.0f;
    bodyFD.friction = 1.0f;
    bodyFD.restitution = 1.0f;

    bodyRed = world.createBody(bodyBD);
    bodyGreen = world.createBody(bodyBD);

    bodyRed.createFixture(bodyFD);
    bodyGreen.createFixture(bodyFD);

    prevX = bodyGreen.getPosition().x; prevY = bodyGreen.getPosition().y;

    world.setContactListener(new ContactListener() {

        @Override
        public void beginContact(Contact contact) {
            world.getBodies(bodies);
            bodies.get(contact.getChildIndexA()).getPosition().set(prevX, prevY);
        }

        @Override
        public void endContact(Contact contact) {

        }

        @Override
        public void preSolve(Contact contact, Manifold oldManifold) {

        }

        @Override
        public void postSolve(Contact contact, ContactImpulse impulse) {

        }

    });
}

@Override
public void render() {
    super.render();
    prevX = bodyGreen.getPosition().x;
    prevY = bodyGreen.getPosition().y;
    world.step(1/45f, 2, 6);
}