2

ゲームループに次のコードがあります。

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    if (aPress) {
                        rotate -= rotSpd;
                        rotate = rotate < 0 ? 360 + rotate : rotate;
                    }
                    if (dPress) {
                        rotate += rotSpd;
                        rotate = rotate > 360 ? rotate - 360 : rotate;
                    }
                    if (wPress) {
                        x += (rotate < 180 ? speed : -speed) * Math.abs(Math.sin(Math.toRadians(rotate)));
                        y += (rotate < 270 ? (rotate < 90 ? -speed : speed) : -speed) * Math.abs(Math.cos(Math.toRadians(rotate)));
                    }
                    if (sPress) {
                        x -= (rotate < 180 ? speed : -speed) * Math.abs(Math.sin(Math.toRadians(rotate)));
                        y -= (rotate < 270 ? (rotate < 90 ? -speed : speed) : -speed) * Math.abs(Math.cos(Math.toRadians(rotate)));
                    }
                    repaint();
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException annoyingUncheckedException) {}
                }
            }

        }).start();

A を押すと、反時計回りに回転します。Dを押すと時計回りに回転します。Wを押すと前進、Sを押すと後退します。しかし、WとDを長押しすると、最初は本来の円を描くように進んでいきますが、ゆっくりと左上隅の方向に進み始めます。どうすればこれを修正できますか?

4

3 に答える 3

2

まず第一に、コード全体をよりよく理解するために、剰余演算子を使用します (また、エラーが発生しにくくなる可能性もあります)。

if (aPress) {
    rotate = (rotate - rotSpd + 360) % 360;
}
if (dPress) {
    rotate = (rotate + rotSpd) % 360;
}
if (wPress) {
    x += Math.cos(Math.toRadians(rotate));
    y += Math.sin(Math.toRadians(rotate));
}
if (sPress) {
    x -= Math.cos(Math.toRadians(rotate));
    y -= Math.sin(Math.toRadians(rotate));
}

あなたの問題に関して、私は問題を再現できるかどうかを確認するために簡単な jsFiddleを作成しましたが、できません。これは、キーの押下 (ダウン/アップ/ホールド) イベントの処理方法に関連していると思います。おそらく、各反復で押されたキーのセットをログに記録し、何らかの不一致があるかどうかを確認することができます。

NB : jsFiddle では、キーボード レイアウトの問題を最小限に抑えるために、W/A/S/D キーが UP/DOWN/LEFT/RIGHT に置き換えられました。また、ループのコードをリファクタリングして、ロジックとSJuan76の回答を反映させました。

于 2013-01-15T01:50:26.683 に答える
1

これは実際にはコメントですが、より良い書式設定のために回答を使用します。

このコード (およびその他のコード) は少し奇妙だと思います。

x += (rotate < 180 ? speed : -speed) * Math.abs(Math.sin(Math.toRadians(rotate)));

x (水平値) は、正弦ではなく、余弦に依存する必要があります。また、速度の符号を変えてsin絶対値にしなければならないのも変です。

それは良くないでしょうか?

x+= speed * Math.cos(Math.toRadians(rotate))

もちろん、垂直を指す 0 見出しを使用することもできますが、それでも簡単だと思います

x+= speed * Math.cos(Math.toRadians(rotate) + Math.PI/4)
于 2012-11-30T13:42:08.887 に答える
0

このようなことを行うことで、必要な動作を指示できますよね?

if(wPress && dPress)
{
    //code for both being hit
}

私の推測では、現在の問題は、aw と d のプレスの速度が等しくなく、非円形の移動パスが発生するという事実が原因であると考えられます。

于 2012-11-30T13:40:47.140 に答える