我最近问过这个问题:Box2D - Can't destroy multiple fixtures,但我发现这不是Box2D的问题,而是我的java问题。这是我的代码:
public static void removeSpecifiedBodies() {
for (Body body : bodiesToRemoveList) {
Array<Fixture> fixtures = body.getFixtureList();
for (Fixture fixture : fixtures) {
body.destroyFixture(fixture);
}
}
bodiesToRemoveList.clear();
}
我正在做的是循环遍历bodyToRemoveList中的所有实体。然后,每个身体都有多个固定装置,所以我得到它们并绕过它们,摧毁每一个。毕竟,我清除了bodiesToRemoveList。但是,在我的第二个for循环中,当我摧毁灯具时,只有一个被摧毁。我做了一些调试,发现for循环只运行一次。我不确定为什么会这样。谷歌搜索显示其他人有这个问题,我注意到他们都从列表中删除或清除了项目,就像我正在做的那样。我发现我的代码没有任何问题,但出于某种原因,我尝试不会修复它。有没有人看到我的代码有任何问题?谢谢你提前。
编辑:我是个白痴。感谢所有帮助过的人。这是我的代码,如果有人想看到它。public static void removeSpecifiedBodies() {
Iterator<Body> i = bodiesToRemoveList.iterator();
while (i.hasNext()) {
Body desBod = i.next();
//body.destroyFixture(fixture);
WorldController.b2world.destroyBody(desBod);
i.remove();
}
bodiesToRemoveList.clear();
}
答案 0 :(得分:2)
除非您直接使用Iterator(并与循环共享),否则不应修改正在迭代的列表。由于您无法访问for
循环正在使用的迭代器,因此您肯定会获得混合结果。
因此,要么直接使用迭代器,要么另一种方法是将要从列表中删除的所有项目累积到另一个集合中,然后从原始集合中累加removeAll
。当你在列表中迭代两次时,这有点贵,但它简单而干净,对于短列表,可能不是真正的问题。
否则:
List<Fixture> fixtures = body.getFixtureList();
Iterator<Fixture> i = fixtures.iterator();
while(i.hasNext()) {
Fixture fixture = i.next();
if (destroyFixture(fixture)) {
i.remove();
}
}