5

在 Update 函数内部,如果 2 个物体发生碰撞,我想移除它们(或将它们标记为需要移除,并在时间步结束时移除它们)。我将如何做到这一点?

在更新功能中我尝试

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

但是,它们不会被删除。似乎当我试图删除它们时,this.IsLocked() 设置为 true。

4

1 回答 1

9

如果 world.IsLocked() 函数返回 true,世界将不会移除物体。而 world.IsLocked() 将在世界处于一个步骤时返回 true。在步骤中移除物体可能会导致问题,因此在碰撞后销毁物体的正确方法是将它们注册到变量中,然后在步骤完成后销毁它们。

//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;
}
于 2013-01-21T22:41:16.473 回答