删除Actors不会删除所有Actors

时间:2013-04-29 15:43:42

标签: java android libgdx

我目前正在尝试保存特殊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()确实有效。

1 个答案:

答案 0 :(得分:1)

在迭代容器时从容器中删除对象总是充满问题和复杂性,我认为你在Stage的actor列表中遇到了一些问题。 Stage代码尝试使用SnapshotArray隐藏其中一些问题,但我不清楚它是否适用于您编写的代码。

避免这种情况的一种方法是循环getActors()一次并将actor复制到monsters数组中,然后遍历monsters数组并从舞台中删除actor(或调用{{ 1}})。这可以防止您迭代正在修改的列表。

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