鼠标悬停建筑时绘制蓝色半透明高亮
昨天 17:09综合
我:鼠标悬停建筑时没看到建筑绘制蓝色半透明高亮,而是地形蓝色高亮。是因为识别不出建筑外轮廓吗。因为图都是素材库的,都有它的图尺寸(长方形),能否把这个图尺寸外框作为高亮区域
嗒:
获取精灵实际尺寸 — 建筑渲染时已经有纹理和绘制位置,从中拿到图片的像素宽高
命中检测 — 鼠标位置与精灵在内容空间的绘制矩形做碰撞判断(不再依赖网格 row/col)
高亮绘制 — 直接沿精灵矩形画边框,和建筑图片完全贴合
这样玩家鼠标移到建筑图片的任意可见部分都能触发高亮,高亮框也精确包裹图片轮廓,不会多出空白区域。
需要我去读一下 _RenderBuildings 的精灵绘制逻辑,确认图片位置和尺寸的计算方式,然后开始实现吗?
基于精灵图片矩形实现屏幕空间命中检测
建筑精灵渲染时经过了:平移到中心 → 反向旋转 → 反向 iso 缩放 → 以 drawSize 绘制。命中检测需要在同一坐标空间做。最简单的方式是:对每个建筑,计算精灵四角的屏幕坐标,然后用鼠标屏幕坐标做 AABB 碰撞。
新增一个辅助方法 _GetBuildingSpriteRect 用于计算精灵在屏幕上的矩形。
更简洁的方案:在 Init 中保存 nvg 引用——但 nvg 在 Render 调用前可能不可用。最可靠的方案是在 Render 中缓存。
已经有 lastScreenX_ / lastScreenY_ 存储鼠标位置了。最佳方案:在 Render 中做 select 工具的命中检测(此时 nvg 可用),利用缓存的鼠标位置。
把 OnPointerMove 中的 select 工具命中检测去掉,改到 Render 中,在 _RenderBuildingHighlight 调用之前。
重写高亮绘制,改为基于精灵屏幕矩形画边框
高亮需要在屏幕空间绘制(精灵经过反旋转+反iso,不在内容坐标系里),所以应该在 nvgRestore 之后、拆除气泡之前画。先调整 Render 中的调用位置。
还有一个一致性问题:_RenderBuildings 目前用 drawSize × drawSize 正方形绘制建筑图片,但 _GetBuildingSpriteScreenRect 我用了图片宽高比计算矩形。需要让两者一致。既然用户要用图片真实矩形,我应该同时更新渲染代码。
建筑命中检测 — 改为屏幕空间矩形检测,基于建筑精灵的实际图片尺寸(宽高比)
建筑高亮边框 — 在屏幕空间绘制蓝色半透明矩形,贴合建筑图片轮廓
建筑渲染一致性 — _RenderBuildings 和 _RenderBuildingBlueprint 也已更新为按图片宽高比绘制,不再是正方形



