例如,一个动态物体位于一个角中,并且无限地朝那个角中的墙(需要是一个静态物体)行走。如果另一个物体朝相同的方向行走并与第一个物体碰撞,则碰撞将被完全忽略。这是唯一发生这种情况的情况。
在下面的照片:
在下一个世界台阶上,绿色矩形与红色球重叠。如果没有静态物体,则碰撞可以正常进行。
提前致谢。
最佳答案
它特定于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/