0

据我所知,所有基于图块的地图编辑器都会导出一个包含一维数组的 JSON 对象。虽然大多数寻路库/教程仅提供给二维数组。

另外,例如,如果我想在这个一维数组中进行寻路并且这个数组很大,我猜这会导致性能问题。

那么为什么大多数基于图块的地图编辑器输出一维,我应该如何处理那些关于寻路的问题?

示例磁贴编辑器

只需google寻路即可找到所有二维寻路教程

4

2 回答 2

1

取决于将其转换为一维数组的方向;

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),就没有关系了。

于 2013-07-11T22:36:44.790 回答
0

一种方法可能是根据图块的 2D 矢量坐标检索 1D 数组的偏移量:

int MaxX = 100; // assumes a max row of 100;
int offset = Y * MaxX + X;
tile[offset] = ....

无需转换,直接在一维数组中引用瓦片即可。我在最近的一个游戏项目中将这种方法用于 A*,并且对我有用。

于 2013-07-31T11:11:59.500 回答