例如,一个动态物体位于一个角中,并且无限地朝那个角中的墙(需要是一个静态物体)行走。如果另一个物体朝相同的方向行走并与第一个物体碰撞,则碰撞将被完全忽略。这是唯一发生这种情况的情况。

在下面的照片:
java - Box2D库-当动态物体卡在静态物体和另一个动态物体之间时,为什么碰撞无法正常进行?-LMLPHP

在下一个世界台阶上,绿色矩形与红色球重叠。如果没有静态物体,则碰撞可以正常进行。

提前致谢。

最佳答案

它特定于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);
}

关于java - Box2D库-当动态物体卡在静态物体和另一个动态物体之间时,为什么碰撞无法正常进行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35696896/

10-10 04:43