地图:物品动态效果 #387
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?
1. 问题现状与视觉缺陷分析
在当前 Web 版场景(例如罗格营地 Act 1 Town
towne1)中:RB)、立式火炬(TorchTO)、罗格营地旗帜(BannersN1/N2)、传送点(WaypointWP)等全部静止不动,画面缺少暗黑 2 原版活灵活现的火光与环境氛围。scripts/pack-act-assets.ts)存在首帧截断:f = dir?.frames[0]),丢弃了后续全部帧。scene.json中每个PackObject仅记录单一静态的frame: { page, x, y, width, height, offsetX, offsetY }。objects-0.png仅包含了单张首帧切片(整张图集仅 21KB)。src/scene/act-scene.ts)缺少帧状态推进:ObjectDrawable接口仅保留静态单一frame: AtlasFrame,未建立类似 DT1 地块瓦片(animatedFrames)的动画切帧与时钟推进逻辑,导致物件永远固定在第 0 帧。2. 暗黑破坏神 2 v1.13c 原版规范(Ground Truth Invariant)
严格对齐 D2 v1.13c 反编译汇编(
D2Common.dllordinals#10350,#10374/ 0x6FDBEC10UNITS_ChangeAnimMode)与数据表Objects.txt、AnimData.d2:2.1 实体类型与动画模式(Mode)
UNIT_OBJECT(Type 2)。src/game/object-lookup-data.ts定义):RB: Mode 2 (ON),Objects.txtId 39 (rbtrlitonhth.dcc)。TO: Mode 2 (ON),Objects.txtId 37 (totrlitonhth.dcc)。N1/N2: Mode 0 (NU),Objects.txtId 35/36 (N1trlitnuhth.dcc/N2trlitnuhth.dcc)。WP: Mode 2 (ON),Objects.txtId 119 (wptrlitonhth.dcc)。B6: Mode 0 (NU),Objects.txtId 267 (b6trlitnuhth.dcc,静态 1 帧)。2.2 总帧数与播放速率公式(FrameCnt & FrameDelta)
Objects.txt权威定义了各模式的帧数与播放速率:RB(Mode 2 ON):FrameCnt2 = 20,FrameDelta2 = 256,CycleAnim2 = 1。DCC 对应 20 帧,播放速率 256/256 = 1.0 帧/tick(25Hz 下为 25 FPS,即 40ms/帧)。TO(Mode 2 ON):FrameCnt2 = 20,FrameDelta2 = 200,CycleAnim2 = 1。DCC 对应 20 帧,播放速率 200/256 ≈ 0.78125 帧/tick(25Hz 下约为 19.53 FPS,即 51.2ms/帧)。N1/N2(Mode 0 NU):FrameCnt0 = 10,FrameDelta0 = 256,CycleAnim0 = 1。2.3 去同步与高熵相位扰动(Desynchronization & Phase Jitter)
D2Common.0x6FDBEC10:对于无同步标记的物件(!pObjectsTxtRecord->nSync),会引入微扰速度:wAnimSpeed = uRandom + wFrameDelta - (wFrameDelta / 16),其中uRandom = roll(wFrameDelta / 8)。3. 技术架���与实现方案
3.1 离线资产烘焙管线升级(
scripts/pack-act-assets.ts)frameCount。frameCount > 1且对象具备循环动画属性(cycleAnim === 1):frameCount - 1帧写入objectPages(图集)。offsetX = -16 + dir.box.left,offsetY = 16 + dir.box.top。offsetX = -16 + f.offsetX,offsetY = 16 + (f.offsetY - f.height + 1)。placementByMember级别的缓存机制:营地内全部 12 根火炬复用同一套 20 帧切片。scene.json):PackObject增加animatedFrames与动画时钟元数据:3.2 运行时场景与渲染对接(
src/scene/act-scene.ts)ObjectDrawable扩展:(x, y)注入确定的初始相位偏移phaseOffsetMs,使多根火炬交错燃烧。depth)与批处理状态不变。4. 验收标准与验证方案
RB)具有 20 帧火焰跃动与火舌升腾动画。TO)具有 20 帧火焰摇曳动态,且各火炬间具有自然的交错相位,无机械同步感。N1/N2)呈现 10 帧随风飘拂效果;传送点(WaypointWP)处于激活运转状态。B6)、石块、死树等无动画物件保持单帧轻量存储,不产生额外图集与计算开销。(offsetX, offsetY)精确对齐底部中心基准点,动画播放过程中无抖动、漂移或脚���断层现象。tests/object-animation-113c.test.ts:towne1场景导出的动态物件帧数与Objects.txt完全一致。frameDurationMs)与原版FrameDelta(200 / 256)数学换算吻合。npm run typecheck与npm test100% 通过。