Java游戏 - 在游戏循环中按顺序运行代码

时间:2013-10-30 15:14:45

标签: java arrays methods arraylist

我正在创建一个Java游戏,用户可以在其中输入upleftrightdown的命令来移动该位置的角色一定数量的像素。在Player类中,我在按下开始按钮后,在ArrayList JTextFieldfor内收到用户发出的命令。然后,我使用x循环遍历用户的所有输入,并在y和{{1}的多维数组中创建xy个目标玩家需要移动的距离。最后,我有一个名为updatePosition()的函数,它在主游戏循环中调用。在这个函数中,我循环遍历目标的多维数组,并有一个if语句来检查目标是否已到达。但是,当执行此方法并且用户输入了upright的命令时,角色会向上对角移动。我想要一种方法,将角色移动到用户指定的方向,一个接一个地执行它们。

以下是代码:

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

此方法将检查用户已命令的命令,并在x数组中设置ytargetCoordinates目标。

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

public void 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)

目前,您使用所有可用命令创建单个目标位置,并使用它来指导您的动作(或可能同时向所有目标位置移动)。

相反,您需要一个超出特定游戏循环的命令“漏斗”,并且仅在当前游戏完成后才会获取新命令。新命令位于顶部和底部以便完成。

这很可能看起来像这样

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

}