manage-game-state について
ゲーム開発者向けのスキルです。明示的なステートマシンでゲームループを構成し、入力、一時停止、リセットを扱い、実際の操作でライフサイクルを検証します。
主な機能
- 01明示的な状態と遷移
- 02アクティブ状態に応じたシミュレーション
- 03ポインターロック解除や失焦時の一時停止
- 04すべてのゲームシステムのリセット
- 05状態スナップショットによる検証
活用シーン
- 01ゲーム状態と遷移の設計
- 02一時停止と再開の実装
- 03リセット時の全システム復元
- 04終了状態からの再開テスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ playcanvas/ skills --skill manage-game-stateインストール後、Claude Code で/manage-game-stateを入力して読み込まれたか確認します。
詳細
ゲームの状態とループ
ゲームを、クロックの所有者が 1 つだけの、明示的な小規模ステートマシンとしてモデル化します。各遷移で状態を指定し、動作、入力、インターフェースは、散在するブール値ではなく現在の状態を参照します。
状態と遷移
- 状態を列挙します。たとえば、ready、playing、paused、over などです。遷移は明示的かつ網羅的に定義し、副作用から状態を推測しないでください。
- シミュレーションはアクティブな状態でのみ実行します。ゲームプレイ、タイマー、物理演算を進めるのは playing の間だけにします。
入力の取得と一時停止
- ページ読み込み時ではなく、クリックなどのユーザー操作をきっかけにポインターロックを要求します。ポインターロックの解除とタブのフォーカス喪失は一時停止として扱い、シミュレーションとクロックを停止して、次のユーザー操作で再開します。
pointerlockchangeは冪等にします。document.pointerLockElementがキャンバスの場合、ready または paused から playing に遷移し、playing の場合はそのままにします。要素がキャンバスでなくなった場合にのみ、playing から paused に遷移します。トグルとして実装してはいけません。ブラウザーも自動化ツールも、ロックがすでに取得されていることを報告する場合があります。また、重複した enter イベントによってゲームが一時停止してはいけません。build-appの要件に従い、何かを積分する前にフレームごとのデルタをクランプします。これにより、バックグラウンドになったタブや遅いフレームが、移動、クールダウン、クロックに大きなステップを加えるのを防ぎます。
リセット
- リセットではプレイヤーだけでなく、エンティティ、カメラ、クロック、タイマー、クールダウン、エフェクト、オーバーレイなど、所有するすべてのシステムを ready の値に戻します。初期状態と同じセットアップ処理を通してリセットし、ready と reset が食い違わないようにします。
- ポインターロックを解除する前に、明示的に
readyに遷移します。document.pointerLockElementからリセット後の状態を導き出してはいけません。ポインターロックは入力の副作用であり、ステートマシンではありません。 - タイマーの意味を一度定義し、状態とスナップショットの両方でその定義どおりに扱います。
reloadというフィールドは、残りのクールダウン時間です。0は使用可能な状態を表し、発射時に正の時間を設定し、アクティブループで正確に0まで減らします。その名前で、正規化された使用可能状態の値を公開してはいけません。
ループを実証する
実際の入力でサイクル全体を実行します。プレイを開始し、ポインターロックを解除してクロックとシミュレーションが停止することを確認し、再開してリセットし、すべてのフィールドが ready の値に戻ることを確認してから、終了状態に到達して再スタートします。コンソールから状態を変更するのではなく、アプリケーション自身の状態スナップショットからこれらを読み取ります。人為的に作り出した状態は証拠になりません。
build-app スキルを使ってオーサリング面を選び、アプリケーションを作成する面でループとライフサイクルを管理します。
コメント
Markdown 対応