图像与设计
用双网格 15 片图集渲染俯视角地形时如何做掩码映射与绘制
在游戏引擎或自定义渲染器中,把 SpriteCook 的 4x4 15 片俯视角图集通过双网格自动拼接方式渲染成连续地形。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用双网格 15 片图集渲染俯视角地形时如特定
解决思路
- 把地形存为逻辑绘制的格子(logical painted cells),渲染时在逻辑格子之间绘制可见瓦片,每个可见瓦片由它周围的四个逻辑格子决定。
- 对每个可见瓦片采样四个逻辑格子:左上、右上、左下、右下。
- 按 SpriteCook 当前掩码位顺序构造 4 位掩码:若左上已填充则 mask |= 1;若右上已填充则 mask |= 2;若左下已填充则 mask |= 4;若右下已填充则 mask |= 8。
- mask 为 0 时不渲染任何内容;其他 mask 通过查找表 frameByMask = [-1, 15, 8, 9, 0, 11, 14, 7, 13, 4, 1, 10, 3, 2, 5, 6] 映射到 4x4 图集帧。
- 由帧号计算图集单元:frame = frameByMask[mask];若 frame < 0 则返回 null;atlasColumn = frame % 4;atlasRow = Math.floor(frame / 4)。
- 实现 isFilled 辅助函数:检查 x、y 在 [0, columns) 与 [0, rows) 范围内且 cells[y * columns + x] === true。
- 实现 dualGridMask 函数:对给定可见瓦片坐标 (x, y),用 isFilled 检查 (x-1,y-1)、(x,y-1)、(x-1,y)、(x,y) 四个逻辑格子并按位或累加 mask。
- 实现 atlasCellForMask 函数:把 mask 夹取到 0..15 后查 frameByMask,frame < 0 返回 null,否则返回 { column: frame % 4, row: Math.floor(frame / 4) }。
- 渲染循环从 y = 0 到 y <= rows、x = 0 到 x <= columns(比逻辑地图多一行一列),对每个位置计算 mask 与图集单元,跳过 null,然后用 ctx.drawImage 从 atlasImage 的 (column * tileSize, row * tileSize) 取 tileSize×tileSize 画到 (x * tileSize, y * tileSize)。
- 渲染的瓦片列数和行数要比逻辑地图尺寸多一,因为可见瓦片围绕在已绘制的逻辑格子周围。
- 像素画要关闭平滑(smoothing),使用最近邻缩放。
- 把 mask 15 视为已填充的内部瓦片,mask 0 视为透明/不绘制。
- 严格把生成的图集当作 4x4 等大瓦片单元的网格来使用。
- 不要把这个图集重新解释为普通的 8 邻接 blob tileset;该映射专用于 SpriteCook 的双网格 15 片布局。
适用边界 · 注意事项
- 需要生成图集时不要用本技能,应使用 spritecook-generate-tilesets。
- 不要把它当作普通 8 邻接 blob tileset 来解析或映射。
- mask 为 0 时不要绘制任何瓦片。