Например, динамическое тело находится в углу и бесконечно идет к стене (это должно быть статичное тело) в этом углу. Если другое тело идет в том же направлении и сталкивается с первым, столкновение будет полностью проигнорировано. Это единственная ситуация, когда это происходит.
На следующем шаге мира зеленый прямоугольник перекрывает красный шар. Если не было статического тела, столкновение работает нормально.
Заранее спасибо.
Это специфично для 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);
}
Других решений пока нет …