java — библиотека Box2D — почему столкновение не работает должным образом, когда динамическое тело застревает между статическим телом и другим динамическим телом?

Например, динамическое тело находится в углу и бесконечно идет к стене (это должно быть статичное тело) в этом углу. Если другое тело идет в том же направлении и сталкивается с первым, столкновение будет полностью проигнорировано. Это единственная ситуация, когда это происходит.

Под вот фото:
введите описание изображения здесь

На следующем шаге мира зеленый прямоугольник перекрывает красный шар. Если не было статического тела, столкновение работает нормально.

Заранее спасибо.

0

Решение

Это специфично для 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);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]