RoguePG-程序生成(哈!)

好吧,我不认为在上一篇文章后会这么快地发布帖子,但是我在这里。 我花了很多时间阅读程序生成,并参考了一篇写得很好的关于一种方法的教程。

不幸的是,经过大约1-2个小时的阅读后,我意识到我正在学习的方法只能以程序方式生成正方形的房间(无方差,很无聊),并且每次都必须将地图重新​​加载到游戏中玩家进入新房间的时间!

我感到有些沮丧,但是后来我想起了Phaser v3示例文档中列出的一个很好的示例,该示例与我想要的非常相似。 起初有点令人生畏,但通读它完全有回报。


怎么运行的

实际的过程生成代码对我来说有点丢失,并且可能值得冗长地发表自己的文章,因此我将在此处进行链接。 实际上随机生成连通的房间从而构建地牢非常方便。

我最终要做的是(紧跟本教程之后),生成了所有由x,y坐标组组成的房间,并手动将瓷砖随机放置在目的地。 听起来需要做很多工作,但实际上大约需要30行代码。

我们知道每个房间都需要拐角,因此每个房间的每个拐角处都有墙砖。 那部分很简单。 另外,由于我的墙壁实际上没有任何变化,因此我们可以对所有墙壁本身使用1个图块。 然后,由于地砖存在一些差异,因此我们称为weightedRandomize函数。 此功能可将图块坐标中图块矩形区域的索引随机化。 最后但并非最不重要的是门。 值得庆幸的是,生成代码中有一个帮助程序方法,该方法将列出每个房间的所有门坐标。


战争迷雾

令人惊讶的是,通过这种方法实现战争迷雾非常简单。 首先,我们创建一个雾层(使用alpha值),然后有一个名为setRoomAlpha的辅助函数,该函数将占用一个房间以及您要设置的alpha值。 然后,我们可以简单地遍历房间中的每个图块并设置Alpha值。

另外,在每次更新更新时,我们都可以检查玩家是否在新房间中(跟踪活动房间),如果是,则将alpha值设置为1,并将最后一个活动房间的alpha设置为0.5。

这是事物外观的屏幕截图:

您可能会立即注意到双扇门和超厚墙。 这是由于程序产生的缘故,这是我将要考虑的问题。 最好的情况是跟踪房间及其坐标,并扩展其x,y值,以便它们可以匹配其墙壁。 也许还有我没有想到的另一种解决方案。

快速更新

对此博客帖子进行快速更新,说我已经解决了程序生成中的大多数问题。 为了解决对齐问题(您可以在屏幕截图中看到播放器未与门对齐),我发现在此坐标下生成播放器:

this.map.tileToWorldX(playerRoom.centerX),this.map.tileToWorldY(playerRoom.centerY)

会在房间的中心产生玩家,但是房间的中心等于16倍。为了正确对齐玩家,我需要将x和y值的位置偏移8。

重复的门问题是一个巨大的痛苦。 解决方案有点笨拙,但这是我可以想到的唯一方法,而无需实际剖析程序生成代码,这简直是一场噩梦。 这是修复此问题的代码段,它位于每个地牢房间的循环中:

我编写了一个小辅助函数,该函数从地砖本身获取每个方向(NESW),如果找到了另一个门,它将用地砖替换自身。

仅此而已! 现在,我可以专注于下面的内容。


下一步

解决双门问题后,我很可能会以程序方式产生敌人! 我当然也应该考虑将游戏分解为不同的状态。 幸运的是,我已经对如何在战争迷雾中实现敌人的行动有了一个很好的主意。 顺带一提,我将开始考虑游戏的进展。 但是在此之前,我将添加更多的拼贴,并可能在诸如陷阱之类的东西上工作,这些东西可能造成简单的破坏。

敬请期待更多。