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

时间:2015-01-11 21:18:20

标签: java list arraylist listiterator

我正在开发一个游戏项目。到目前为止这么好,但我只是坚持ome基本的东西,我无法找到解决方案,并使其正常工作。我决定来这里问你一些建议。

问题: 首先,我有两个级别,每个级别都有一个机器人。后来我注意到,只有第一级的机器人更新了它的行为。如果我只加载下一个级别,则不会调用机器人更新方法,我知道为什么。 我将ListIterator打印到控制台,机器人就在那里。但是当我通过主更新方法中的列表进行迭代时,它似乎并没有调用其中的对象更新方法。我仍然可以与玩家一起移动并从地图中获取钻石,这两个钻石也是列表的一部分,因此这些方法被称为。我可以为你提供一些较小的代码块,如果你需要获得一些具体的信息,如果我有它们,只需将它留在评论中。这里有一些主要的块,在我看来并不合适。 如果只有第一级的机器人移动,我又制作了4个机器人。只有Bot的第一个实例移动。同一类的所有其他项目什么都不做。

0.Declaration:

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

1.主要更新方法:

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. Bot类中的更新方法:

    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();
    

    }

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

    等级1 P-球员 B-机器人 d-钻石 1-壁

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

    任何想法为什么只有一线机器人移动?其他线对象可以正常工作。

1 个答案:

答案 0 :(得分:0)

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

三个选项:

  1. (错误)在update:

    中重新初始化迭代器

    objects = supp.iterator();

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

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

  3. (最佳)使用流:

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

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

    shouldBeRemoved

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

相关问题