1
double horizontalVel=0;
double horizontalAcc=0;
double friction = 0.96;

public void move(){
    x += horizontalVel;
    horizontalVel *= friction;
    horizontalVel += horizontalAcc;

}

public void controlPress(int key){
    if(key==39){
        moveRight();
    }
    if(key==37){
        moveLeft();
    }

}

public void controlRelease(int key){
    if((key==39) || (key==37)){
        stop();
    }
}

public void stop(){
    horizontalAcc=0;
}


public void moveRight(){
    horizontalAcc +=0.2;
    heroImg = new ImageIcon("hero.png").getImage();     
}

public void moveLeft(){
    horizontalAcc -= 0.2;
    heroImg = new ImageIcon("heroflipped.png").getImage();      
}

要約すると、各座標が更新される前に速度と加速度が計算されるゲーム ループを実行しています。私のヒーローは、右に移動するよりも左 (負の x 方向) に移動すると、停止するのにはるかに時間がかかります。理由がわかりません。コードは完全に対称に見えます。これはある種の浮動小数点ブードゥーですか?

4

2 に答える 2

4

あなたはすでに問題を解決しているので、あなたのコードについていくつかの観察があります:

最も重要: 1 秒あたり 30 回起動されるため、プロセス ロジックの繰り返しで画像を読み込まないでください。

heroImg = new ImageIcon("heroflipped.png").getImage();      

いくつかのパフォーマンスの問題を引き起こす可能性があります (適切に処理されていない場合はメモリも)。コンストラクターにロードして、必要に応じて再利用することをお勧めします。また、BufferedImage を直接返す ImageIO.read("heroflipped.png") を使用します。

また、コントロールを比較するためにリテラル値 (ハードコードされた定数値) を使用しないでください。対応する定数を使用してください。新しい Java バージョンではこれらの値が変更される可能性があり、制御認識が期待どおりに機能しない可能性があるという保証はないためです。

そう:

public void controlPress(int key){
    if(key==39)
        moveRight();
    if(key==37){
        moveLeft();
}

次のようにする必要があります。

public void controlPress(int key){
    if(key == KeyEvent.VK_RIGHT)
        moveRight();
    if(key == KeyEvent.VK_LEFT){
        moveLeft();
}

また、ゲームを作成しているので、ベクトル (リストではなく数学的なもの) を使用して方向と速度を表現するようにしてください。参照としてこの記事 (ポルトガル語で書かれており、あなたの言語で何かを見つけることができますhttp://www. pontov.com.br/site/index.php/arquitetura/54-matematica-e-fisica/132-o-uso-de-vetores-nos-jogos )

于 2013-08-26T20:27:12.907 に答える
2

答えは x をインクリメントする前に horizo​​ntalVel を int に型キャストすることでした:

    x += (int)horizontalVel;

何らかの理由で、型キャストの前に任意の小さな負の x 値を -1 に丸め続け、任意の小さな正の x 値を 0 に丸めます。

于 2013-08-26T20:12:12.823 に答える