gpt4 book ai didi

javascript - 将类似 Minecraft 的 map 存储为 JavaScript 数组

转载 作者:行者123 更新时间:2023-11-30 19:01:48 25 4
gpt4 key购买 nike

我正在编写一个 map 编辑器,将 3D 空间转换为 JavaScript 数组,以便可以将其导出到 JSON 文件。

每张 map 都有一个 2D 平面作为地面层(用户必须指定 X 和 Y 大小),然后要增加高度,用户可以在这个 2D 平面上放置 block ,在 X 和 Y 之后网格(类似于 Minecraft)。

我的想法是为每个 Z 层创建一个数组,并用关于哪些 block 放置在那里的信息填充它。因为必须指定 map 的 X 和 Y 大小,所以一个简单的数组就可以解决问题,因为要读取 map ,您只需循环每个 Z 层数组并用其内容填充 map ,这将是另一个数组。创建由底层的 X 和 Y 大小定义的行。

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

这是存储 3D 空间的最有效方式吗?我正在尝试尽量减少 map 大小并尽可能加快加载时间。

最佳答案

如果您只有 block/empty,那么一个位就足够了,您可以为矩阵使用单个数组 Javascript 类型数组。

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

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

然后 map 可以存储为单个 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] 简单地读/写元素.

如果需要超过 256 个但少于 65537 个不同的值,则可以使用 Uint16Array

如果大多数元素除了类之外不携带特定数据(例如,它们只是“air”、“land”、“water”)并且只有一小部分需要更多,那么可能是一个字节映射“other”的值,然后只是一个字典映射 (x,y,z) 到仅“other” block 的数据是一种合理的方法(非常简单的代码,仍然可以快速访问和更新)。

请注意,虽然 Javascript 具有可有效存储二进制数据的数据类型,但不幸的是,JSON 不提供通过网络发送/接收任意字节(非文本)的类型,您需要转换为 base64 编码或从中加载类似的东西(如果你想使用 JSON)。

关于javascript - 将类似 Minecraft 的 map 存储为 JavaScript 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com