gpt4 book ai didi

java - 移除 Actors 不会删除所有 Actors

转载 作者:行者123 更新时间:2023-11-30 11:33:00 26 4
gpt4 key购买 nike

我目前正在尝试保存特殊 Actors所以如果加载旧 map ,我可以再次将它们放在 map 上。因此我想将它们放入 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()确实工作正常。

最佳答案

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

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

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

关于java - 移除 Actors 不会删除所有 Actors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16282785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com