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

225 lines
6.6 KiB
JSON

{
"checkpoint": "round-11 竞技场边界 + 接大图 bg-map1-arena-01 + CDP 截实际效果",
"utc": "2026-07-25T06:40:50.500Z",
"machine": "lili-mac.local(开发机,非 mini-desktop)",
"node": "v22.22.3",
"url": "http://127.0.0.1:4517/?engine=stub&mode=evidence&seed=777",
"dpr": 2,
"viewport": {
"w": 390,
"h": 844
},
"arena": {
"w": 1560,
"h": 2960
},
"collector": "/tmp/arena-e2e.mjs(临时脚本,置 /tmp 不入仓)",
"shots": [
{
"name": "01-arena-center-panorama.png",
"desc": "全景:玩家场心(0,0),镜头居中,竞技场整幅背景中心区",
"sha256": "8d3f74d92ff0161167ad2d2e5dc51d41c50024028001edd4bfd5e0082b943f21",
"bytes": 1717505,
"utc": "2026-07-25T06:41:00.803Z",
"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≈768),镜头clamp,玩家屏内偏右+右岩壁压边",
"sha256": "448552645aaeb73ee98db14c0fb9d2dd35c0a13155c517380502a423d1c4e4ce",
"bytes": 1343707,
"utc": "2026-07-25T06:41:01.213Z",
"phase": "play",
"pos": {
"x": 768,
"y": 0
},
"timeS": 8.7,
"score": 4,
"hp": 100,
"enemies": 3,
"level": 1,
"expectedScreen": {
"camX": 390,
"camY": -422,
"sx": 378,
"sy": 422
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 11469,
"total": 47190,
"ratio": 0.243
}
},
{
"name": "03-arena-edge-top.png",
"desc": "上边缘:玩家贴上界(y≈-1468),上岩壁压边",
"sha256": "0a5299271de8c2c6c4039d023b56c1956130f00332812054950f7a62674f97a1",
"bytes": 1122250,
"utc": "2026-07-25T06:41:01.760Z",
"phase": "play",
"pos": {
"x": 768,
"y": -1468
},
"timeS": 21.7,
"score": 14,
"hp": 100,
"enemies": 5,
"level": 2,
"expectedScreen": {
"camX": 390,
"camY": -1480,
"sx": 378,
"sy": 12
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 2525,
"total": 47190,
"ratio": 0.054
}
},
{
"name": "04-arena-edge-left.png",
"desc": "左边缘:玩家贴左界(x≈-768),左岩壁压边",
"sha256": "5401057127be6519615fbea21f6f8258865f15783783782a1e153081920eb7ef",
"bytes": 1066428,
"utc": "2026-07-25T06:41:02.307Z",
"phase": "play",
"pos": {
"x": -768,
"y": -1468
},
"timeS": 34.8,
"score": 24,
"hp": 100,
"enemies": 7,
"level": 2,
"expectedScreen": {
"camX": -780,
"camY": -1480,
"sx": 12,
"sy": 12
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 2663,
"total": 47190,
"ratio": 0.056
}
},
{
"name": "05-arena-edge-bottom.png",
"desc": "下边缘:玩家贴下界(y≈1468),下岩壁压边",
"sha256": "5a4a97f58def0e323cbf0aecad2a56fa97b962cbe1a52acde5bc05032a9b99bd",
"bytes": 1127024,
"utc": "2026-07-25T06:41:02.852Z",
"phase": "play",
"pos": {
"x": -768,
"y": 1468
},
"timeS": 59.9,
"score": 42,
"hp": 100,
"enemies": 20,
"level": 2,
"expectedScreen": {
"camX": -780,
"camY": 636,
"sx": 12,
"sy": 832
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 2412,
"total": 47190,
"ratio": 0.051
}
},
{
"name": "06-arena-corner-br.png",
"desc": "右下角:同时贴右+下界,两面岩壁 + 角落暗角收口",
"sha256": "2cb36e2838df4953f6e4fbd9d2a2c783a79ad32e013db31c1b47aafdbe681d51",
"bytes": 1365807,
"utc": "2026-07-25T06:41:03.415Z",
"phase": "play",
"pos": {
"x": 768,
"y": 1468
},
"timeS": 78.4,
"score": 56,
"hp": 64,
"enemies": 52,
"level": 3,
"expectedScreen": {
"camX": 390,
"camY": 636,
"sx": 378,
"sy": 832
},
"brightness": {
"ok": true,
"width": 780,
"height": 1688,
"bright": 5774,
"total": 47190,
"ratio": 0.122
}
}
],
"boot": {
"ok": true
},
"arenaBgAssetProbe": "ready 1560x2960",
"startState": {
"phase": "play",
"pos": {
"x": 0,
"y": 0
}
},
"pageErrors": [],
"consoleErrors": [
"2026-07-25T06:40:58.330Z [error] Failed to load resource: the server responded with a status of 404 (File not found)",
"2026-07-25T06:41:00.436Z [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-25T06:41:00.897Z [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-25T06:41:01.371Z [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-25T06:41:02.006Z [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-25T06:41:02.549Z [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-25T06:41:03.087Z [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"
]
}