我用 Javascript 制作了一个基于瓦片的 RPG,使用 perlin 噪声高度图,然后根据噪声的高度分配瓦片类型。
地图最终看起来像这样(在小地图视图中)。
我有一个相当简单的算法,从图像的每个像素提取颜色值,并转换成一个整数(0-5)取决于它的位置之间(0-255)对应的瓦片字典。然后将这个200x200数组传递给客户端。
然后,引擎根据数组中的值确定这些瓦片,并将它们绘制到画布中。因此,我最终得到了一个有趣的世界,它有着逼真的特征: 山脉、海洋等等。
现在我想做的下一件事是应用某种混合算法,使瓷砖无缝地混合到他们的邻居,如果的邻居是不同的类型。上面的示例地图是玩家在他们的小地图中看到的。在屏幕上,他们可以看到一个由白色矩形标记的部分的渲染版本; 在这个版本中,瓷砖是用它们的图像而不是单色像素来渲染的。
这是一个示例,用户可以在地图中看到 它不是上面显示的视图相同的位置!以外的内容
正是在这种观点中,我希望转变发生。
我想出了一个简单的算法,它可以遍历视窗中的地图,并在每个瓦片的顶部渲染另一个图像,前提是它旁边是一个不同类型的瓦片。(不要改变地图!只是渲染一些额外的图像。)这个算法的想法是侧写当前瓷砖的邻居:
这是一个示例场景,说明引擎可能必须呈现什么,当前的瓦片是用 X 标记的那个。
创建一个3x3数组,并读入数组周围的值。对于这个例子,数组看起来像。
[
[1,2,2]
[1,2,2]
[1,1,2]
];
我的想法是,然后解决了一系列的情况下,可能的瓷砖配置。在一个非常简单的层面上:
if(profile[0][1] != profile[1][1]){
//draw a tile which is half sand and half transparent
//Over the current tile -> profile[1][1]
...
}
结果是这样的:
它作为从 [0][1]
到 [1][1]
的过渡工作,但不是从 [1][1]
到 [2][1]
的过渡工作,在那里硬边仍然存在。所以我想,在那种情况下,一个角瓦将不得不使用。我创建了两个3x3精灵表,我认为将持有所有可能的组合瓷砖,可能需要。然后我为游戏中的所有瓷砖复制了这个(白色区域是透明的)。最终,每种类型的瓷砖有16个瓷砖(不使用每个电子表格上的中心瓷砖)
因此,使用这些新的贴片和正确的算法,示例部分应该是这样的:
尽管我每次尝试都失败了,但是算法总是有一些缺陷,而且模式结果都很奇怪。我似乎不能把所有的案子都处理好,而且总的来说,这似乎是一种糟糕的处理方式。
因此,如果有人能够提供另一种解决方案,说明我如何创建这种效果,或者编写分析算法的方向,那么我将非常感激!