我目前正在尝试保存特殊Actors
,以便在旧地图加载后我可以再次将它们放在地图上。因此,我想将它们放入HashMap<String, ArrayList<Monster>> monsterAtMap
并从Stages
移除它们。所以我想这样做:
private void saveMonsters() {
if (this.screen.figureStage.getActors().size == 0)
return;
ArrayList<Monster> monsters = new ArrayList<Monster>();
for (Actor a : this.screen.figureStage.getActors()) {
a.remove();
}
Gdx.app.log("Figurstage size", ""+ this.screen.figureStage.getActors().size);
this.monsterAtMap.put(this.currentMap.name, monsters);
}
作为开始。但我注意到它并没有全部删除。它确实删除了10个全部。我会记录它的size
和删除后。在删除size
之后,它是当前的21(20个字符和1个字符)是11.我还添加了此this.screen.figureStage.getRoot().removeActor(a);
但这不会改变任何内容。
有什么想法吗?
[编辑]我写了一个解决方法,所以我的想法是有效的,但是应该工作的一般想法是不可能的,因为.remove()
并不总是删除Actor
?解决方法看起来像这样:
private void saveMonsters() {
this.chara = this.screen.character;
if (this.screen.figureStage.getActors().size == 0)
return;
ArrayList<Monster> monsters = new ArrayList<Monster>();
for (Actor a : this.screen.figureStage.getActors()) {
if (a.getClass() == Monster.class)
monsters.add((Monster) a);
}
this.screen.figureStage.clear();
this.screen.figureStage.addActor(chara);
this.monsterAtMap.put(this.currentMap.name, monsters);
}
.clear()
确实有效。
答案 0 :(得分:1)
在迭代容器时从容器中删除对象总是充满问题和复杂性,我认为你在Stage
的actor列表中遇到了一些问题。 Stage
代码尝试使用SnapshotArray
隐藏其中一些问题,但我不清楚它是否适用于您编写的代码。
避免这种情况的一种方法是循环getActors()
一次并将actor复制到monsters
数组中,然后遍历monsters数组并从舞台中删除actor(或调用{{ 1}})。这可以防止您迭代正在修改的列表。
或者,看看Group.clearChildren()
is implemented如何(它在子数组中使用显式整数索引,而不是在数组上使用迭代器,并避免一些问题)。