2

現在、Java 2D ゲームを作成しており、その中でユーザーからコマンドを受け取り、キャラクターを一定の距離だけ上下左右に移動します。現在for、ユーザー入力のループを使用して文字列を Player クラスに渡します。これにより、ユーザー入力文字列がキャラクターを移動する方向のいずれかと一致するかどうかがチェックされます。このすべてが実行されると、プレイヤーが目的の場所にテレポートしたように見えます。プレイヤーが自然にその場所に移動しているように見せるために、キャラクターがターゲットの場所に到達するまで一定量のピクセルを移動する方法はありますか?

JTextFieldsこれは、プレーヤーを移動するためのユーザーのコマンドを含むをループするために使用される movePlayer 関数です。各stringsテキスト フィールドの は別の関数に渡されます: inputListener.

public void movePlayer(){

    for (int i = 0; i < userTextInput.size(); i++) {
        inputListener(userTextInput.get(i).getText());
    }
} 

は、ユーザが入力した が移動タイプと一致するinputListenerかどうかをチェックし、 はキャラクタを移動するための適切なメソッドを開始します。strings

private void inputListener(String Input){

     if(Input.equals("up")){
         player.moveCharacterUp();

     }else if(Input.equals("down")){
         player.moveCharacterDown();

     }else if(Input.equals("left")){
         player.moveCharacterLeft();

     }else if(Input.equals("right")){
         player.moveCharacterRight();

     }

}

これは、メソッドの実行に従って文字の位置が設定される場所ですxyinputListener

public void moveCharacterUp(){
    y -= moveSpeed;
} 

public void moveCharacterDown(){
    y += moveSpeed;
}

public void moveCharacterLeft(){
    x -= moveSpeed;
}

public void moveCharacterRight(){
    x += moveSpeed;
}

Thread私が使用しているの実行方法。

public void run(){

    init();

    long start;
    long elapsed;
    long wait;

    while(running){

        start = System.nanoTime();

        update();
        draw();
        drawToScreen();

        elapsed = System.nanoTime() - start;
        wait = targetTime - elapsed / 1000000;

        if(wait < 0) wait = 5;

        try{
            Thread.sleep(wait);

        }catch(Exception e){
            e.printStackTrace();
        }

     }
    }
4

3 に答える 3

1

私が過去にこれを行った方法は、targetXandを作成することtargetYです。次に、 と がとに等しくなるまで
インクリメントxします。 ytargetXtargetY

int x = 0; //Character's x position
int y = 0; //Character's y position
int targetX = 0; //Character's target x position
int targetY = 0; //Character's target y position
int moveSpeed = 2; //the speed at which the character moves
int moveAmt = 20; //amount the character is set to move every time it is told to move

void setTarget(int targetX, int targetY) //sets targetX and targetY, doesn't need to be called at all
{
    this.targetX = targetX;
    this.targetY = targetY;
}

void moveCharacter(int x, int y) //moves the character, doesn't need to be called at all
{
    this.x = x;
    this.y = y;
}

void updatePosition() //initiates/continues movement, should be called every frame
{
    if(Input.equals("up")) {
         setTarget(targetX, targetY - moveAmt);

    } else if(Input.equals("down")) {
         setTarget(targetX, targetX + moveAmt);

    } else if(Input.equals("left")) {
         setTarget(targetX - moveAmt, targetX);

    } else if(Input.equals("right")) {
         setTarget(targetX + moveAmt, targetX);

    }

    if(y > targetY) {
         player.moveCharacter(x, y - moveSpeed);

    } else if(y < targetY) {
         player.moveCharacter(x, y + moveSpeed);

    } else if(x > targetX) {
         player.moveCharacter(x - moveSpeed, y);

    } else if(x < targetX) {
         player.moveCharacter(x + moveSpeed, y);

    }
}
于 2013-10-25T17:57:44.507 に答える
0

速度は、変数 moveSpeed によって設定されます。これはおそらく希望する値よりも高い値に設定されているので、変更してみてください。

于 2013-10-25T17:07:35.640 に答える
0

プログラムは時間をカウントする必要があります。その時間値は、moveSpeed のスケーリングに使用されます。キーを押すと、現在の時刻が取得されます。moveSpeed を適用しようとすると、もう一度時間を取得して、前回の時間との差を計算する必要があります。その違いが倍率になります。このようなもの:

private void inputListener(String Input){
   lastTime = getTime();
}

public void moveCharacterUp(){
   currTime = getTime();
   y -= moveSpeed * (currTime - lastTime)
   lastTime = currTime;
} 
于 2013-10-25T17:48:00.813 に答える