2015-01-11 21 views
0

我正在開發一個遊戲項目。到目前爲止這麼好,但我只是堅持基本的東西,我找不到解決方案,並使其正常工作。我決定來這裏問你一些建議。ListIterator中只有一個對象實例會移動

問題: 首先,我有2個關卡,每個關卡都有一個機器人。後來我注意到,只有第一級的機器人更新了它的行爲。如果我只加載下一個級別,機器人更新方法不會被調用,我知道爲什麼。 我將ListIterator打印到控制檯中,機器人在那裏。但是當我遍歷主更新方法中的列表時,它似乎沒有調用其中的對象更新方法。我仍然可以和玩家一起移動,並從地圖上取得鑽石,這些鑽石也都是列表中的一部分,因此這些方法都會被調用。我可以爲你提供一些較小的代碼塊,如果你需要得到關於某些特定事情的信息,如果我有它們,只需將它留在評論中即可。這裏有一些主要的區塊,我認爲這些區塊並不適合。 如果只有第一級別的機器人移動,我再製造4個機器人。只有第一個機器人移動。同一班級的所有其他項目什麼也不做。

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   
      }   
    } 
} 
  • 更新方法在機器人類別:

    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: 好吧,只有在文件第一行的機器人才會移動。

    LEVEL 1 P-球員 B-機器人 d-鑽石 1 - 牆壁

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

    任何想法,爲什麼只有第一線機器人移動?其他線對象正常工作。

    回答

    0

    迭代器只能工作一次。您似乎在初始化迭代器一次,然後期望它每次調用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); 
    

    在使用上述三種方法之一處理列表之後。

    +0

    1.初始化是一個空數組列表,因爲我直接在列表中添加items和objects.add()。如果我只初始化了listiterator,它會拋出一個錯誤異常。 2.我之前使用過,但是通過增強的循環,我不能從列表中刪除項目。舉個例子,當我拿鑽石時,它應該從世界消失。 (渲染畫出列表中的所有對象。)3.我沒有嘗試過,但是當我做不好時,讓我們知道如何解決問題。 – parohy

    +0

    到1.我嘗試添加項目到arraylist和初始化對象= supp.iterator(),但重新初始化更改列表(不應該刪除的項目)引發異常。 – parohy

    +0

    我會在刪除項目時添加註釋:一般來說,在處理完整個列表後最好刪除「已用」項目。 – sprinter

    相關問題