问题
Inside of the Update function, if 2 bodies collide I want to remove them (or mark them as needing to be removed, and remove them at the end of the time step). How would I accomplish this?
In the Update function I try
var bodyA = this.m_fixtureA.m_body;
...
bodyA.m_world.DestroyBody(bodyA);
However, they don't get deleted. It seems that when I am trying to delete them, this.IsLocked() is set to true.
回答1:
The world will not remove bodies if the world.IsLocked() function returns true. And world.IsLocked() will return true while the world is in a step. Removing a body during a step could cause issues, so the correct way of destroying bodies after collisions is to register them in a variable and then destroy them after the step is completed.
//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;
}
来源:https://stackoverflow.com/questions/14308991/how-do-i-remove-a-body-in-box2dweb-after-a-collision