2013-04-29 91 views
2

我目前正試圖保存特殊的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,並刪除之後。目前21(20Monsters和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()不正常運行的。

回答

1

在迭代容器時從容器中刪除對象總是充滿了問題和複雜性,我認爲你遇到了Stage的參與者列表中的一些問題。 Stage代碼嘗試使用SnapshotArray來隱藏這些問題中的一部分,但我不清楚它會與您編寫的代碼一起使用。爲了避免這種

一種方式是遍歷getActors()一次並通過怪物陣列演員複製到monsters陣列,然後循環和從舞臺中刪除參與者(或調用figureStage.getRoot().clearChildren())。這應該防止你迭代你正在修改的列表。

另外,看看如何Group.clearChildren() is implemented(它使用兒童數組中的顯式整數索引,而不是對數組的迭代器,並避免了一些問題)。

+0

是的,這是正確的答案。我通過保存我的角色並使用清除方法解決了這個問題。爲了避免mapchange上的空指針,我將行爲方法重寫爲空,並調用舞臺常規動作的前面的myAct。所以如果他觸發mapchange怪物不會採取行動,並不會陷入這些問題。 – BennX 2013-04-30 07:05:16