如何随机生成基于2D磁贴的侧向滚动地形?


11

我想使用以下tileset随机生成2D Sidecroller游戏的地图: 在此处输入图片说明

我发现了一些有关位屏蔽过程的好文章,例如:http : //www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -适用于贴图的方法/

我喜欢使用位掩码/碎片掩码而不是执行巨大的if子句或switch语句的想法。

但是,我在可视化整个过程时遇到了麻烦,这些文章都没有提到随机化。

我的图块以多种不同的方式组合在一起,而不仅仅是我所链接的示例中的图块看起来的一种方式。

例如,这里仅是一些示例:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

由于我的图块可以通过许多不同的方式组合在一起,因此我认为8位遮罩无法正常工作。因此,我正在考虑使用更大的位掩码。类似于char [8]或char 4

如果有人可以显示一般算法外观的一些伪代码/示例,我将不胜感激。

Answers:


3

是的,面罩的尺寸会随着选项数量的增加而增长-您自己的链接http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/第二部分说明了主要思想。

本质上,您必须枚举图块之间每个“边界”的X种可能性;在您的特定示例中,“平铺顶部/底部”看起来可能是(1)白色(2)覆盖或(3)半覆盖-恰好与本文中给出的“三叉戟”示例相匹配。

但是,遮罩只会帮助您将平铺可能性限制为可绘制的范围,它本身并不是一种显示如何以明智方式生成实际地图的方法。

您的特定图块实际上具有严格的限制-它仅描述单个表面的上升/下降,并且在任何“整数级”起点,您只有几个有效的选择。例如,在图块#2之后,只能使用图块#1或#8。您可以简单地从左向右移动,列出在前一个图块之后可以出现的(很少)图块列表,并随机选择其中一个。


我认为这是我正在寻找的答案,但是仍然有些模糊。您能否以文本或伪代码更详细地说明最后一部分的工作原理?“您可以简单地从左向右移动,列出可以在前一个图块之后出现的(几个)图块列表,并随机选择其中一个。”
erebel55 2014年

1
对于每种图块类型,请列出其后允许使用的图块列表-很少的图块,可以快速手动完成。“高度”将更改,并用#10填充新图块下方的所有内容。
Peteris 2014年

嗯,您是说要使用这种方法来代替位掩码?
erebel55

1
是的,如果所有2d内容都是有意义的,则位掩码很有用,但是您的地图似乎是单层的,高度不同的水平面。
Peteris 2014年

这是有道理的,“山”的高度会有所不同,并且会相互流入。因此,从本质上讲,随着您的前进,山将不断变化。有点像在不同点具有随机大小的余弦/正弦波。生成地图时,我应该从左到右还是从上到下移动?
erebel55 2014年

6

您是否考虑过使用1D Perlin或单纯形噪声函数?这样做有许多优点,包括:

  1. 无限(在浮点精度范围内),非重复地形

  2. 可以实时生成(即使是在快速的着色器中),也可以提前生成并存储在纹理中,如您的示例所示

  3. 当Perlin和simplex连续时,边框会自动匹配。

  4. 尽管地形本身是伪随机的,但在需要平坦区域或其他特定地形特征的区域中,应用包络功能或简单地减少八度音阶的数量就足够了。

有关 1D Perlin实现的相当详尽的说明请参见此链接

包络基本上是一个标量字段或函数,在保存或显示输出之前先将其与噪声函数相乘。

在此处输入图片说明

(从上述文章中借用的初始图片。)

在此示例中,红线表示分段函数,定义为

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

...可以使用平滑函数更好地定义。在这种情况下,它只是在平稳之前将事物按比例缩小为0,然后在事后放大为1。

更新资料

这是我的一个项目中的3D单面“地形”的示例,其中应用了漫反射+镜面照明,完全在vert + tess + frag着色器管道中生成。对于您的情况,我会从中切出一个垂直切片以获得地形坡度。

在此处输入图片说明

以及自顶向下的正交视图:

在此处输入图片说明


这是一种用于生成实际图块图像本身的技术吗?
erebel55 2014年

1
@ erebel55是的。您可以使用2D函数确定(根据您的示例)在图像中的不同位置放置不同植物的孩子,并生成倾斜地形。我在3D中使用此效果很好。
3Dave 2014年

看来这是一种有趣的方法,因为我已经创建了图像,所以我不确定我是否要沿这条路线走。
erebel55 2014年

@ erebel55是的,如果它对您有用,那么没有理由扔掉现有的东西。
3Dave 2014年

好吧,我还没有使随机数生成工作,但是我希望;)我对该方法的思想投了赞成票,因为它很有趣,我将来可能会用到它。谢谢
erebel55 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.