矩阵和生成的平铺世界,如何生成边缘?

时间:2014-04-30 15:14:47

标签: 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乘3矩阵对象。是否有任何标准操作使用矩阵或掩码巧妙地将我的边缘应用到我的瓷砖上?

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

由于在生成草图块时需要预先显示功能来添加边缘,因此我将边缘生成为我的图块数组的附加解析。所以我正在寻找一种解决方案,我可以将边缘添加到草地边缘。

这也让我想起了抗锯齿,我想知道该领域是否有相关的公式。

理想情况下,解决方案是最佳的。例如,我会有一些像上面那样的面具,通过将它添加到数组中的每个草砖上,然后我会获得角和边的唯一值,这样我就可以将它们转换为边缘图像。

1 个答案:

答案 0 :(得分:1)

首先区分逻辑和可视化。有一个数组可能是有意义的,其中每个单元格都是草或水,用于游戏逻辑(让我们称之为a)。从那里你创建了第二个数组来存储该单元格的渲染方式并考虑边缘(让我们称之为v)。


要从v计算a,您可以查看以下问题:对于v_ij中的每个单元格v,您要根据{计算如何渲染它{1}}和相邻单元格的值。

示例:

论文是a_ij

中的值
a

你如何在中间渲染细胞?

在不考虑对称性的情况下,您实际上有0 0 0 1 0 0 1 1 1 个不同的情况。


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

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

在上面的示例中,您将获得256,这是查找中的第39个条目。