在我的游戏中,有不同大小的陨石雨。我试图制作它,以便如果你触摸一个更大的陨石,它将被移除(从一个阵列),一个较小的陨石物体将把它放在同一个地方,因为更大的陨石去除。
我遇到的问题是,如果你碰到一颗更大的陨石,它会被移除并经过所有其他陨石类型,直到它变成最小的陨石并完全消失......所有这些都在同一个触摸中。我显然不想要那个。不知道如何解决这个问题。
这是处理输入的代码:
private void handleInput() {
Iterator<FallingItem> iter = items.meteorites.iterator();
while (iter.hasNext()) {
FallingItem item = iter.next();
if (Gdx.input.justTouched()) {
gameCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
if (item.getClass() == SmallMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) {
meteoriteDestroyed.play(0.5f); //play sound
iter.remove(); //removes item from array when it's no longer needed
item.dispose(); //dispose meteorite texture to clear up memory
score += 20; //add to score
} else if (item.getClass() == MediumMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) {
meteoriteDestroyed.play(0.5f);
iter.remove();
item.dispose();
score += 10;
items.meteorites.add(new SmallMeteorite(item.getBounds().getX(), item.getBounds().getY()));
} else if (item.getClass() == LargeMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) {
meteoriteDestroyed.play(0.5f);
iter.remove();
item.dispose();
score += 10;
items.meteorites.add(new MediumMeteorite(item.getBounds().getX(), item.getBounds().getY()));
}
}
}
}
答案 0 :(得分:0)
您将这些项目添加到数组中,以便它们仍然可以进行迭代。相反,您需要以某种方式标记它们,以便在迭代后可以更改它们。有几种方法可以做到这一点。
一种方法是保留单独的列表。在执行此循环之前清除它,然后将需要用较小的项替换的项添加到单独的列表中。当循环在主列表上完成时,您可以迭代单独的列表以将较小的版本添加到主列表中。
但是LibGDX有一种更简单的方法。使用LibGDX的SnapshotArray类,而不是使用List来存储你的陨石。它允许您迭代列表的副本,因此您对阵列的更改不会生效,直到您完成迭代:
FallingItem[] array = snapshotArray.begin();
for (int i=0; i<snapshotArray.size; i++){ //important to use snapshotArray.size, not array.length
FallingItem item = array[i];
//...
//if (something) {snapshotArray.removeIndex(i, true); snapshotArray.add(new Something());}
}
array.end();
但是在你尝试之前,想想你是否真的需要为SmallMeteorite,MediumMeteorite等提供单独的类。确实存在过度封装这样的事情。如果这些对象的行为相同但只是具有不同的参数,则它们应该是一个类,其参数被修改为表示不同的大小。然后,您只需要更改其参数,而不是在数组中删除和替换它们。
旁注:您检查justTouched
并在循环内而不是在循环内执行unproject
是浪费的。那里有很多冗余的重复。