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 (20 モンスターと 1 キャラクター)sizeは 11 です。これも追加しましthis.screen.figureStage.getRoot().removeActor(a);たが、これは何も変更しません。

そのためのアイデアはありますか?

.remove()[編集] 私は回避策を書いたので、私のアイデアは機能していますが、常に in を削除するとは限らないため、機能するはずの一般的なアイデアは不可能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コンテナーを反復処理しながらコンテナーからオブジェクトを削除すると、常に問題と複雑さが伴います。アクターのリストでこれらの問題のいくつかに遭遇していると思います。Stageコードはこれらの問題のいくつかを隠そうとしますがSnapshotArray、あなたが書いたコードで動作するかどうかはわかりません。

これを回避する 1 つの方法は、getActors()一度ループしてアクターを配列にコピーしmonsters、次に Monsters 配列をループしてステージからアクターを削除する (または を呼び出すfigureStage.getRoot().clearChildren()) ことです。これにより、変更中のリストを反復処理できなくなります。

または、 がどのようGroup.clearChildren()に実装されているかを確認してください(配列に対するイテレータではなく、子の配列で明示的な整数インデックスを使用し、いくつかの問題を回避します)。

于 2013-04-30T05:07:48.703 に答える