0

我正在创建一个 Java 游戏,用户可以在其中输入命令upleftrightdown将角色在该位置移动一定数量的像素。在Player课堂上,我在用户按下开始按钮后收到来自用户ArrayList的命令。JTextField然后,我使用for循环遍历用户的所有输入,并在多维数组中创建x和定位玩家需要移动的距离和距离。最后我有一个在主游戏循环中调用的函数。在这个函数中,我循环遍历目标的多维数组并有一个yxyupdatePosition()if检查是否达到目标的语句。然而,当执行该方法并且用户已经输入了例如up和的命令时right,则角色沿对角线向上移动。我想要一种将角色沿用户指定的方向移动的方法,一个接一个地执行它们。

这是代码:

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

使用下面的方法,我获取ArrayList用户JTextFields输入命令并将其存储在本地的ArrayList. 我还设置了用户输入命令Array的数量的大小JTextFields。这个数组将用于存储字符的xy目标。然后我最后调用moveChar();将设置目标的方法xy.

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

此方法将检查用户是否输入了命令并在数组中设置xy目标。targetCoordinates

   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位置。

公共无效更新位置(){

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

       }

   }

}
4

1 回答 1

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
        }
    }

}
于 2013-10-30T15:35:51.730 回答