下载 App
:
改动清单
CollisionMap.lua:
构造函数新增 self.wallStrips = {} 数组
Rebuild() 步骤 4 从网格阻挡改为门槛条:遍历 GetWallGroups() 按砖块跨度计算宽度,有柱子时加 PILLAR_VIS_W
新增 RebuildWallStrips() 方法(增量更新,添砖/装柱后调用)
IsAreaBlocked() 新增段落 C 检测 wallStrips
_IsInAnyStrip() 新增 wallStrips 循环(防 Q/E 旋转卡住)
删除旧的 MarkWallBlocked() 方法
main.lua:3 处 MarkWallBlocked() 调用全部替换为 RebuildWallStrips()
MapCanvas.lua:新增绿色调试可视化,渲染留言墙门槛条(与建筑的蓝色区分)
宽度计算逻辑
halfW = (maxBX - minBX + 1) * 16 / 2
如果 pillarsInstalled:
halfW += 48 * 0.32 (≈15.36)
1 砖 → halfW=8
3 砖 → halfW=24
6 砖 → halfW=48
6 砖+柱子 → halfW≈63
可以预览看看绿色门槛条的位置是否和砖墙对齐。
:
构建成功。修改总结:
根本原因:之前 cy - 20 是在内容坐标 Y 轴方向偏移的,但建筑图片是反旋转后始终朝屏幕上方的。地图旋转后内容 Y 轴 ≠ 屏幕上方,导致偏移方向跟着歪了。
修复方式:
strip 存储:回到网格底边锚点,不加任何偏移
碰撞检测(CollisionMap):用 (sin(rot), -cos(rot)) 把 20px 偏移沿"屏幕上方"方向投影到内容坐标
debug 渲染(MapCanvas):先 nvgRotate(-mapRot) 反旋转回屏幕方向,再 nvgTranslate(0, -20) 在屏幕 Y 轴上移
这样无论 Q/E 旋转到什么角度,门槛条都始终贴着建筑的视觉底边。预览看看效果。
:
掉落物深度排序修复
问题根因:MapCanvas 的渲染分两个阶段:
_RenderBuildings — 建筑和树木统一按行号(sortRow)深度排序,远处先画、近处后画
_RenderNPCs — 角色和掉落物,没有排序,且在建筑/树木之后绘制
这导致所有掉落物无条件画在所有树木上面,不管掉落物实际上在哪棵树的前面还是后面。
修复方案:将掉落物纳入 _RenderBuildings 的统一深度排序:
_RenderBuildings 新增第 3 步:收集 _isDrop 标记的 NPC,根据 content 坐标 cy / ts + 1 计算 sortRow,与建筑/树木一起排序
新增 _RenderOneDrop 方法:处理掉落物的坐标变换和 renderFunc 调用
_RenderNPCs 增加 npc._isDrop 跳过判断,避免重复渲染
现在掉落物会和树木按同一深度轴排序,后方树木掉出的木头会被前方树木正确遮挡,Q/E 旋转后也不会出现"木头跑到树冠上"的视觉错误。
:
现在我理解了"弹窗三次"的原因。流程是:
用户点击集市 → ShowModal() 打开弹窗 → 发送 requestMarketStock_()(第1次弹窗)
服务端收到 MARKET_STOCK_REQ → 发送 MARKET_STOCK_UPD → Client 回调 → OnMarketStockUpdate → 关闭旧弹窗 → 重建新弹窗(第2次弹窗)
但用户说是 3 次…让我检查 OnBuyResult 和 OnSellResult 是否也在买卖后重新打开了弹窗。
实际上不是,买卖成功后 Close() 了。
问题可能是这样:ShowModal 被调用时,Close() 旧弹窗 → 创建新弹窗,这个"关闭-打开"的过程就像弹窗"闪烁"。加上首次打开 + stock 更新重建,用户看到的效果就是弹窗打开、闪了一下重建。
根本解决方案:stock 更新时不重建整个弹窗,而是只更新库存标签文本。但这需要较大重构。
更简单的方案:stock 更新响应后不重建弹窗,因为首次打开弹窗时可以用 getMarketStock_() 获取缓存的库存(如果有的话)。stock 请求只是刷新缓存,但不需要实时重建弹窗——用户的买卖操作已经通过买入/卖出结果回调来处理了。
修复 2:集市弹窗连续弹出 — 根因是 stock 请求响应后 OnMarketStockUpdate 会关闭并重建整个弹窗,导致视觉上"闪烁"。改造为:
新增 stockLabels_ 引用表,BuildBuyRow 创建库存标签时注册进去
OnMarketStockUpdate 不再重建弹窗,而是通过 label:SetText(...) 原地更新库存数字
移除了 activeModalArgs_、rebuildingFromStockUpdate_ 等不再需要的死循环防护代码
:
修改总结:
问题根因:掉落物的下落动画在内容坐标系中操作 Y 坐标(currentY = originY - FALL_HEIGHT),但在等距视角(isometric)下,内容坐标 Y 的偏移会被旋转+压缩变换成屏幕上的对角线方向移动,导致木头看起来是"从旁边飘进来"而不是"从上往下掉"。
修复方案:
分离内容坐标与视觉高度:新增 visualHeight 属性,独立于内容坐标
内容坐标只做水平插值:currentX/currentY 从树中心平滑移动到散落终点,不再包含竖直偏移
使用 renderFunc 施加屏幕空间偏移:在 counter-rotation + undo-ISO 变换之后,通过 yOff = -visualHeight 将精灵向上偏移。这样下落动画就是在屏幕空间中垂直方向的移动,视觉上就是"从树冠正上方往下掉"
弹跳也改为屏幕空间:落地后的小弹跳同样通过 visualHeight 实现



