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

bin+lib morkovmap_rc

基于数据驱动的马尔可夫链瓦片地图生成库和应用。单线程版本。

2 个版本

0.4.1 2023 年 8 月 28 日
0.4.0 2023 年 8 月 28 日

#1033游戏开发

Apache-2.0

215KB
1.5K SLoC

Morkov Maptiler

注意:这是 morkovmap 软件包的单线程版本。

这是一个可能比线程安全版本更快或更慢的非线程安全版本(尽管在小地图上,它至少快10%)

有多快?

30x30 在 30 - 一个900个瓦片的地图,以30FPS的速度渲染,还有时间富余。

此软件包将跟踪主 morkovmap 的 semver 主要和次要版本,但在 补丁版本上可能有所不同

数据驱动的程序地图生成

陆地

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),使用<700 MB RAM。

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

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

依赖关系

~8.5MB
~89K SLoC