- 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>
37 lines
1.9 KiB
Markdown
37 lines
1.9 KiB
Markdown
# 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:'开始'})——同源即可
|
||
},
|
||
});
|
||
|
||
// 输入:只写实例方法 handleTap,L1 在 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)`。
|