0

ユーザーがコマンドupを入力できる Java ゲームを作成していleftます。クラス内で、ユーザーが開始ボタンを押した後、 of でユーザーからコマンドを受け取ります。次に、ループを使用してユーザーからのすべての入力を調べ、プレイヤーが移動する必要がある距離と量の多次元配列内にターゲットを作成します。最後に、メイン ゲーム ループ内で呼び出される関数があります。この関数内で、ターゲットの多次元配列をループして、rightdownPlayerArrayListJTextFieldforxyxyupdatePosition()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を格納するために使用されます。最後に、ターゲットとを設定するメソッドを呼び出します。xymoveChar();xy

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

このメソッドは、ユーザーが入力したコマンドが配列内にxおよびyターゲットを設定したかどうかをチェックします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配列を調べて、ターゲットが満たされているかどうかを確認します。xそうでない場合は、それに応じて文字とy位置を増減します。

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

       }

   }

}
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 に答える