留言墙的碰撞体积门槛条

05/11攻略
数据分析
从代码中得到的关键信息:
参数 值 说明
BRICK_DRAW_W 16px 单块砖在反旋转坐标中的宽度
BRICK_DRAW_H 8px 单块砖高度
MAX_BRICKS_PER_ROW 6 每行最多 6 砖
bx 坐标 0 为锚点中心,-1 左移一砖,+1 右移一砖 砖的水平逻辑坐标
柱子宽度 pillarW = 48, pillarVisibleW = pillarW * PILLAR_VISIBLE_W_RATIO 固定宽度
墙锚点 格子中心 (anchorCol-1)*ts + ts*0.5, (anchorRow-1)*ts + ts*0.5 与建筑锚点不同(建筑是底边中心)
砖墙宽度(反旋转坐标中):
6 砖满排:bx 范围 -2.5 ~ +2.5(对称排列时),宽度 = (maxBX - minBX + 1) * 16 = 6 * 16 = 96px
3 砖:宽度 = 3 * 16 = 48px
1 砖:宽度 = 1 * 16 = 16px
设计方案
砖墙门槛条与建筑门槛条的核心区别:
锚点:砖墙锚点是格子中心(不是底边中心)
宽度可变:取决于底层砖块数量和是否有柱子
尺寸单位:砖块宽高是反旋转坐标的像素值,而门槛条的 halfW/halfH 是内容空间的距离值
门槛条宽度计算规则
取底层 (by=0) 的砖块,计算 minBX 和 maxBX:
brickWidth = (maxBX - minBX + 1) * BRICK_DRAW_W
如果有柱子 (pillarsInstalled=true):
    strip.halfW = 从 leftPillarX 到 rightPillarX+pillarW 的一半
    // 即 lo.wallLeftLX - pillarVisibleW*0.5 到 lo.wallRightLX + pillarVisibleW*0.5
    // 简化:halfW = brickWidth/2 + pillarVisibleW
否则:
    strip.halfW = brickWidth / 2
但这里有个换算问题——砖块的尺寸是在反旋转坐标下的像素值(BRICK_DRAW_W=16),而门槛条的 halfW 是在内容空间(地图坐标)中的距离。需要确认两者的比例关系。
让我检查建筑门槛条中 halfW 的含义和单位。
留言墙门槛条设计方案
关键换算
砖块的尺寸 (BRICK_DRAW_W=16px) 是在反旋转坐标系中的值。而门槛条的 halfW/halfH 是在内容坐标系(地图坐标)中的值。两者的关系:
反旋转坐标 = 内容坐标经过 nvgRotate(-rot) + nvgScale(1, 1/isoScaleY) 变换后的坐标
反旋转坐标中的水平距离 = 内容坐标中的水平距离(旋转不改变距离大小,只改变方向)
所以 BRICK_DRAW_W 在内容空间中也是 16 像素的距离(方向不同,但碰撞投影会处理方向)
由于门槛条的投影检测已经将内容坐标投影到 (cosR, -sinR) 方向(即屏幕水平方向 = 砖块的水平方向),反旋转坐标中的宽度值可以直接用作 halfW。
方案
锚点:格子中心 ((anchorCol-1)*ts + ts*0.5, (anchorRow-1)*ts + ts*0.5)
宽度计算(根据底层砖块和柱子状态):
情况 halfW 计算 示例
有柱子 + 满6砖 (maxBX-minBX+1)*16/2 + pillarVisibleW 6*16/2 + 48*0.32 ≈ 48 + 15.36 ≈ 63
无柱子 + N块砖 (maxBX-minBX+1)*16/2 3砖: 3*16/2 = 24; 1砖: 1*16/2 = 8
有柱子 + 不满6砖 以实际砖块范围为准 + 柱子可见宽 按实际 minBX/maxBX
高度(halfH):与建筑相同 = 40
屏幕上方偏移(STRIP_SCREEN_UP):砖墙渲染锚点是格子中心(不像建筑在底边),门槛条应该在砖墙底部前方。砖墙底砖 by=0 的底边在反旋转坐标中是 +bh*0.5 = +4,换算到内容空间等效偏移量较小。但考虑到视觉效果,建议也用 STRIP_SCREEN_UP = 40 统一处理。
简化方案(推荐)
底层不满 6 砖时,直接用 GetWallGroups() 返回的 minBX / maxBX 计算宽度,不需要特殊处理:
brickSpan = (maxBX - minBX + 1) * BRICK_DRAW_W
halfW = brickSpan / 2
if pillarsInstalled:
    halfW = halfW + pillarVisibleW   -- pillarVisibleW = 48 * 0.32 = 15.36
这样做的好处:
1 块砖 → 窄条(halfW=8),玩家几乎可以绕过
3 块砖 → 中等宽度(halfW=24)
6 块砖 → 满宽(halfW=48)
6 块砖 + 柱子 → 最宽(halfW≈63)
效果自然:砖越多墙越宽,碰撞区域和视觉一致。
需要我现在实现这个方案吗?具体要做的改动是:
CollisionMap:Rebuild() 中新增 wallStrips 数组,遍历 GetWallGroups() 构建砖墙门槛条
IsAreaBlocked() 和 _IsInAnyStrip() 中加入对 wallStrips 的检测(逻辑与 buildingStrips 相同)
MapCanvas debug 渲染中增加砖墙门槛条的蓝色可视化
增量接口 MarkWallStripBlocked() 支持添砖后动态更新
1
3