lili a4dc91c43a feat(shanhai): 有界竞技场+完整背景图,彻底消除背景拼接
- balance.js: ARENA={w:1560,h:2960} 有界竞技场(中心对称原点)
- sim.js: 玩家走位 clamp 到场内(边距含岩壁内沿,贴边不站黑墙/不出屏)
- render.js: 镜头 clampCam + drawPlayer 解耦屏心 + drawGround 一档接整幅背景图(二档视差瓦片兜底)+ 四边自然暗角 + 背景降颗粒
- art.js: 登记 bg-map1-arena-01 + 后台拉起预载 + tiles 降懒载(不增首屏网络字节)
- assets/bg/bg-map1-arena-01.jpg: 矿彩国风裂谷原整图(1560x2960,AI 草图创始人审)
- 墙角死角作为有界竞技场设计保留;⑧win 重跑留下检查点
2026-07-25 01:12:24 -07:00

233 lines
7.2 KiB
JSON

{
"checkpoint": "round-12 微调 3 个 CONCERNS(clamp 边距→岩壁内沿 / 四边自然暗角 / 背景降颗粒)+ CDP 复核",
"utc": "2026-07-25T07:59:09.540Z",
"machine": "lili-mac.local(开发机,非 mini-desktop)",
"node": "v22.22.3",
"url": "http://127.0.0.1:4518/?engine=stub&mode=evidence&seed=777",
"dpr": 2,
"viewport": {
"w": 390,
"h": 844
},
"arena": {
"w": 1560,
"h": 2960
},
"clampMargin": "player.r(12)+ARENA_WALL_INSET(84)=96",
"clampX": 684,
"clampY": 1384,
"microadjust": {
"c12": "sim.js clamp 边距 player.r→player.r+84=96,玩家贴边停在岩壁内沿,不站黑墙/不出屏",
"c3a": "render.js drawArenaBounds 纯黑硬带 rgba(5,3,1,0.85)→四边自然暗角 rgba(16,11,6,·) 峰值 0.5、外半段集中渐透",
"c3b": "render.js drawGround 一档 drawBg 前 imageSmoothingEnabled=true + quality=high,缓解上采样+DPR2 颗粒"
},
"collector": "/tmp/arena-e2e-r12.mjs(临时脚本,置 /tmp 不入仓)",
"shots": [
{
"name": "01-arena-center-panorama.png",
"desc": "全景:玩家场心(0,0),镜头居中,竞技场整幅背景中心区",
"sha256": "8d3f74d92ff0161167ad2d2e5dc51d41c50024028001edd4bfd5e0082b943f21",
"bytes": 1717505,
"utc": "2026-07-25T07:59:15.507Z",
"phase": "play",
"pos": {
"x": 0,
"y": 0
},
"timeS": 1.6,
"score": 0,
"enemies": 1,
"expectedScreen": {
"camX": -195,
"camY": -422,
"sx": 195,
"sy": 422
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 27467,
"total": 47190,
"ratio": 0.582
}
},
{
"name": "02-arena-edge-right.png",
"desc": "右边缘:玩家贴右界(x≈684,岩壁内沿),应停在暗角内沿清亮区、不站黑墙",
"sha256": "a3ca2290e0da3056a38a89f2584b059b381af97cdfa0a367f9b33ea1f97c6c12",
"bytes": 1363380,
"utc": "2026-07-25T07:59:15.916Z",
"phase": "play",
"pos": {
"x": 684,
"y": 0
},
"timeS": 7.7,
"score": 3,
"hp": 100,
"enemies": 3,
"level": 1,
"expectedScreen": {
"camX": 390,
"camY": -422,
"sx": 294,
"sy": 422
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 11560,
"total": 47190,
"ratio": 0.245
}
},
{
"name": "03-arena-edge-top.png",
"desc": "上边缘:玩家贴上界(y≈-1384),躯体不出视口、不潜墙下",
"sha256": "ed6b29c9eab72ce7bb101a8ade15091c4d3a2ffa99af91f9cd6b070fcc11c98a",
"bytes": 1170387,
"utc": "2026-07-25T07:59:16.482Z",
"phase": "play",
"pos": {
"x": 684,
"y": -1384
},
"timeS": 19.7,
"score": 12,
"hp": 100,
"enemies": 5,
"level": 1,
"expectedScreen": {
"camX": 390,
"camY": -1480,
"sx": 294,
"sy": 96
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 2570,
"total": 47190,
"ratio": 0.054
}
},
{
"name": "04-arena-edge-left.png",
"desc": "左边缘:玩家贴左界(x≈-684),左岩壁自然暗角",
"sha256": "c6c73e06a3e86a0a4d344c366dd6c443a94f84a72990cb0be2e74c10534f2a8d",
"bytes": 1106646,
"utc": "2026-07-25T07:59:17.005Z",
"phase": "play",
"pos": {
"x": -684,
"y": -1384
},
"timeS": 31.8,
"score": 21,
"hp": 100,
"enemies": 7,
"level": 1,
"expectedScreen": {
"camX": -780,
"camY": -1480,
"sx": 96,
"sy": 96
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 2866,
"total": 47190,
"ratio": 0.061
}
},
{
"name": "05-arena-edge-bottom.png",
"desc": "下边缘:玩家贴下界(y≈1384),下岩壁自然暗角",
"sha256": "8a6c88785457b2412ec70a29f819b063c4c74bace764fd811c9ce4e1bae07936",
"bytes": 1181703,
"utc": "2026-07-25T07:59:17.578Z",
"phase": "play",
"pos": {
"x": -684,
"y": 1384
},
"timeS": 55,
"score": 39,
"hp": 100,
"enemies": 16,
"level": 2,
"expectedScreen": {
"camX": -780,
"camY": 636,
"sx": 96,
"sy": 748
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 2323,
"total": 47190,
"ratio": 0.049
}
},
{
"name": "06-arena-corner-br.png",
"desc": "右下角:同时贴右+下界,两面自然暗角 + 角落收口",
"sha256": "0235e318787b20ceb1d04dbaa3b83e21c8f18c511f898fd44d8b016872329f7c",
"bytes": 1349184,
"utc": "2026-07-25T07:59:18.118Z",
"phase": "play",
"pos": {
"x": 684,
"y": 1384
},
"timeS": 72,
"score": 63,
"hp": 96,
"enemies": 36,
"level": 2,
"expectedScreen": {
"camX": 390,
"camY": 636,
"sx": 294,
"sy": 748
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 4973,
"total": 47190,
"ratio": 0.105
}
}
],
"boot": {
"ok": true
},
"arenaBgAssetProbe": "ready 1560x2960",
"startState": {
"phase": "play",
"pos": {
"x": 0,
"y": 0
}
},
"pageErrors": [],
"consoleErrors": [
"2026-07-25T07:59:13.060Z [error] Failed to load resource: the server responded with a status of 404 (File not found)",
"2026-07-25T07:59:15.171Z [warning] Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently",
"2026-07-25T07:59:15.592Z [warning] Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently",
"2026-07-25T07:59:16.072Z [warning] Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently",
"2026-07-25T07:59:16.705Z [warning] Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently",
"2026-07-25T07:59:17.269Z [warning] Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently",
"2026-07-25T07:59:17.778Z [warning] Canvas2D: Multiple readback operations using getImageData are faster with the willReadFrequently attribute set to true. See: https://html.spec.whatwg.org/multipage/canvas.html#concept-canvas-will-read-frequently"
]
}