5

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.

Boundless
  • 2,444
  • 2
  • 25
  • 40

1 Answers1

9

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;
}
forsvunnet
  • 1,238
  • 10
  • 17
  • You could instead do: `while( destroy_list.length ) world.DestroyBody(destroy_list.pop());` –  Sep 28 '16 at 22:11
  • That's a good alternative. I prefer to not use while loops in order to minimise the chance of infinite loops. – forsvunnet Oct 03 '16 at 22:17