2016-02-29 37 views
0

例如,一個動態的身體在一個角落裏,無限地走向那個角落裏的牆壁(需要是一個靜態的身體)。如果另一個身體朝着相同的方向行走,並與第一個身體發生碰撞,那麼碰撞將被完全忽略。這是發生這種情況的唯一情況。Box2D庫 - 當動態物體卡在靜態物體和另一個動態物體之間時,爲什麼碰撞不能正常工作?

在這裏的照片: enter image description here

到第二天worldstep,綠色矩形重疊的紅球。如果沒有靜態物體,碰撞工作正常。

在此先感謝。

+0

會很好,如果你分享一些代碼。因爲現在很難以某種方式幫助你。 – Enigo

+0

我添加了情況的照片^^ –

回答

2

它是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); 
}