0

そのため、atan() を使用して作成される 2 つの速度に基づいてオブジェクトを動かそうとしています。しかし、すべてのテストの結果は、まっすぐ上に行くという同じ動きになります。

そこで、それを取り出して、奇妙なことに 4 つの角度 90 180 270 0 でしか機能しない入力角度に置き換えることにしました。

ここに私のコードがあります:

public void update() {

    updateDir();
    move();
}

public void updateDir(){
    dir = Math.atan(spdY/spdX);


    dir =20; //I know this is here it was used to test if it will actually change
    dir = dir * Math.PI / 180.0;
    System.out.println("dir: " + dir);
}


public void move() {
    x +=   (spd*Math.cos(dir));
    y -=  (spd * Math.sin(dir));
}

4 方向にしか進まない理由はありますか?

4

2 に答える 2

3

dirフィールドがコード内で変更されないことに気付きましたか。

メソッドupdateDirは、何回呼び出しても同じものを出力します。

何のdir = 20ために?そのステートメントを再確認するか、削除する必要があるかもしれません。

于 2013-08-09T23:45:26.880 に答える
1

@Nishant Shreshthの言うことは真実です。しかし、変数の代わりに浮動小数点 ( または など)をfloat使用することも非常に重要です。そうしないと、値の小数部分が切り捨てられる可能性があります。これは、ラジアンと三角関数を使用するときにかなりの問題になります。doubleintdirxydir

Math.atan2(spdY, spdX)また、使用するデフォルトの atan メソッドの代わりに使用する可能性があることに注意してください。あなたのアプローチは、spdXゼロになるとすぐに失敗します。ゼロで除算します。atan2これらのエッジケースを処理します。ウィキペディアには、この機能の詳細が記載されています。

于 2013-08-10T00:07:34.833 に答える