【问题标题】:GdxRuntimeException: #iterator() cannot be used nestedGdxRuntimeException:#iterator() 不能嵌套使用
【发布时间】:2016-07-24 12:52:28
【问题描述】:

我正在开发这款拥有World 的游戏。在这个World里面有很多Units

问题源于World 服务于(除其他外)两个主要任务:

  1. 遍历每个Unit,以便它们可以根据经过的时间更新其属性等等。
  2. 找到每个Unit 的潜在目标。

World 中,会发生这种情况:

for (Actor a : stage.getActors())
{
    a.draw(batch, 1);
    a.act(10);
    findTargets((Unit)a);
}

findTargets() 是这样定义的:

public ArrayList<Unit> findTargets(Unit source) {
    double sight = source.SIGHT;
    ArrayList<Unit> targets = new ArrayList<Unit>();
    for (Actor a : stage.getActors()) {
        Unit target = (Unit)a;
        if (!(target instanceof Unit))
            continue;

        if (target.equals(source)) continue;
        if (((Unit)target).getPos().dst(source.getPos()) < sight) {
            targets.add((Unit)target);
        }
    }
    return targets;
}

问题很明显:findTargets() 还会迭代每个单元,从而导致嵌套迭代。但是,我不确定我应该如何继续“取消嵌套”这个,因为我只看到了一个问题 22:每个单元实际上都必须迭代所有其他单元以查看它们是否在它们的范围内视线范围。

我们将不胜感激。

【问题讨论】:

  • 只需使用传统的 for 循环而不是迭代器。

标签: java libgdx iteration


【解决方案1】:

可能有一些方法可以重构您的设计以避免嵌套。但最简单的解决方案可能是只对外部和内部使用老式的 for 循环,或者只使用内部循环。不要使用迭代器,因为这在嵌套循环中是不允许的。 getActors 返回一个 libGDX 数组,所以只需按索引遍历它

for (int i=0; i < stage.getActors().size; i++) {
  //...etc --> use stage.getActors().items[i] ...

【讨论】:

  • 是的,这就是我决定尝试的方法,然后在我尝试后不到 30 秒,我看到了您的解决方案。工作就像一个魅力,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多