1

ですから、プログラミング言語を学んでいる他の人たちと同じように、私は自分自身に宇宙船ゲームプロジェクトを与えました。これまでのところ、視差のある星と、宇宙船のゲームに期待するすべての素晴らしいものがあります。船はゲーム画面の中央に留まり、360度回転でき、推力と惰性走行が可能で、通常は宇宙空間の物体のように適切に動作します。しかし、船の速度を制限することに関して、私は小さな問題を抱えています。

船にはdxとdyの値があり(update()関数を介して星に変換されるため、実際に移動します)、直面している角度に基づいて、x軸またはy軸のいずれかに推力を適用します。船に最高速度(たとえば5)と加速度(フレームあたり0.1)を与えます。突っ込むと、船は思った通り加速します。私はデジタル入力デバイス(矢印キー)を使用しているため、スラスターは常に100%で、スロットル制御はありません。船の現在のdxとdyによって作成された三角形のハイポテヌスをチェックして、現在の速度を決定します。また、その移動角度も追跡します(後のAIで使用するため、武器が発射されます。下矢印を押すと、船はこの値を使用して、現在の軌道の反対側を向くために回転する必要のある角度を認識します。これは、ブレーキをかけるのに適した自動操縦の一種です)。

船にはこれらの変数があり、必要に応じて更新されます(残りのものは直接関連しないため、これは省略されたリストです)。

x_speed
y_speed
speed
move_angle // Used to track direction of motion
face_angle // Used to determine x_accel and y_accel when thrusting
x_accel
y_accel
accel = 0.1 // Used to determine x_accel and y_accel by multiplying by the dx and dy returned by getDxDy(face_angle)
max_x
max_y
max_speed = 5 // Used to determine max_x and max_y by multiplying by the dx and dy returned by getDxDy(face_angle)

この関数を使用して、face_angleに基づいてdxとdyの加速をチェックします。

function getDxDy(degree)
{
var dx;
var dy;
var degree = degree;

dx = -Math.sin(degToRad(degree));
dy = Math.cos(degToRad(degree));

var dxdy = {
    dx: dx,
    dy: dy
};

return dxdy;
}

私は次のように加速のフレームごとに速度を更新します:

x_speed += x_accel
y_speed += y_accel

私は複数の異なるタイプのチェックで速度を制限しようとしました、そして私はこれを試しました:

if (x_speed > max_x)
{
    x_speed = max_x
}

そして私はこれを試しました:

if (x_speed > max_x)
{
    x_speed -= x_accel
}

最初のバージョンは希望どおりに速度を制限しますが、その後、加速度を完全に変更できないか、反対方向を向いて押してコースを逆にしようとすると、速度が即座に反対方向のmax_speedにジャンプします(max_speed以降)船の現在のface_angleに基づいて常に計算されます)。その計算をmove_angleに変更すると、船が発進し、移動していないときに問題が発生します。

2番目のバージョンでは、速度がしきい値を下回る前に推力を停止した場合に問題が発生します。私は顔と推力についてですが、代わりに推力が負であるため、私が直面している方向とは正反対の、進行している方向にさらに加速します。

私が理想的に望んでいるのは、任意の方向にある値(たとえば、5)で推力を制限できることです。方向を数度変えると、船は数秒後にその方向に曲がります。推力、そして私が顔を向けて推力を出すとき、私は船を予想通りに減速させたいと思います。

誰かがゲームEscapeVelocityをプレイしたことがあるなら、それは私が取り組んでいる一種の移動および制御システムです-あなたがそうするなら、私の「ゴールドスタンダード」のようなものです。

http://adrian.thomas-prestemon.com/game/v3/で私の現在のやや機能しているコードをチェックしてください

これを処理する特定の.jsファイルは、http://adrian.thomas-prestemon.com/game/v3/js/ships.jsにあります。コメントアウトされたコードなどの混乱を許してください。私はこの1週間、全体的な問題のこの特定の部分に取り組んできました。

私はすでにオンラインで利用可能な他の複数のソリューションを調べましたが、私の設計に最も類似しているものは、上記で提供した最初の「if」の例を使用していますが、これはうまくいきません。次のStackOverflowのQ&Aも確認しました。

2D宇宙船の動きの数学

物理学による宇宙船の2D軌道計画

現在の速度ベクトルからターゲットベクトルへの推力のスムーズな変化のプログラミング

これらのソリューションはすべて非常に素晴らしいように見えますが、私の目的ではすべて少し複雑に見えます。最初の例のように、私はいかなる種類の重力システムも実装する予定はありません。他の2つは関連していますが、私の特定の問題にすぐに役立つものは何も提供していないようです。

基本的な擬似コードおよび/または誰もが提供できる他の種類のヘルプ(私が見逃したかもしれない私の質問に答える何かに直接私を向けるなど)をいただければ幸いです。現在の設定で機能するソリューションを探していますが、このmax_speedのチェックが簡単になる場合は、船の移動コードの機能を少し変更したいと思っています。

このすべてを読むために時間を割いていただきありがとうございます。:)

アップデート:

コードにいくつかの変更を加えたところ、以前よりもはるかにうまく機能するようになりました。完璧ではありませんが、さらに実験、調整、デバッグを行うだけで十分です。:)

4

1 に答える 1

0

その計算を move_angle に変更すると、船が動き出して動かないときに問題が発生します。

dxdyx_speed、および のy_speed値を 0 に初期化し、x_speedとの値を個別y_speedに保持するのではなく、移動角度を決定しますmove_angle

または、設定を誤解している場合は、speed0 に設定して開始し、速度値が特定のカットオフを下回ったときに三角法を含まない計算を行います。

または、速度と加速度の計算のほとんどを極値で実行し、画面に表示するときにデカルト座標に変換することもできます。

私が半支離滅裂で申し訳ありませんが、それは私にとって1日のスランプ時間であり、机に座っているよりも今は昼寝をしたいです.

于 2011-05-26T19:51:57.507 に答える