ListIterator 中只有一个对象实例移动

Only one instance of object from ListIterator moves

我正在做一个游戏项目。到目前为止一切顺利,但我只是停留在一些基本的事情上,我找不到解决方案并使其正常工作。我决定来这里问问大家的建议。

问题: 首先,我有 2 个级别,每个级别都有一个机器人。后来我注意到,只有第一层的机器人会更新它的行为。如果我只加载下一个级别,则不会调用机器人更新方法,我也不知道为什么。 我将 ListIterator 打印到控制台,机器人就在那里。但是当我在主更新方法中遍历列表时,它似乎没有调用其中的对象更新方法。我仍然可以与玩家一起移动并从地图中获取钻石,它们也是列表的一部分,因此调用了这些方法。如果您需要获取有关某些特定事物的一些信息(如果我有或没有),我可以为您提供一些较小的代码块,只需将其留在评论中即可。以下是我认为无法正常工作的一些主要模块。 如果只有第一层中的机器人移动,我又为它制作了 4 个机器人。只有 Bot 的第一个实例移动。相同的所有其他项目 class 什么都不做。

0.Declaration:

private ArrayList<AbstractObject> supp = new ArrayList<AbstractObject>();
private ListIterator<AbstractObject> objects=supp.listIterator();

1.Main更新方法:

public void update() {
    resetList(); //sets the cursor at begining
    if(menu.getChoice()==-1){
        menu.update();
    }
    else if(menu.getChoice()==2)
        System.exit(0);
    else if(menu.getChoice()==0){
        if(currentLevel>lvlm.getLevel() || currentLevel<lvlm.getLevel()){
            clearList(); //remove all items in the list
            init(lvlm.getLevelPath());
            currentLevel=lvlm.getLevel(); 

        }       
        while(objects.hasNext()){
                objects.next().update();      //calls all updates from each object in the list          
            }         
    }
}
  1. 机器人中的更新方法Class:

    public void update() {         
    movingCount++;
    switch(getFacing()){
        case 2:
            moved=true;
            setFacing(2);
            setVectorX(-0.5);
            break;
        case 3:
            moved=true;
            setFacing(3);
            setVectorX(0.5);
            break;
        case 0:
        case 1:
            setVectorX(0);
            moved=false;
    }
    if(movingCount>=200){
        setFacing(randInt(0,3));
        movingCount=0;
    }
    moveOnX(); //updates pos
    moveOnY(); //updates pos
    getAnimationL().runAnimation();
    getAnimationR().runAnimation();
    

    }

EDIT_1: 好的,所以机器人只在文件的第一行移动。

级别 1 P播放器 B机器人 D-钻石 1 面墙

1111111    B   B
1P  D 1
11111 1
1F    1  B
1111111

B   B   B

知道为什么只有一线机器人会移动吗?其他线对象正常工作。

迭代器只工作一次。您似乎正在初始化迭代器一次,然后期望它在每次调用 update 时都能正常工作。

三个选项:

  1. (不好)在更新中重新初始化迭代器:

    objects = supp.iterator();

  2. (更好)不要使用迭代器;使用 for 循环:

    for (AbstractObject obj: supp) { obj.update(); }

  3. (最佳)使用流:

    supp.stream().forEach(AbstractObject::update);

如果更新可能会删除某个项目,那么您最好的选择是在处理完列表后将其删除。例如,在 AbstractObject 中创建一个名为 shouldBeRemoved 的布尔方法。然后您可以使用以下内容:

supp.removeIf(AbstractObject::shouldBeRemoved);

使用上述三种方法之一处理列表后。