ソースコード解説・目次

CHAPTER 08 · 全23項目

自機の移動と入力

ポインターとキーボードを共通の状態にまとめ、移動速度と連射を制御します。

主な参照先:keys / mouseX / inputMode / releaseControls / updatePlay / LASER_MOVE

イベントでは操作を覚えておく

game.html · L1292–1294ソースを見る ↗
function releaseControls() {
  shooting = false; keys.left = false; keys.right = false; keys.fire = false;
}

ポインター移動は目標位置 mouseX、左右キーは keys.left と keys.right、射撃は shooting または keys.fire に記録します。実際の移動と弾の生成は、毎フレームの updatePlay() が担当します。

どちらの入力も速度を通して動かす

game.html · L1596–1605ソースを見る ↗
  // 合体レーザーの照射中は反動でマウス・キーボードとも LASER_MOVE まで遅くなる。
  const lasing = special.laserT > 0, speed = 340;
  if (inputMode === "mouse") {
    const target = clampPlayerX(mouseX), step = (lasing ? LASER_MOVE : speed * 2) * dt;
    player.x = clampPlayerX(player.x + clamp(target - player.x, -step, step));
  } else player.x = clampPlayerX(player.x + (lasing ? LASER_MOVE : speed) * dt * ((keys.right ? 1 : 0) - (keys.left ? 1 : 0)));
  player.cool -= dt;
  player.inv = Math.max(0, player.inv - dt);
  active.wide = Math.max(0, active.wide - dt);
  active.rapid = Math.max(0, active.rapid - dt);

キーボードは左右の真偽値を -1・0・1の向きに変換します。ポインター操作は目標へ瞬間移動するのではなく、1回に進める距離 step を制限して追従します。基本の速度 speed は毎秒340 pxです。ポインターで追従するときは1フレームに最大 speed * 2 * dt まで進めるので、キーボード移動の2倍の速さまで出せます。

合体レーザーの照射中 (lasing) だけは、ポインターでもキーボードでも速さを LASER_MOVE の毎秒70 pxに抑えます。射線は自機の位置から伸びるので、ここで速さを抑えておくと、レーザーを横に振って編隊全体をなぎ払うことができなくなります(「13 合体レーザーとボム」)。

clampPlayerX() は画面端で位置を制限します。連結砲があるときは砲の幅も考慮しますが、敵弾と当たるのは自機本体だけです。

長押しの射撃はクールダウンで調整する

player.cool が0以下で、通常弾数が上限未満なら発射します。基本間隔は0.27秒、連射(R)の効果中は0.12秒です。通常弾の上限は基本3、ボス戦では5です。3方向ショットまたは連射の効果中は、ボス戦かどうかにかかわらず12になります。連結ビームはこの通常弾数に数えず、1門につき画面内1発までという別の上限で管理します(「12 カプセルと連結ビーム砲」)。

入力が残る場面をなくす

キーを離す、ポインターを離す、操作がキャンセルされる、といったイベントで入力を解除します。ポーズ、ゲーム開始、ゲームオーバーのときも releaseControls() を呼びます。ウィンドウがフォーカスを失うと、プレイ中なら自動でポーズになります。

一方、ミスとウェーブクリアでは入力を解除しません。射撃や移動のキーを押したままなら、復帰後や次のウェーブでもそのまま撃ち続け、動き続けます。ポインターも同じで、play に加えてミス後の dying とクリア表示中の clear で押し始めた場合も shooting を立てます。