用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ababup1192/frogger --skill scene-pattern命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | scene-pattern |
| description | Sceneモジュールの設計パターン。JSON宣言・エフェクト分離・Config抽出・テスト構成の規約 - 新しいSceneを作るとき、既存Sceneをリファクタするとき |
| user-invocable | false |
src/scenes/**/*.flixsrc/scenes/**/*.scene.jsonsrc/SceneLoader.flix| ファイル | 役割 |
|---|---|
src/scenes/<Name>.scene.json | ノードツリーの構造とパラメータを宣言 |
src/scenes/<Name>.flix | 振る舞いのロジック |
test/Test<Name>.flix | テスト |
ノードツリーをJSONで定義する。コードには振る舞いだけを書き、構造やパラメータはJSONに寄せる。
使えるノードタイプ: CharacterBody2D, AnimatedSprite2D, Area2D, RectShape2D
子ノード名を型安全に参照する。文字列のハードコードを避ける。
pub enum Child with Eq, ToString { case Sprite; case Hitbox }
instance SceneTree.SceneChild[Child] {
pub def sceneName(_c: Child): String = <Name>.nodeName()
pub def childName(c: Child): String = match c { ... }
}
ノード名・初期位置など、プログラム側が正(source of truth)となる値を定数として公開する。
実行中にノードから読み出すパラメータを type alias にまとめ、forM + アクセサで抽出する。
Fs.FileRead をつけない)pub def loadConfig(scene: SceneTree.Node): Config =
let config = forM (
node <- SceneTree.findNode(nodeName(), scene);
data <- SceneTree.characterBodyData(node)
) yield { ... };
match config {
case Some(c) => c
case None => bug!("...")
}
pub def build<Name>(): SceneTree.Node \ Fs.FileRead =
SceneLoader.loadScene("src/scenes/<Name>.scene.json")
入力処理・状態更新・クエリなど。loadConfig(scene) でパラメータを取得する。
Child enum にケースを追加SceneChild instance の childName にマッピングを追加buildInitialScene の子リストに build*() を追加build*() の結果を forM で全パラメータ一括検証する。プログラム側の定数との一致もここで確認。
@Test
def testBuild<Name>MatchesJson(): Unit \ {Assert, Fs.FileRead} =
let node = <Name>.build<Name>();
let result = forM (
... <- アクセサでデータ抽出
) yield {
Assert.assertEq(...)
};
match result {
case Some(_) => ()
case None => bug!("Node structure does not match expected JSON layout")
}
純粋関数のロジックを個別にテストする。
Fs.FileRead は build* 関数だけが持つ。それ以外はシーンノードを受け取る純粋関数にして、エフェクトの伝播を防ぐ。