一个人如何拯救一个程序世界?


17

我最近读过关于如何创建程序世界的信息,但是如何保存一个程序世界?

在Terraria或Minecraft之类的游戏中,用户可以自由修改地形,但不能从初始种子重新创建该世界。使用什么技术来保存程序化但可修改的世界?

Answers:


21

保存用于生成世界的种子以及修改后的内容,作为原子的“命令”或这些命令的结果。

然后,在加载保存的游戏时,请执行以下操作:

  1. 通过程序生成您当前正在访问的世界的一部分。
  2. 应用保存的命令,或用保存的命令覆盖生成的元素。

更新:当然,如果有可用资源,也可以选择像正常世界一样保存生成的世界(如在Minecraft中所见)。在这种情况下,您应该只保存已访问过的世界的一部分(否则,程序生成将毫无意义)。这会消耗更多的HDD和/或数据库资源,但在加载游戏时将需要较少的CPU能力。


2
除了修改之外,他可能还需要保存用于构建程序世界的种子;-)
bummzack 2012年

@bummzack当然可以,我忘了提了,因为很明显:-)我将编辑答案。
马顿2012年

10
我并不完全确定从种子中重生世界是最好的主意。世界生成通常涉及复杂的算法,因此需要时间:我们生成随机世界并不是为了一般地节省空间而是要从随机性中受益。因此,我认为以二进制格式保存整个世界会更加有效。
乔纳森·康奈尔

2
因此,您是说要保存一个程序生成的世界,先生成它,然后再保存它?这不是一个很完整的答案。
MichaelHouse

2
@ Random832 Minecraft 确实以二进制格式保存了世界,而不是从种子重新生成世界并重放修改。为了解决保存整个世界的问题,Minecraft仅保存到目前为止生成的块。随着您进一步探索世界,您的保存游戏将变得更大。
约瑟夫·曼斯菲尔德

8

保存程序生成的世界与保存任何切片地图数据相同。

您可能想要以二进制格式保存世界,假设世界是由不同类型的图块构建的,则您将必须:

  1. 确定不同图块类型的总数(取决于您需要多少位来表示每个图块)
  2. 定义访问(已修改)世界的宽度和高度。
  3. 从最左上的图块(包括天空)开始,逐行到最右下的图块逐一表示世界图块。
  4. 如果您希望节省空间,请使用DEFLATE或类似的算法压缩此2d数组(以1-d表示)http://en.wikipedia.org/wiki/DEFLATE
  5. 对API使用适当的文件I / O将数据存储在磁盘上。

您也可以使用相同的方法来保存基于体素的地图。

存储基于顶点的地图模型更为复杂。

您想让我详细说明一下这个主题吗?


如果需要,您可以通过对每个图块进行颜色编码将其保存为png文件。这样一来,您无需使用专门的查看器即可快速概览结果。
wolfdawn 2014年


3

无论您使用什么数据结构将世界存储在内存中,都可以用作从磁盘写入和读取的模板。如果磁盘上没有可用数据,则游戏的过程部分将首次填充这些数据结构。然后,当您准备从内存中卸载区域时,请将其生成或修改后写入磁盘。

每当您准备将新区域加载到内存中时,请首先检查它是否已生成并保存到磁盘。如果有,请从磁盘而不是从过程生成算法中加载。

通常,这将在大块地形上完成。您既可以将每个块保存到其自己的文件中,也可以在磁盘结构上创建更复杂的磁盘结构,该结构将数据包含在具有查找表的单个文件中。还有其他一些关于将数据保存到磁盘的好方法的问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.