[功能] 绘制对象层:火把/火盆、木桶/木箱/篮子/箱子、尸体、武器架、传送点…(数据已进包,只差解码与绘制) #5
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象
62 张烘焙地图上一个对象都没有画出来。城镇里看不到火把与火盆,地下城里看不到木桶/木箱/篮子/箱子/尸体/武器架/传送点;HUD 里的"对象 N"只是一个计数(
src/scene/act-scene.ts:401/540/772/882)。现状数据(全部来自仓库自带的
samples/d2-packs/*/*/scene.json)TA= "Dummy-invisible town sound" 隐形音效点),17 个是 NPC/怪物基址(见 #6)stats.objectsArtPendingobjectPagesframe每个对象的"位置 + 元数据"其实都已经进包了,字段现成可用:
出现的对象类型(按数量,节选):
etorch2|6E236、torch1|3M57、etorch1|6D58、torch2|3N39、torch1|5R/5S各 32、icecave_torch1/2各 1;fire|FX/FY/FZ/RB132;chest|*40+、basket|XP14、Barrel|B110、Crate|CT2、Casket|VB67、jar1|6I30、evilurn4;WeaponRack|W1/W211、ArmorStand|A3/A48;RogueCorpse/corpse/dead body/skeleton/wirt's body;Waypoint|*12、Shrine|*、groundtomb40、bank|B633、hellgate|6P32。排查:为什么没画出来
scripts/pack-act-assets.ts:470-525的对象循环里:resolveDs1Object→pickObjectMember→ 只记member/alternatives与计数,const objectPages = new PageBuilder(palette)建出来后从未 add 任何帧,于是objectPages.encode(0)返回空数组,objectsArtPending: objects.length把所有对象都标成待接。这里就是接入点。src/scene/act-scene.ts里objects只用于 HUD 计数;map.html沙盒同理。绘制需要:member→ 解 DCC → 首帧 → 按锚点定位 → 按depth插进画家序。src/game/objects.ts:objectCofMember(DATA\GLOBAL\OBJECTS\<TOKEN>\COF\<TOKEN><MODE>hth.COF)、objectSpriteMember(<TOKEN>\<COMPONENT>\<token><component>lit<mode>hth.dcc)、resolveObjectArt、objectAnchor/objectDrawAnchor(锚点 =DUNGEON_GameToClientSubtileDrawPositionCoords);scripts/verify-dcc.ts已经在真归档上解过对象 COF+DCC(OBJECT_DCCS/OBJECT_COFS,含data\global\objects\l2\...);src/game/character.ts的 COF+DCC 合成、src/render/atlas.ts的图集、src/game/animation.ts的ActorAnimator都可直接复用。depth = (x+y)/5就是等距深度键,前端按它插进runtime.walls的画家序即可(act-scene.ts里已有同款depthInsertIndex)。火把/箱子/桶这类要按深度插;平铺在地面的对象(如果有)应放在地面层。data\global\palette\Units\pal.dat(归档里确实有这个成员,data\global\palette\Units\pal.dat),而当前页面把角色画在 act 调色板上(loadCharacterArt收的是runtime.palette)。接对象层时先确认用哪套,否则颜色会偏。NU1587 /OP542 /ON327 /S14 /S22;火把燃烧、传送点旋转这类需要按 25Hz tick 推帧(ActorAnimator可复用)。alternatives分布 3/6/8/4/… 是同一 style 下的美术变体数,决定了"同一 token 有多套图"。hp(已进包)与状态机,建议另开 issue,本 issue 只到"画出来 + 动画"。建议的落地顺序
member解 DCC → 取首帧 →objectDrawAnchor定位 → 按depth插入画家序;同时把美术烘进包(复用PageBuilder,输出objects-*.png+ 每对象的 frame 索引/偏移,页面首屏只加载视口需要的页);OP/ON模式的差异要按Objects.txt(src/game/objects.ts的ObjectsRow)驱动;alternatives的选图规则(按 level seed + 位置,与瓦片RarityFrameIndex的加权随机同一套思路);验收建议
verify:packs增加"对象绘制条目"的逐项比对(帧、位置、深度次序),与现有"包 vs 现读现解"同口径;scripts/browser/checks/增加一条断言:进入城镇/地下城后对象绘制数 > 0(现有 5 个检查脚本已有同款模式);(关联:NPC 另见 #6;对象层的朝向依赖 #3 的方向口径。)
Issue #5 解决报告:对象层美术解码、图集打包与场景深度排序绘制完成
1. 根本原因排查
scripts/pack-act-assets.ts):resolveDs1Object/pickObjectMember匹配出 2379 个美术成员路径,但未对 DCC/DC6 文件调用解码器提取像素数据;objectPages = new PageBuilder(palette)实例化后未加入任何帧,最终生成空图集[],导致所有对象的frame为null,并将全部 2462 个对象标记为objectsArtPending。src/game/object-lookup-data.ts):src/scene/act-scene.ts):scene.objectPages的纹理加载;(subX + subY) / 5,与墙体深度cellX + cellY线性尺度一致,未按该尺度排序混合绘制;renderer.deleteAtlas,存在图集显存泄露隐患。2. 核心架构与修改实现
src/game/object-lookup-data.ts):342:1Y:ON);tr),按.dcc>.dc6规则挑选第一帧。scripts/pack-act-assets.ts):decodedMemberCache,62 张地图去重解码 DCC/DC6,显著加快烘焙速度;objects-*.png;offsetX = -16 + dir.box.left,offsetY = 16 + dir.box.topoffsetX = -16 + f.offsetX,offsetY = 16 + (f.offsetY - f.height + 1)frame字段,并将objectsArtPending准确清零(0 待接)。src/scene/act-scene.ts):PackObjectFrame/ObjectDrawable类型,扩展MapRuntime支持对象层;loadPages异步载入所有scene.objectPages并登记到 WebGL 渲染器;runScene实现单趟双指针深度遍历drawUpToDepth(maxDepth):将runtime.walls与runtime.objectDrawables严格按深度交织排序,先画角色后方物体与墙体,再画角色与随从,后画遮挡前景物体与屋顶;beforeunload生命周期完整释放runtime.objectPages纹理显存;scripts/verify-packs.ts:增加对全部 62 张地图objectPages存在性、尺寸有效性、帧边界以及pendingArt === 0的强一致性断言,1302/1302 个断言全部通过;scripts/verify-object-lookup.ts:更新 3615 条记录验证与红门抽检,20/20 项测试通过;scripts/verify-renderer.ts:26/26 渲染器单元测试通过;npm run typecheck&npm run build:0 错误 0 告警顺利编译。3. 提交与同步
diablo2-web主干:72731bb与9475886;objects-*.png与全新scene.json)已同步至diablo2-web-assets主干:20fd786。