CHAPTER 08 · 全23項目
自機の移動と入力
ポインターとキーボードを共通の状態にまとめ、移動速度と連射を制御します。
主な参照先:keys / mouseX / inputMode / releaseControls / updatePlay / LASER_MOVE
イベントでは操作を覚えておく
function releaseControls() {
shooting = false; keys.left = false; keys.right = false; keys.fire = false;
}ポインター移動は目標位置 mouseX、左右キーは keys.left と keys.right、射撃は shooting または keys.fire に記録します。実際の移動と弾の生成は、毎フレームの updatePlay() が担当します。
どちらの入力も速度を通して動かす
// 合体レーザーの照射中は反動でマウス・キーボードとも 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 を立てます。