0
例如,一個動態的身體在一個角落裏,無限地走向那個角落裏的牆壁(需要是一個靜態的身體)。如果另一個身體朝着相同的方向行走,並與第一個身體發生碰撞,那麼碰撞將被完全忽略。這是發生這種情況的唯一情況。Box2D庫 - 當動態物體卡在靜態物體和另一個動態物體之間時,爲什麼碰撞不能正常工作?
到第二天worldstep,綠色矩形重疊的紅球。如果沒有靜態物體,碰撞工作正常。
在此先感謝。
例如,一個動態的身體在一個角落裏,無限地走向那個角落裏的牆壁(需要是一個靜態的身體)。如果另一個身體朝着相同的方向行走,並與第一個身體發生碰撞,那麼碰撞將被完全忽略。這是發生這種情況的唯一情況。Box2D庫 - 當動態物體卡在靜態物體和另一個動態物體之間時,爲什麼碰撞不能正常工作?
到第二天worldstep,綠色矩形重疊的紅球。如果沒有靜態物體,碰撞工作正常。
在此先感謝。
它是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);
}
會很好,如果你分享一些代碼。因爲現在很難以某種方式幫助你。 – Enigo
我添加了情況的照片^^ –