Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I remove a body in Box2dWeb after a collision

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.

like image 582
Boundless Avatar asked Jan 13 '13 22:01

Boundless


1 Answers

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;
}
like image 167
forsvunnet Avatar answered Nov 17 '22 23:11

forsvunnet