2013-01-13 38 views
5

在更新功能中,如果兩個物體發生碰撞,我想刪除它們(或將它們標記爲需要刪除,並在時間步驟結束時將其刪除) 。我怎麼做到這一點?如何在碰撞後刪除Box2dWeb中的物體

在更新功能,我嘗試

var bodyA = this.m_fixtureA.m_body; 
... 
bodyA.m_world.DestroyBody(bodyA); 

然而,他們沒有被刪除。看來,當我試圖刪除它們時,this.IsLocked()被設置爲true。

回答

9

如果world.IsLocked()函數返回true,那麼世界將不會移除主體。 world.IsLocked()將在世界步入正軌時返回true。 在一個步驟中移除物體可能會導致問題,因此在碰撞後正確銷燬物體的方法是將它們註冊到變量中,然後在完成步驟後將其銷燬。

//Pseudo code: 
var destroy_list = []; 

// Your contact listener 
var listener = function() { 
    // Push the body you wish to destroy into an array 
destroy_list.push(body); 
} 

// The game interval function 
var update = function() { 
    // Destroy all bodies in destroy_list 
    for (var i in destroy_list) { 
    world.DestroyBody(destroy_list[i]); 
    } 
    // Reset the array 
    destroy_list.length = 0; 
} 
+0

你可以做,而不是:'而(destroy_list.length)world.DestroyBody(destroy_list.pop());' – 2016-09-28 22:11:22

+0

這是一個很好的選擇。我寧願不使用while循環來儘量減少無限循環的機會。 – forsvunnet