#markov-chain #map #procedural #gamedev #random #library

程序+库 morkovmap

基于数据驱动的马尔可夫链地图生成库和应用

4 个版本 (破坏性更新)

0.4.0 2023 年 5 月 4 日
0.3.0 2023 年 4 月 26 日
0.2.0 2023 年 4 月 15 日
0.1.0 2023 年 4 月 1 日

#1382 in 游戏开发

Apache-2.0

215KB
1.5K SLoC

Morkov Maptiler

数据驱动的程序化地图生成

大陆

Example map

废弃的空间站

Space map

...等等!

用法

Morkov Maptiler 可以作为一个应用程序和一个 Rust 库使用。

应用程序

预构建:

只需运行可执行文件(Windows 上为 morkovmap.exe

从源代码:

您需要安装 Rust 编译器。

  1. 下载并安装 Rust 编译器(如果您还没有的话)
  2. 下载此项目的源代码
  3. 在项目的根目录中打开您的终端(您应该至少能看到这个 README 和一个 src/)。
  4. 在终端中,运行 cargo run -r
  5. 现在您应该会看到代码正在编译和运行。

在两种情况下,您现在应该会看到在可执行文件相同的目录中创建了一个新文件,名为 map.png

配置

地图生成规则可以在运行应用程序的工作目录中名为 rules.json 的文件中编辑。

如果您看不到此文件,则将在第一次运行后自动为您生成一个默认预设。

或者,您可以将 examples/ 目录中的一个规则集文件复制并编辑,然后将其保存为 rules.json

截至目前,配置包含三个主要部分

  1. 布局规则
  2. 着色规则
  3. 地图大小

布局规则

布局规则是一张相对权重的映射表;例如

{
    "1": {"1": 1.0, "2": 3.0}, 
    "2": {"1": 3.0, "2": 1.0}
}

表示类型 1 的地砖有三种可能性会过渡到类型 2 的相邻地砖,而不是另一种类型 1。

同样,类型 2 的地砖有三种可能性会过渡到类型 1 的相邻地砖,而不是同类型的 2。

这种类型的规则可能会提供轻微的 '条纹' 效果,其中 1 和 2 大约交错在一起。

着色规则

这对你来说太抽象了吗?

好吧,这是因为类型目前还不代表任何东西,这正是着色规则发挥作用的地方。

这些是将类型(与布局相同)映射到 RGB 颜色以进行可视化的映射表。

例如,

"1": {
  "Rgb": [
    10,
    255,
    10
  ]
},
"2": {
  "Rgb": [
    10,
    10,
    255
  ]
}

表示类型1的瓦片是绿色(例如草地)而类型2的瓦片是蓝色(例如水)。

请注意,这种可视化惯例没有任何“意义”附加;我们可以轻松地翻转颜色方案,布局仍然相同。

目前,只有可视化引擎使用全像素为每个瓦片着色 - 在将来,这将被扩展。

关于这一点,单个地图像素不一定对应单个“物理”瓦片!

您可以将此用作库来生成“生物群落”,并将每个生成的瓦片扩展到数百或数千个子瓦片!

然后您如何填充生物群落就取决于您了 - 您甚至可以使用库递归地,使用每个生物群落不同的规则集来填充瓦片。

地图大小

这一点应该相当容易理解。地图的大小,由边长定义(它是一个正方形)。

例如,100结果是一个100x100像素的地图。

请记住,处理时间与瓦片数量(线性)和地图大小(对于二维地图是平方)成比例,所以如果您将地图大小从100像素增加到200像素,您应该预计它将慢4倍才能完成。

尽管如此,当前未优化的生成器很容易在一次运行中处理多达一百万个瓦片(1000x1000),使用

超过这一点事情开始变得复杂,一次性生成如此大的地图在本质上是不高效的 - 我们正在存储对我们目的不再相关的地图数据。

这并不意味着不可能 - 但更好的方法是生成较小的地图并将它们的边缘拼接在一起,这正是这种算法非常擅长的事情。

依赖项

~8.5MB
~89K SLoC