2013-01-13 10 views
5

Wewnątrz funkcji Aktualizacja, jeśli 2 obiekty zderzają się, chcę je usunąć (lub oznaczyć je jako wymagające usunięcia i usunąć je po zakończeniu etapu czasowego) . Jak to osiągnąć?Jak usunąć zwłokę z Box2dWeb po kolizji

W funkcji aktualizacji staram

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

Jednakże, nie zostaną usunięte. Wydaje się, że gdy próbuję je usunąć, this.IsLocked() jest ustawione na true.

Odpowiedz

9

Świat nie usunie ciał, jeśli funkcja world.IsLocked() zwróci true. Funkcja world.IsLocked() zwróci wartość true, gdy świat stanie się krokiem. Usunięcie ciała podczas kroku może spowodować problemy, więc prawidłowym sposobem niszczenia ciał po kolizjach jest zarejestrowanie ich w zmiennej, a następnie ich zniszczenie po zakończeniu kroku.

//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

Można zamiast tego zrobić: 'while (destroy_list.length) world.DestroyBody (destroy_list.pop());' –

+0

To dobra alternatywa. Wolę nie używać pętli, aby zminimalizować szansę na nieskończone pętle. – forsvunnet