マリオのジャンプ実装法とVerlet積分(実践編)

前回の続き

実際にやってみました。(Canvas要素を使っているのでFirefoxでどうぞ)
http://eva-lu-ator.net/~gemma/geocities/jsmario/jsmario.html


マリオのようにジャンプで放物線運動をするゲームを作るとき、
たいていは、座標と速度を使って物理計算すると思います。これはEuler法といいます。

Verlet法では、座標と、前回の座標を使って計算します。つまり、速度を記憶しません。

Verlet法では、座標だけ扱えばすむので、壁にめりこんじゃいけないといった条件を簡単に書くことができます。
単に座標を、壁の直前にするだけでいいです。
ネタ元はCowboy Programming >> Blob Physicsです。

http://eva-lu-ator.net/~gemma/geocities/jsmario/verlet.png
今回のコードの肝は以下の部分です。衝突判定がすっきり書けました。

  //Verlet法
  var y_temp = Mario.y;
  Mario.y += clamp(Mario.y - Mario.y_prev - Mario.y_accel - GRAVITY,  -MAX_SPEED_Y, MAX_SPEED_Y);
  Mario.y_prev = y_temp;

  if (Mario.y - Mario.y_prev < 0) {
    //上方向に速度があるならば

    //頭で衝突判定する
    tx = Math.floor((Mario.x+8) / 16);
    ty = Math.floor( Mario.y    / 16);
    //ブロックがあったら、y方向の移動を制限する
    if (Stage[ty][tx]) {
      Mario.y = ty * 16 + 16;
    };