耳内有灰:
问题原因:拆除屋檐/柱子时调用的是旧版全局方法 mapData:UninstallRoof(),它只检查已弃用的 self.roofInstalled 全局字段。而实际屋檐数据存储在 wallParts[wk].roofInstalled 中。修复:从 piece.data.wallKey 解析出 anchorRow, anchorCol,改为调用 mapData:UninstallWallParts(row, col),这个方法会正确清除对应墙段的 pillarsInstalled 和 roofInstalled。
:
分析两个核心 bug:Bug 1 - 加载界面不显示:beginPreloading() 的"快速路径"调用 PreloadOne() 时,实际执行了加载(不是仅检查缓存),所以 15 个纹理全部同步加载完,allCached=true,直接跳到 setupGameUI(),跳过了加载界面。Bug 2 - 预加载无效,地图仍然渐进加载:预加载用的 NVG 上下文来自 ImageCache.GetContext(),但当 MapCanvas:Render(nvg) 被调用时,它传入的 nvg 参数再次调用 TerrainRegistry.SetNVG(nvg) — 如果这两个 nvg 的 Lua userdata 身份不同(即使指向同一个底层对象),nvg_ ~= nvg 判断为 true,整个 texCache_ 被清空!解决方案:移除快速路径,添加一个仅检查缓存的方法(不加载)不在 beginPreloading 中设置 NVG 上下文,而是让预加载在 HandleUpdate 中进行,并确保使用的 NVG 上下文与 MapCanvas 后续使用的完全相同但根本问题是:我们无法保证 ImageCache.GetContext() 返回的 userdata 与 Widget Render(nvg) 回调中的 nvg 是同一个 Lua 对象引用。让我先验证这一点。
:
修改总结:问题根因:掉落物的下落动画在内容坐标系中操作 Y 坐标(currentY = originY - FALL_HEIGHT),但在等距视角(isometric)下,内容坐标 Y 的偏移会被旋转+压缩变换成屏幕上的对角线方向移动,导致木头看起来是"从旁边飘进来"而不是"从上往下掉"。修复方案:分离内容坐标与视觉高度:新增 visualHeight 属性,独立于内容坐标内容坐标只做水平插值:currentX/currentY 从树中心平滑移动到散落终点,不再包含竖直偏移使用 renderFunc 施加屏幕空间偏移:在 counter-rotation + undo-ISO 变换之后,通过 yOff = -visualHeight 将精灵向上偏移。这样下落动画就是在屏幕空间中垂直方向的移动,视觉上就是"从树冠正上方往下掉"弹跳也改为屏幕空间:落地后的小弹跳同样通过 visualHeight 实现
:
掉落物深度排序修复问题根因:MapCanvas 的渲染分两个阶段:_RenderBuildings — 建筑和树木统一按行号(sortRow)深度排序,远处先画、近处后画_RenderNPCs — 角色和掉落物,没有排序,且在建筑/树木之后绘制这导致所有掉落物无条件画在所有树木上面,不管掉落物实际上在哪棵树的前面还是后面。修复方案:将掉落物纳入 _RenderBuildings 的统一深度排序:_RenderBuildings 新增第 3 步:收集 _isDrop 标记的 NPC,根据 content 坐标 cy / ts + 1 计算 sortRow,与建筑/树木一起排序新增 _RenderOneDrop 方法:处理掉落物的坐标变换和 renderFunc 调用_RenderNPCs 增加 npc._isDrop 跳过判断,避免重复渲染现在掉落物会和树木按同一深度轴排序,后方树木掉出的木头会被前方树木正确遮挡,Q/E 旋转后也不会出现"木头跑到树冠上"的视觉错误。







