0

這是一個我一直想解決的問題,雖然我永遠無法找到解決的辦法。我想我可能會錯過一些東西,但我似乎無法找到什麼。Box2D閃存,銷燬機構

我試圖從b2World中銷燬機構,我在各種教程中看到,當它們在調試時使用box2d銷燬對象時,形狀也會被破壞。出於某種原因,當我這樣做時:

world.DestroyBody(_body)它似乎沒有做任何事情。形狀保持在屏幕上。

有沒有人有過這個問題?這讓我擔心,因爲在玩遊戲一段時間後,我想破壞的所有物體仍然保留在屏幕上,並且仍然記錄着真正落後於遊戲的碰撞。

任何幫助將不勝感激,

謝謝
威爾

編輯:【解析】謝謝你們,也非常有意義。

+0

什麼時候你想要刪除一個對象?如果您嘗試在衝突處理程序回調中刪除對象,那麼這可能是您的問題。 Mattias有正確的想法,將對象推入列表中,然後在b2World對象的更新方法之外處理它們。 – 2012-04-16 15:53:23

回答

6

我在一些項目中自己有過這個問題。我想這是在您嘗試刪除Box2D引擎「正在使用」的物體時發生的。我已經通過將我想銷燬的物體添加到列表中,然後在下一個渲染之前銷燬它們來解決它。

// add body to list if it should be removed 
if(shouldRemoveBody) 
{ 
    _removeList.push(bodyToRemove); 
} 

// start next render with a check 
if(_removeList.length > 0) 
{ 
    // remove all bodies in list 
} 
3

要添加到Mattias所說的,我通過將對象推送到ToBeRemoved列表來做同樣的事情。

和我對場景中的每個圖形精靈的演員類,這裏是一些代碼:

public class Actor 
{ 
    protected var m_body:b2Body; 
    protected var m_sprite:DisplayObject; 

    public function Actor(body:b2Body, sprite:DisplayObject) 
    { 
     this.m_body = body; 
     this.m_sprite = sprite; 
    } 

    public function destroy():void 
    { 
     // remove sprite 
     m_sprite.parent.removeChild(m_sprite); 

     // remove physical body 
     GlobalVars.world.DestroyBody(m_body); 
    } 
} 

,每當我想摧毀一個對象,我只是叫演員的銷燬方法。

請注意,這個類的字段是受保護的,所以我們可以通過子actor來擴展它。

這樣,它工作順利。