2013-01-13 4 views
5

All'interno della funzione di aggiornamento, se 2 corpi si scontrano voglio rimuoverli (o contrassegnarli come devono essere rimossi, e rimuoverli alla fine della fase temporale) . Come potrei realizzare questo?Come rimuovere un corpo in Box2dWeb dopo una collisione

Nella funzione di aggiornamento cerco

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

Tuttavia, essi non vengono eliminate. Sembra che quando sto cercando di cancellarli, this.IsLocked() è impostato su true.

risposta

9

Il mondo non rimuoverà i corpi se la funzione world.IsLocked() restituisce true. E world.IsLocked() restituirà true mentre il mondo è in una fase. Rimuovere un corpo durante una fase può causare problemi, quindi il modo corretto di distruggere i corpi dopo le collisioni è registrarli in una variabile e quindi distruggerli una volta completato il passaggio.

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

Si potrebbe invece fare: 'while (destroy_list.length) world.DestroyBody (destroy_list.pop());' –

+0

Questa è una buona alternativa. Preferisco non usare i loop per minimizzare la possibilità di loop infiniti. – forsvunnet

Problemi correlati