音量・演出軽減・データ初期化を実装した話

開発ログ / アクセシビリティ / UI設計

敵とボスのコンテンツ拡張、クレジット経済とHANGARの整備が一段落したあと、後回しになっていた地味だが大事な機能に着手しました。それが OPTION 画面です。VOID STRIKERはBGM・SFXの音量を個別に調整でき、被弾やボム時の画面揺れ・フラッシュを弱める「SCREEN FX」設定、そして進行データを完全にリセットする「WIPE DATA」の3系統の機能を、シンプルな縦リストのメニューにまとめています。

音量ミキシングを3段構成にする

音まわりはすでに G.Audio モジュールがWebAudioでSFXとBGMをその場で合成する仕組みを持っていましたが、そこに「ミュート」と「音量調整」という2つの独立した操作を両立させる必要がありました。設計としては、マスターゲイン(ミュートのON/OFFのみを担当し、0か既定値かを切り替える)の下に、SFX専用のゲインノードとBGM専用のゲインノードを子として接続する3段構成にしています。こうすることで「ミュート中でも音量設定は保持される」「音量を0%にしてもミュートボタンの状態には影響しない」という、2つの操作が互いに干渉しない挙動を実現できました。BGM再生中に音量スライダーを動かしても、次の音符からではなくその場で即座に反映されるようにしたのも、操作の手応えを重視したポイントです。

「演出を弱める」という選択肢

VOID STRIKERは被弾やボム発動時の画面揺れ・フラッシュを派手めに演出しているのですが、これは光や動きに敏感なプレイヤーにとっては負担になり得ます。そこで SCREEN FX 設定に FULL/REDUCED の2択を用意し、REDUCED を選ぶと画面揺れ・フラッシュの強度を約25%まで一律で弱めるようにしました。実装上のポイントは、揺れやフラッシュの呼び出し元(被弾処理・ボム処理・ボスのフェーズ移行など)を一切変更せずに済むよう、G.Particles モジュール側に setReducedFx(reduced) という切り替えフラグを1つ追加するだけにしたことです。呼び出し側は今まで通り shake(power)/flash(color, strength) を呼ぶだけで、実際の演出強度を弱めるかどうかはパーティクルモジュール内部で完結させています。機能を追加するときに、なるべく既存のAPIを変えずに済む場所に手を入れる、という判断はコード全体の見通しを保つうえで意識している点です。

「うっかり消去」を防ぐ二段階確認

WIPE DATA は進行データ(クレジット・所持スキン/テーマ・紹介コードの使用履歴など)をすべて消去する、取り消しのきかない操作です。誤操作で全データが消えてしまうのは避けたいものの、確認ダイアログを出すために alert/confirm を使うことはVOID STRIKERのルール上禁止されています(外部UIに依存せず、すべてcanvas内で完結させる方針のため)。そこで、1回目の決定操作では実際には何も消さずに「もう一度押すと消去します」という警告表示だけを行い、3秒以内に再度決定操作をした場合にのみ実際の消去処理を実行する、という二段階の自前確認フローを実装しました。3秒経過すると警告は自動的に解除され、通常の状態に戻ります。ブラウザ標準のダイアログが使えない制約の中でも、シンプルなタイマー変数ひとつで実用的な誤操作防止を作れたのは、小さな成功体験でした。

設定の永続化とゲーム本体との分離

音量やSCREEN FXの設定は、クレジットなどのゲーム内経済データ(voidstriker_meta)とは別の voidstriker_settings というlocalStorageキーに保存しています。経済データと表示・音響設定は性質がまったく異なるため、意図的にストレージのキーを分け、それぞれ読み書きを try/catch で保護することで、片方の読み込みに失敗してももう片方には影響しないようにしています。こうした小さな分離の積み重ねが、機能を追加するたびに壊れやすくなっていくのを防いでいると感じます。