2

我目前正在尝试保存特殊Actors文件,以便在加载旧地图时再次将它们放在地图上。因此,我想将它们放入 aHashMap<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在删除之前和之后记录了它。删除后是当前的 21(20 个怪物和 1 个字符)size是 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()确实工作正确。

4

1 回答 1

1

在迭代该容器时从容器中删除对象总是充满问题和复杂性,我认为您在Stage's 的演员列表中遇到了其中一些问题。该Stage代码试图用来SnapshotArray隐藏其中一些问题,但我不清楚它是否可以与您编写的代码一起使用。

避免这种情况的一种方法是循环getActors()一次并将演员复制到monsters数组中,然后循环通过怪物数组并从舞台中删除演员(或调用figureStage.getRoot().clearChildren())。这应该可以防止您遍历正在修改的列表。

或者,看看是如何Group.clearChildren()实现的(它在子数组中使用显式整数索引,而不是数组上的迭代器,并避免一些问题)。

于 2013-04-30T05:07:48.703 回答