c++ - 矩阵和生成的平铺世界,如何生成边?

标签 c++ game-engine tile procedural-generation

我假设这是一个相当普遍的问题,并且我正在寻求一个本质上可能更具学术性的解决方案或用于解决此类一般问题的一般方程式,而不是我破解看起来非常大的意大利面条乱七八糟。

我想生成平铺世界的边缘。我有一个基本的 8 条边。我有一组代表我的瓷砖的整数。 0 是水,1 是草。我想添加在水和草之间过渡的边缘。我的边从 10 到 17。

int edges[3][3] =
{
    {10, 11, 12},
    {13,  0, 14},
    {15, 16, 17}
};

我首先想到的是这类似于矩阵。我知道我的图形库中有一个 3 x 3 矩阵对象。是否有任何标准的矩阵或蒙版操作可以巧妙地将我的边缘应用到我的图 block 上?

是否有合并边的标准公式?例如,如果右下角与草地砖重叠,我可能不会更改它的值,但是如果右下角与左上角重叠,我想将那个地砖更改为草地 (0)。个别场景更多,问题变得复杂。

因为在我生成草方 block 时需要先行功能来添加边,所以我将生成的边作为我的方 block 数组的附加解析。所以我正在寻找一种解决方案,我可以将边缘添加到草地的边缘。

这也让我想起了抗锯齿,不知道这方面有没有相关的公式。

理想情况下,解决方案是最优的。例如,我会有某种像上面那样的 mask ,通过将它添加到阵列中的每个草 block 上,我会得到角和边的唯一值,这样我就可以将它们转换为边缘图像。

最佳答案

首先区分逻辑和可视化。对于游戏逻辑(我们称它为 a),有一个数组,其中每个单元格要么是草要么是水,这可能是有意义的。您可以从中创建第二个数组来存储该单元格的呈现方式并考虑边缘(我们称其为 v)。


要从 a 计算 v,您可以这样看问题:对于 v 中的每个单元格 v_ij > 你想计算如何根据 a_ij 和相邻单元格的值来呈现它。

示例:

这些是 a 中的值:

0 0 0
1 0 0
1 1 1

如何渲染中间的单元格?

如果不考虑对称性,您实际上有 2^8=256 不同的情况。


一个好的和快速的解决方案可能是构建一个查找表,您可以在其中将每个 256 案例映射到您为该情况选择的边之一。

您可以通过遍历 8 个单元格获取查找表中的索引,从而得到 8 乘以 0 或 1,并将其设置为无符号整数的位。

例如,在上面的示例中,您将获得 000 100 111 = 39,因此是查找中的第 39 个条目。

关于c++ - 矩阵和生成的平铺世界,如何生成边?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23391858/

相关文章:

r - 根据额外因素用多边形边框覆盖 ggplot 分组图 block

java - Android 上的平铺 map

java - 在 Java 中集成 BreezyGUI 和键绑定(bind)

android - 如何构建具有两种不同启动行为的移动应用程序?

flutter - 以 ListTile 作为子级的 Flutter 中 Card 小部件的高度不一致

c++ - 在函数调用方面需要帮助

c++ - 在 C++ 中存储局部变量和临时变量的存储术语是什么?

c++ - 我如何设置for循环内的其他条件?

c++ - 如何将文本文件复制到另一个文件?

c++ - 解决 C++ 中 Dll 中模板的问题?