2013-01-13 8 views
5

2つのボディが衝突した場合は、それらのボディを削除する(または削除する必要があるとマークし、タイムステップの最後に削除する) 。どうすればこれを達成できますか?私は衝突後にBox2dWebのボディを削除するには

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

を試しUpdate関数で

しかし、彼らは削除されません。削除しようとすると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());良い選択肢だ' –

+0

。無限ループの可能性を最小限に抑えるためにwhileループを使用しない方がよいです。 – forsvunnet

関連する問題