2013-10-30 119 views
0

我創建一個Java遊戲中,用戶可輸入的up的命令,leftright,或down到在該位置移動的字符進行了一定的像素。在Player課程中,我在用戶按下啓動按鈕後,在JTextFieldArrayList中接收到命令。然後我使用for循環遍歷用戶的所有輸入,並在多維陣列內創建xy目標,以便玩家需要移動的距離爲xy。最後我有一個叫做updatePosition()的函數,它在主遊戲循環中被調用。在這個函數中,我循環遍歷目標的多維數組,並使用if語句來檢查是否已達到目標。但是,如果執行該方法並且用戶輸入了例如upright的命令,則該角色向上斜向移動。我想要一種方式,將角色按用戶指定的方向移動,並逐個執行。Java遊戲 - 運行代碼順序在遊戲循環

下面是代碼:

moveSpeed = 1; 
private double moveAmt = 20; 
private Double[][] targetCoordinates = null; 
private ArrayList<JTextField> userInputTextFields = new ArrayList<JTextField>(); 

隨着方法下面我獲得的JTextFields內用戶已經輸入的命令的ArrayList,並將其存儲在本地ArrayList。我還安裝了一個Array,其大小爲用戶輸入命令的數量JTextFields。該數組將用於存儲角色的xy目標。然後,我最後調用moveChar();方法,該方法將設置目標xy

public void getInputText(ArrayList<JTextField> textFields){ 
    this.userInputTextFields = textFields; 
    targetCoordinates = new Double[userInputTextFields.size()][2]; 
    moveChar(); 
} 

此方法將檢查是否用戶已經enetered和targetCoordinates陣列內設置的xy目標的命令。

private void moveChar(){ 

     for (int i = 0; i < userInputTextFields.size(); i++) { 

      if(userInputTextFields.get(i).getText().equals("up")){ 
       targetCoordinates[i][0] = x; 
       targetCoordinates[i][1] = y - moveAmt; 

      } else if(userInputTextFields.get(i).getText().equals("down")){ 
       targetCoordinates[i][0] = x; 
       targetCoordinates[i][1] = y + moveAmt; 

      } else if(userInputTextFields.get(i).getText().equals("left")){ 
       targetCoordinates[i][0] = x - moveAmt; 
       targetCoordinates[i][1] = y; 


      } else if(userInputTextFields.get(i).getText().equals("right")){ 
       targetCoordinates[i][0] = x + moveAmt; 
       targetCoordinates[i][1] = y; 
      } 
     } 

}

最後,這是一個被遊戲主循環中調用的方法。它通過targetCoordinates陣列並檢查目標是否被滿足。如果不是,則相應地引起或減少角色的xy的位置。

公共無效updatePosition(){

if(targetCoordinates != null){ 

     for (int i = 0; i < targetCoordinates.length; i++) { 

      if(y >= targetCoordinates[i][1]) { 

        moveCharacter(x, y - moveSpeed); 

      } else if(y < targetCoordinates[i][1]) { 

       moveCharacter(x, y + moveSpeed); 

      } else if(x > targetCoordinates[i][0]) { 

       moveCharacter(x - moveSpeed, y); 

      } else if(x <= targetCoordinates[i][0]) { 

        moveCharacter(x + moveSpeed, y); 
      } 

     } 

    } 

} 
+1

和。 。 。問題是什麼? _「我想要一種能夠移動角色的方式......」並不能告訴我們你試過了什麼,或者你卡在哪裏。 –

+0

我想你想要一個能夠在特定遊戲循環之外生存下來的命令的「跳躍者」,並且只有在完成當前命令之後才能獲取新命令。新命令在頂部和底部被執行 –

+0

問題是:「我想要一種方式,將角色按照用戶指定的方向移動,並逐個執行。」 – Human

回答

0

目前使用所有可用的命令來創建一個單一的目標位置,並用它來指導你的運動(也可能是對所有的目標位置同時移動)。

取而代之,您需要一個能夠在特定遊戲循環之外生存下來的命令的「跳躍者」,並且只有當前命令完成後才能獲取新命令。新的命令在頂部和底部被執行。

這最有可能是這個樣子

public class Player { 
    //holding commands as strings is a little bug prone, consider creating a custom class or enum 
    ArrayList<String> commandsHopper=new ArrayList<String>(); 

    //replace with some sort of Vector2i as improvement 
    double[] targetCoOrdinates=new double[2]; 

    public void addCommand(String command){ 
     commandsHopper.add(command); //commands added at the top of arraylist 
    } 

    public void update(double timeSlice){ 
     //Called once, every game loop 

     if (isAtTarget()){ 
      getNextTarget(); 
     } 
     moveTowardsTarget(timeSlice); 

    } 

    public void getNextTarget(){ 
     if (commandsHopper.isEmpty()==false){ 
      //commands used from bottom of the arraylist 
      targetCoOrdinates=determineTargetFromCommand(commandsHopper.get(0)); 
      commandsHopper.remove(0); //inefficient with arraylist, consider other collections 
     } 
    } 

} 
+0

感謝您花時間閱讀問題並試圖理解。我將你的代碼改編爲我的代碼並且工作。 – Human

+0

@人類很高興聽到它! –