将类似Minecraft的地图存储为JS数组

问题描述 投票:1回答:1

[基本上,我正在编写将3D空间转换为JavaScript数组,以便可以将其导出到JSON文件的地图编辑器。

每张地图都有一个2D平面作为地面层(用户必须指定X和Y尺寸),然后要增加高度,用户可以按照X&Y网格在该2D平面顶部放置块(类似于Minecraft)。

我的想法是为每个Z层都有一个数组,并在其中填充有关哪些块放置在此处的信息。因为必须指定地图的X和Y大小,所以一个简单的数组就可以解决问题,因为要读取地图,您只需为每个Z层数组循环并用其内容填充地图即可,该内容就是另一个数组。创建由地面图层的X和Y大小定义的行。

我知道您可以填充layer[165] = grassBlock之类的数组在声明它们之后,这将使索引165之前的所有内容为空,从而节省空间。但是以JSON格式,该数组在到达此索引之前不会有164个零或空吗?

这甚至是存储3D空间的最有效方法吗?我正在尝试最小化地图大小并尽可能加快加载时间。

javascript arrays performance 3d
1个回答
0
投票

如果您只有块/空,那么一位就足够了,您可以将单个Javascript类型的数组用于矩阵。

假设矩阵的大小为XYZ,则从坐标(x, y, z)到数组索引的转换可以是:

index = (x*Y + y)*Z + z;

然后,映射可以存储为单个Uint8Array对象,该对象初始化为长度(X*Y*Z + 7) >> 3(每个字节将为您提供8位,但您需要舍入)。

要读/写一点,您最终可以使用

bit = (matrix[index >> 3] >> (index & 7)) & 1;  // Read element
matrix[index >> 3] |= 1 << (index & 7);         // Set element to 1
matrix[index >> 3] &= ~(1 << (index & 7));      // Clear element to 0

如果相反,您需要存储一个逻辑ID,并且不超过256个不同的值(包括“空”),则每个元素一个字节就足够了。 index计算如上,但您可以将其用作X*Y*Z大小,然后使用matrix[index]简单地读取/写入元素。

不幸的是,JSON没有提供一种有效地发送/接收任意字节(非文本)的类型,您需要转换为base64编码并从中加载。

© www.soinside.com 2019 - 2024. All rights reserved.