2013-10-30 91 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

@人类很高兴听到它! –