GdxRuntimeException:#iterator()不能用于嵌套

时间:2016-07-24 12:52:29

标签: java libgdx iteration

我正在制作一款World的游戏。在此World中有许多Units

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

  1. 遍历每个Unit,以便他们可以根据经过的时间更新其属性。
  2. 查找每个Unit的潜在目标。
  3. 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()也遍历每个单元,导致嵌套迭代。但是,我不确定我应该如何继续进行“窝”&#34;这个,因为我只看到了一个问题22:每个单位实际上必须迭代其他每个单位,看看他们是否在他们的视线范围内。

    对此一些新鲜的眼睛将不胜感激。

1 个答案:

答案 0 :(得分:4)

可能有一些方法可以重构您的设计以避免嵌套。但最简单的解决方案可能是将旧学校用于外部和内部,或仅仅内部。不要使用迭代器,因为这里不允许嵌套循环。 getActors返回一个libGDX数组,所以只需通过索引

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