[Astro #99] LAYER FIGHTER: ラウンドフロー改善・膝蹴り暴発バグ修正
概要
LAYER FIGHTER のラウンド進行フローを大幅に見直しました。2本先取時の演出を整理し、テンポの良い試合展開を実現しています。また、長期間残っていたキック入力の暴発バグも修正しました。
ラウンドフローの再設計
変更前の問題点
これまでのラウンド進行は、1ラウンド終了するたびに YOU WIN / YOU LOSE を表示し、勝利BGMを流していました。2本先取制にもかかわらず毎ラウンド勝敗演出が入るため、テンポが悪くなっていました。また、2本先取の確定時に専用の演出フェーズがなく、即座にリセットされていました。
新しいフロー
RoundPhase に GAME_SET を新設し、以下の2パターンに整理しました。
通常ラウンド終了(1本目): FIGHTING → KO(2秒演出)→ 勝敗カウント → ポジションリセット → ROUND_CALL → FIGHT_CALL → FIGHTING
YOU WIN / YOU LOSE の表示やBGM切り替えは行わず、すぐに次のラウンドへ移行します。
2本先取時(試合決着): FIGHTING → KO(2秒演出)→ 勝敗カウント → ポジションリセット → GAME_SET(YOU WIN/LOSE表示 + 勝利/敗北BGM、3秒)→ WAIT_INPUT(ボタン待ち)→ 全リセット → ROUND 1 へ
勝敗が確定した時だけ演出が入るため、試合全体のテンポが改善されています。
立ち位置リセット
GAME_SET に入る前に resetFighters() を呼び、両キャラクターを中央のデフォルトポジション(P1: -1.5, P2: 1.5)に戻しています。画面端でKOした場合でも、中央で向き合った状態で YOU WIN が表示されるようになりました。
フレームカウントのリセット
FIGHT_CALL → FIGHTING の遷移時に setFrameCount(0) を追加しました。これまではフレームカウンターがラウンドをまたいで加算し続けていましたが、各ラウンドの開始時に 0 からカウントされるようになっています。
リセットロジックの共通化
ラウンドリセット処理(HP回復・ポジション初期化・敵ステートマシンリセット)が3箇所にコピペされていたものを、resetFighters() ヘルパー関数に統合しました。
膝蹴り暴発バグの修正
症状
→+キック(膝蹴り)を数回出した後、方向キーを離してキックだけを押しても膝蹴りが出続けるバグがありました。
原因
キックの方向分岐で wasPressed('6') を使っていたことが原因です。この関数は入力バッファの直近10フレーム(約0.17秒)を参照するため、方向キーを離した後もバッファに残った入力が膝蹴り判定を引き起こしていました。
修正
wasPressed('6') → newDpad === '6' に変更し、現在のフレームの入力のみで判定するようにしました。wasPressed はコマンド入力(波動拳コマンドなど)向けの関数であり、単発の方向+ボタンの分岐には不適切でした。
// Before(バグ)
if ((rawRight && !pressDown) || wasPressed('6') || wasPressed('9'))
// After(修正)
if ((rawRight && !pressDown) || newDpad === '6' || newDpad === '9')
デスクトップHUDの対応
FTGBattleHUD.tsx で参照していた VICTORY フェーズを GAME_SET に更新しました。デスクトップ環境での YOU WIN / YOU LOSE 表示が正しく画面中央に表示されます。
変更ファイル
useFTGGameLoop.ts— ラウンドフロー再設計、フレームリセット、膝蹴りバグ修正、resetFighters共通化FTGTrainingScene.tsx— RoundPhase型更新、VR HUD表示のGAME_SET対応FTGBattleHUD.tsx— VICTORY → GAME_SET 参照更新
その他
Three.js 公式 Discord の showcase チャンネルに PROTOCOL.LAIN を初投稿しました。同人ゲーム作家のたまり場 Discord にも投稿しています。