2014-04-09 37 views
2

我需要在JBox2D android遊戲中摧毀人體碰撞後的其中一個。我發現JBox2D世界在身體接觸時變得鎖定。我想在碰撞後摧毀一個身體。世界釋放鎖後,我可以接到任何回電嗎?我發現了一個選擇,將身體添加到數組中以銷燬它。但是什麼時候摧毀身體?我在這個遊戲中沒有使用andengine/libgdx。在下面找到我的碰撞監聽器類,摧毀身體碰撞JBox2D android

private class CollisionListener implements ContactListener { 

    @Override 
    public void beginContact(Contact contact) { 
     Object fixtureA = contact.getFixtureA().getUserData(); 
     Object fixtureB = contact.getFixtureB().getUserData(); 
     Body mBodyA = contact.getFixtureA().getBody(); 
     Body mBodyB = contact.getFixtureB().getBody(); 
     if (fixtureA instanceof Bullet) { 
      destroyBalloonBody(mBodyB); 
     } 
     if (fixtureB instanceof Bullet) { 
      destroyBalloonBody(mBodyA); 
     } 

    } 

    @Override 
    public void endContact(Contact contact) { 

    } 

    @Override 
    public void postSolve(Contact contact, ContactImpulse contactImpulse) { 

    } 

    @Override 
    public void preSolve(Contact contact, Manifold manifold) { 

    } 
} 

public void destroyBalloonBody(Body balloon){ 

//Can i start a new thread which is having a loop until the world become release for destroying the body 
//Or 
//Do i need to add the body to a deletionArrayList to destroy it. 

} 

回答

2

我相信問題是您正試圖在碰撞回調期間移除物體。

從Box2D的手冊:

我們很容易實現該改變物理世界 接觸回調中的遊戲邏輯。例如,你可能會碰到一個衝擊,造成傷害,並試圖摧毀關聯的演員及其剛性 正文。但是,Box2D不允許您在回調中更改物理世界 ,因爲您可能會銷燬當前正在處理的Box2D爲 的對象,從而導致成爲孤立的指針。

也就是說,你不應該摧毀碰撞回調中的物體。

在更新週期結束後,您應該使用World引用存儲您希望銷燬的對象的引用並銷燬它們。

這是你所需要的?