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.3 KiB
Raw Blame History

recipe: 结算演出(爽感反馈 + 结算页驻留)

要做:成单/暴击/大额那一下有「打击感」,一局结束进结算页并停住不动

两个病根

  1. 结算态不驻留(自动重开) → 瞬时终态被漏读 → 宿主 500ms 轮询 phase 代发 game_end 时已经不在 over 态 → 结算闭环静默断裂。phaseover/gameover必须恒驻留(禁自动重开,等玩家点「再来」才回 menu
  2. juice.render(g) 忘了每帧手调 → 粒子/屏震/闪白全不显示juice 的 render 不是自动的,要在你的 render 里每帧调)。

抄这段形态(结算时刻的爽感)

// 成单/暴击那一下:一次 hitStop + 轻 shake + 音效(单行调用,不是系统,好手感标配)
onServeSuccess(x, y, isCrit) {
  juice.spawnEmitter('burst', x, y);          // 粒子迸发
  juice.hitStop(isCrit ? 90 : 40);            // 顿帧(毫秒)
  juice.shakeScreen(isCrit ? 6 : 3);          // 轻震屏
  audioMusic.playSfx(isCrit ? 'win' : 'coin'); // 语义音效名,自动映射
  sessionScore.addScore(isCrit ? 8 : 5);
}

render(g) {
  sceneFsm.render(g);
  juice.render(g);   // ★每帧手调,否则粒子/打击感看不见
}

抄这段形态(结算页 latch 驻留)

.define('over', {
  onEnter() {
    if (!sessionScore.isOver()) sessionScore.lose();  // 终态一次性落定
    this.overRestartRect = overRestartRect(viewport); // 「再来」命中区在 onEnter 建
    audioMusic.playSfx('fail');
  },
  render(g) {
    hudUi.drawText(g, `本局 ${sessionScore.getScore()} 分`, { x: viewport.w/2, y: 300 });
    hudUi.drawButton(g, this.overRestartRect, { label: '再来' });
  },
  // ★没有 update 里的自动 transition('menu')——驻留,等 handleTap 命中「再来」才回 menu
})

别踩

  • 音效名用语义名(coin/win/hit/jump/fail/click)或预设(blip/thud/chime),未知名自动兜底 blipaudioMusic.play(intensity) 入参是情绪强度 0..1、不是曲目名。
  • juice.spawnEmitter('burst', x, y) 也可写 juice.burst(x, y)(母语别名);hitStop/shakeScreen 收毫秒/像素。
  • 结算的 _forensicsView().state().phase 要能读到 gameover(自动验收据 latch 驻留判终态可达)。