如何在Box2dWeb中在碰撞后移除物体

5

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

我尝试在Update函数中:

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

然而,它们并没有被删除。似乎当我试图删除它们时,this.IsLocked() 被设置为 true。
1个回答

9
世界不会移除物体,如果世界.IsLocked()函数返回true。而当世界处于一个步骤中时,世界.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;
}

你可以这样做:while( destroy_list.length ) world.DestroyBody(destroy_list.pop()); - user5051092
这是一个不错的选择。我更喜欢不使用 while 循环,以尽量减少无限循环的可能性。 - forsvunnet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接