- 作者:Logan Foster
- 翻译:highway★
游戏体验的多样性是 Roguelite 游戏的支柱之一。算法生成的关卡,从平台游戏的角度来说,存在很多挑战,对于刚入手 GMS 的新手来说也比较复杂。比较折中的方式是将预制的关卡区块链接组合在一起,下面是我在 Seals of the Bygone 中制作随机关卡的方法,用到了 GMS2 的图层系统。
摘要
从本质上说,我们要为关卡创建一些不同的区块(section)。每个区块包含子区块(subsections),其中包含我们的资产(asset)。通过使用代码来动态切换子区块的开关(on/off),我们就可以随机关卡了。(译注:当然这不如 dead cells 那种算法加预制的随机方法效果好,不过对于刚入坑这里的朋友来说应该也是种不错的选择,而且在区块中来控制关卡设计,也相对纯算法容易一些,比如做 risk of rain 类型的游戏,应该是很够用了)
我们没有在代码或外部资源中存储关卡区块信息,而是在 Room Editor 中创建它们,并存储在图层中,就跟做其他关卡一样。这也是我创建这个系统的主要原因,我想保留现有的设计流程,该流程基于 Room Editor。
配置
第 1 步:创建父区块
首先,我们要为每个主要结构创建空白资产层。区块的数量并没有限制,在下面的示例关卡里,我们创建了 3 个区块,名为"Section1","Section2","Section3"。这些资产层基本上就相当于结构文件夹,也可以在代码中引用。
第 2 步:创建子区块
现在,创建子区块的其他空白资产层。这些图层将保存我们构成关卡的 tile 和 object。这里我们将其命名为"Sub1_1","Sub1_2"等。
第 3 步:子区块的图层
最后,我们将构成关卡的 tile、asset 和 object 层也加入到这些子区块中。上图中,子区块"Sub2_1"是打开的,并存在"Collision2_1"和"Tiles2_1"这类图层。这些就是我们构建关卡要用到的层。
现在我们完成了所有设置,你可以切换父组的可见性,以便查看子区块的不同组合。我建议你在完成设计子区块后使用锁定功能,以确保不会意外的编辑它。
代码
我们已经搞定了关卡区块,并存储在不同的层中,现在可以来试试在关卡开始的时候随机选择哪些层了。在 Room Start 事件中敲下面的代码。
首先,我们定义要用于区块和子区块的前缀。我们将使用它们的名字来找到我们要用的层,请确保这些命名与你在 Room Editor 中的层相同。然后我们循环查看有多少不同的区块。
现在我们知道有多少区块了,遍历每个区块并查看有多少个子区块。然后选择一个随机的子区块来使用。
在决定使用哪个子区块之后,我们循环并销毁其他所有子区块(在该区块内)。最后我们通过设置层的可见性进行清理,以确保一切正确。如图,这里的图层名称是"硬编码"的,所以你需要将它们更改为你的区块包含的内容。我们可以动态的执行此操作,但这里没什么必要。
结论
完事儿了,很简单的解决方案,可以为你的关卡增添一些随机性。如果你想做一些更强大的东西,可以试试用 layer_x 和 layer_y 移动一些东西来扩展这个系统。
如果你有什么问题,可以随时联系我@rologfos
谢谢阅读!
2/23/2019
H
感谢 十分有帮助