据我所知,所有基于图块的地图编辑器都会导出一个包含一维数组的 JSON 对象。虽然大多数寻路库/教程仅提供给二维数组。
另外,例如,如果我想在这个一维数组中进行寻路并且这个数组很大,我猜这会导致性能问题。
那么为什么大多数基于图块的地图编辑器输出一维,我应该如何处理那些关于寻路的问题?
只需google寻路即可找到所有二维寻路教程
据我所知,所有基于图块的地图编辑器都会导出一个包含一维数组的 JSON 对象。虽然大多数寻路库/教程仅提供给二维数组。
另外,例如,如果我想在这个一维数组中进行寻路并且这个数组很大,我猜这会导致性能问题。
那么为什么大多数基于图块的地图编辑器输出一维,我应该如何处理那些关于寻路的问题?
只需google寻路即可找到所有二维寻路教程
取决于将其转换为一维数组的方向;
function convert(x, y, height, width) {
return x + y * width; // rows
/* return y + x * height; // cols */
}
function reverse(i, height, width) {
var x, y;
// rows
x = i % width
y = (i - x) / width
/* // cols
y = i % height;
x = (i - y) % height; */
return [x, y];
}
现在,假设我们有一个 6 宽 x 3 高的地图
1-D | 2-D
0 1 2 3 4 5 | x0y0 x1y0 x2y0 x3y0 x4y0 x5y0
6 7 8 9 10 11 | x0y1 x1y1 x2y1 x3y1 x4y1 x5y1
12 13 14 15 16 17 | x0y2 x1y2 x2y2 x3y2 x4y2 x5y2
在 1-D Array中选择一个索引,例如i = 8
,将其转换为我们可以使用的 2-D 坐标reverse
reverse(8, 3, 6); // [2, 1]
// i, h, w = [x, y]
x = 2, y = 1
或者说我们在二维数组中选择了坐标,我们可以将其转换为一维数组中的索引convert
convert(2, 1, 3, 6); // 8
// x, y, h, w = i
一旦您可以在两个系统之间进行转换,您就可以像往常一样进行路径查找。你可以随意命名这些函数,我写了更多,所以你可以看到如何在两个系统之间切换。
根据它的制作方式,y轴可能0
在底部,而不是顶部,或者整个东西可以镜像穿过对角线(我在上面的函数中称为cols)。这实际上取决于它是如何完成的,但只要您与转换保持一致并且具有正确的高度和宽度(分别读取最大 y和最大 x),就没有关系了。
一种方法可能是根据图块的 2D 矢量坐标检索 1D 数组的偏移量:
int MaxX = 100; // assumes a max row of 100;
int offset = Y * MaxX + X;
tile[offset] = ....
无需转换,直接在一维数组中引用瓦片即可。我在最近的一个游戏项目中将这种方法用于 A*,并且对我有用。