lili 85f48228cd
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
feat(cheap-gen): W-AXIS 波3 知识层补强+收尾——tsc 顾问门+recipes+暗资产接线+n=5 基线台账
- tsc 顾问门:typescript devDependency + tsc-advisory 测试档;顾问性(永不阻断),
  金标 10 款零误伤抽验
- recipes/ 五篇高频场景索引(命中矩形/计时器/资产回退/场景机/结算演出,「抄这段形态
  +头号病根」)+ littlejs-game-dev §0.5 卡壳就查接线
- 暗资产接线:plugin-capability-map(11 注入+1 取证+6 储备逐件裁定)+
  engine-capabilities-brief(≤3KB 蒸馏)+ api.d.ts/game-host.d.ts 补插件指针;
  三方一致性对账门 plugin-surface-gate.py(含 cwd 锚定修)挂 pre-commit+Gitea Actions
- hard_genre_batch 参数化(五品类 n=5 批跑驱动,checkpoint 续跑)
- n=5 基线台账入库(gitignore 例外 add -f,只入台账不入游戏产物):
  wax-baseline.jsonl 25 局逐局记录(含判定仪器订正批注:cap1500 重判/图像盲 M3 重判,
  只加字段零改值)——终数:操作口径 14/25=56%、质量口径 18/25=72%;
  品类 narrative/heritage 5/5、trpg 4/5、puzzle/sim-business 2/5(缺口逐局有名有姓,
  根因见 07-10 v2 plan §1);旧「80%/39%」口径正式作废存照

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 04:27:18 -07:00

2.0 KiB
Raw Blame History

recipe: 场景机menu → play → over 三态)

要做:菜单页 → 游玩 → 结算页,能来回切。

病根九成在这sceneFsm.define({ menu:{...}, play:{...}, over:{...} }) 一个对象批量注册。define 第一参恒为场景名字符串——传对象 → 第一参被当成场景名 "[object Object]"menu/play/over 全没真注册 → 后续 transition('play') 找不到目标态被静默忽略 → 卡菜单进不去 play合成/2048 类翻车点)。

根治每个场景各调一次 define(name, handlers),第一参是字符串。

抄这段形态

sceneFsm
  .define('menu', {
    onEnter() { this.startRect = menuStartRect(viewport); },  // 命中区在 onEnter 建(见 hit-rect.md
    render(g) { hudUi.drawButton(g, this.startRect, { label: '开始' }); },
  })
  .define('play', {
    onEnter() { this.score = 0; this.remainMs = ROUND_MS; },
    update(dt) { /* 只收 dt推进玩法、判胜负 */ },
    render(g) { /* 画游玩画面,只收 g */ },
  })
  .define('over', {
    onEnter() { sessionScore.isOver() || sessionScore.lose(); }, // 结算态latch 驻留(见 settlement.md
    render(g) { hudUi.drawButton(g, this.overRestartRect, { label: '再来' }); },
  });

sceneFsm.start('menu');   // 起手停在菜单
// update/render 五法里把帧转交场景机:
update(dt) { bundle.tick(dt); sceneFsm.update(dt); }
render(g)  { sceneFsm.render(g); }

别踩

  • 回调表里 update(dt) 只收 dt、render(g) 只收 g——与五法同形别臆造 update(scene, dt)
  • _forensicsView().state().phase 必须实时读 sceneFsm.current()(在 state() 函数体内别在外层先算好闭包返回host 只在 boot 调一次 _forensicsView外层算的值会定格成 boot 快照=永远 menu → 自动验收永判死菜单)。
  • 状态名你自己定menu/play/over 只是惯例);transition(to) 的 to 必须是你 define 过的名。