Javascript 在一维或二维阵列中基于平铺的寻路
据我所知,所有基于平铺的地图编辑器都会导出一个包含一维数组的JSON对象。而大多数寻路库/教程仅针对二维阵列提供 另外,如果我想在这个一维数组中进行寻路,而这个数组很大,我会使用它,这会导致性能问题 那么,为什么大多数基于平铺的地图编辑器都会输出一维地图,我应该如何处理这些关于寻路的问题呢Javascript 在一维或二维阵列中基于平铺的寻路,javascript,path-finding,tiles-game,Javascript,Path Finding,Tiles Game,据我所知,所有基于平铺的地图编辑器都会导出一个包含一维数组的JSON对象。而大多数寻路库/教程仅针对二维阵列提供 另外,如果我想在这个一维数组中进行寻路,而这个数组很大,我会使用它,这会导致性能问题 那么,为什么大多数基于平铺的地图编辑器都会输出一维地图,我应该如何处理这些关于寻路的问题呢 只需通过谷歌寻路就可以找到所有二维patfhfinding教程,具体取决于转换为一维阵列的方向 function convert(x, y, height, width) { return x +
只需通过谷歌寻路就可以找到所有二维patfhfinding教程,具体取决于转换为一维阵列的方向
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宽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
在一维数组中选择一个索引,例如i=8
,将其转换为二维坐标,我们可以使用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] = ....
无需转换,只需在1D数组中直接引用磁贴即可。在最近的一个游戏项目中,我将这种方法用于A*,并为我工作。很可能属于其他网站,比如程序员或类似的网站。“程序员Stack Exchange是一个问答网站,面向对软件开发概念性问题感兴趣的专业程序员。”Cross posted:那么你是说我应该将一维数组转换为二维数组?为什么这些平铺编辑器不首先导出二维数组?除非您的算法需要整个数组作为输入,否则您不必转换整个数组。此外,您还可以从中了解到如何修改其他系统的算法(从二维转换为一维比从一维转换为二维便宜)。此外,JavaScript中的一维数组的数据开销较小,这可能是它们导出此类算法的原因。很抱歉,我在处理此问题时遇到了麻烦,所以你们要把一维数组的一部分转换成二维数组?你能在回答中提供一维阵列和二维阵列吗?非常感谢。如果你不介意的话,我有几个小问题:1。我正计划制作一个巨大的基于平铺的地图,并进行大量的路径查找,你建议我将整个一维数组转换为二维数组吗?2.对于基于平铺的游戏创作来说,按照我在第一个问题中提出的要求去做是正常的吗?