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

37 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# recipe: 命中矩形(按钮点不动的头号根治)
**要做**:菜单的「开始」、结算的「重来」、玩中的可点区——点了要真响应。
**病根九成在这**:命中矩形只在 `render` 的副作用里生成(`menuStartBtn = renderMenu(...)` 那种回写)。并发渲染帧饥饿时 `render` 可能一次都没跑过 → 命中矩形恒 `null` → 点了没反应 → 卡在菜单一局起不来。这是「卡 menu」的头号成因。
**根治口诀**:按钮几何抽成纯函数,**场景 `onEnter`(状态进入点)确定性建立命中区,`render` 只画不赋值**——同一来源,不漂移。
**抄这段形态**
```js
// 纯函数按钮几何只算一次的来源onEnter 与 render 都调它,值一致)
function menuStartRect(viewport) {
return { x: viewport.w / 2 - 90, y: 520, w: 180, h: 64 };
}
sceneFsm.define('menu', {
onEnter() { this.startRect = menuStartRect(viewport); }, // ★命中区在这里建,不在 render
render(g) {
const btn = hudUi.drawButton(g, this.startRect, { label: '开始' }); // drawButton 回吐命中矩形
// 也可直接 hudUi.drawButton(g, menuStartRect(viewport), {label:'开始'})——同源即可
},
});
// 输入:只写实例方法 handleTapL1 在 pointerdown 时直达调用它(别自己订阅输入)
handleTap(x, y) {
if (sceneFsm.current() === 'menu' && hudUi.pointInRect(x, y, this.startRect)) {
sceneFsm.transition('play'); // 命中 → 起局
}
}
```
**别踩**
- `drawButton(g, rect, opts)` 第二参是 **rect 对象 `{x,y,w,h}`**,不是 label/坐标位置参——别写 `drawButton(g, '开始', x, y, w, h)`
- 命中判定只有 `hudUi.pointInRect(px, py, rect)`collision 插件**没有** pointInRect
- 输入不写 `ctx.getInput`、不自建 pendingClicks 队列——只暴露 `handleTap(x,y)`/`handleKey(key)`