1

編集:私はデッカーのリンク(ベクトル移動デモ)で非常によく文書化されたソースコードを掘り下げました、そして私はこれがそこにあるコードのいくつかからうまくいくことを理解できるとかなり確信しています。助けてくれてありがとう:D

私はjavascriptでゲームの動きに取り組んでいます。左右の矢印キーで宇宙船の画像を回転させ、上矢印キーで宇宙船を加速させます。回転の度合いと速度を使って、xとの動きを計算することができますが、これは船が車のように扱うことを意味します。宇宙にあるはずなので、船の回転は加速中の進路にのみ影響を与え、船の現在の動きを考慮に入れたいと思います。yMath.sin()Math.cos()

私はそれを何度もいじり、動きを現在の方向と速度、そして望ましい方向の2つの別々の力に分割しようとしましたが、それがどのように感じられるべきかについてさえ何も近くないようです。

紛らわしい場合は申し訳ありませんが、元のムーブメントの簡略化されたコードは次のとおりです。

function main()
{
if(keyStates[39]) // Right arrow pressed?
    ship.deg+=8; 
if(keyStates[37]) // Left arrow pressed? 
    ship.deg-=8; 
if(keyStates[38]) // Up arrow pressed?
{
    if(ship.speed<16)
        ship.speed+=1;
}
var shift=getXYshift(ship.deg,ship.speed);
function getXYshift(deg,speed)
{
    return {x:Math.round(Math.cos((90-deg)*Math.PI/180)*speed*-1), y:Math.round(Math.sin((90-deg)*Math.PI/180)*speed)};
}
setTimeout(function(){ main() }, 50);
}
4

4 に答える 4

3

1つのベクトルを使用して船の速度と方向を追跡し、上矢印が押されたときにそのベクトルの方向を変更するには、船の現在の角度を追跡するために使用される2番目のベクトルの角度を確認します。

ベクトルの使用法などを詳細に説明しているこの本SuperchargedJavascriptGraphicsを入手することをお勧めします。

また、著者のWebサイトで、本の例の1つのソースコードを表示することもできます。このソースコードには、役立つと思われるベクトル処理オブジェクトがあります。

于 2012-07-18T23:52:23.587 に答える
2

動きには「ベクトル」と呼ばれる数学的概念を使用する必要があります。ベクトルは単に力と方向です。このベクトルは、船を描画する場所を決定するときに、フレームごとに船のX、Y座標(方向を無視)に適用されます。加速するときは、船が向いている方向と加速に割り当てられた定数値を使用して、速度への影響を計算するために移動ベクトルに適用できるベクトルを形成します。

ベクトルの簡単な紹介は次のとおりです。http ://www.khanacademy.org/science/physics/v/introduction-to-vectors-and-scalars 、ビデオを見た後、何を見る必要があるかについて良い考えを持っているはずです。にとって。そこからGoogleはあなたの友達になるはずです。

編集:上記で私が言ったとき:「船が向いている方向と加速度に割り当てられた定数値を使用して、速度への影響を計算するために運動ベクトルに適用できるベクトルを形成します」私はベクトル代数を参照していました。問題を解決するためにベクトルを使用することにした場合は、加速するためにベクトル加算の概念を使用する必要があります。矢印キーを押すと、大きさm(mは加速する速度を示す任意の実数)と方向d(この値は船が向いている方向に対応する可能性が高い)のベクトルを生成します。 )。次に、この新しいベクトルを船の現在のベクトルに追加して、現在のフレームの加速が適用された後に船の新しいベクトルを取得します。あなたはここでもっと読むことができます:http://emweb.unl.edu/Math/mathweb/vectors/vectors.html

乾杯と幸せなコーディング

于 2012-07-18T23:52:34.773 に答える
2

私の低い身体的知識に基づく:

船には方向性のある速度があります。これは、1秒あたりのX軸のxピクセル、Y軸のyピクセル(および場合によってはより多くの次元)のように、空間からのベクトルとして表すことができます。

それからそれは毎秒反時計回りにα度のような回転速度を持っています。

船の移動距離を1秒間計算するには、座標に速度ベクトルを追加するだけです。そして、現在の方向に回転を追加します。

回転と加速度に基づいて速度ベクトルを変更するには、現在の方向の方向に、加速度に関連する長さのベクトルを作成します。次に、加速度ベクトルを速度ベクトルに追加します。

擬似コード:

ship = {
   coordinates: [0, 0], // space units
   orientation: 0, // radiant
   speed: [0, 0], // space units / time frame
   rotation: 0 // radiant / time fram
}
function animatestep {
   coordinates[0] += speed[0];
   coordinates[1] += speed[1];
   orientation += rotation;
}
onaccelerate = function {
   speed[0] += cos(orientation) * acceleration;
   speed[1] += sin(orientation) * acceleration;
}
onleft = function {
   rotation++;
}
onright = function {
   rotation--;
}

これにより、回転を停止するのが難しい場合があるため、宇宙船は実際には宇宙船のように動作することに注意してください。回転速度を使用する代わりに、船の向きを段階的に設定できるようにする必要がある場合があります:-)回転と加速度の制限を設定し(そうでない場合は船が破裂します)、最大速度を使用することもできます(異なる速度の追加を含む光の速度)。

于 2012-07-19T00:04:11.240 に答える
1

右/左矢印を押した後にgetXYshiftを使用しますか?上矢印が押されている場合にのみ使用してください。このようにして、船はどの方向にも加速せずに回転します。上矢印キーが押されたときにのみ速度を変更し、押されていないときに減速します。右/左キーで速度を変更しないでください。船の回転を変更するために使用してください。

于 2012-07-18T23:32:17.653 に答える