我花了一个月的时间在我的新RPG项目上开发一个程序级别生成器。程序生成过程对我来说是新的,所以我很享受探索这个过程,学习如何设置种子值,如何让你的随机数确定性以及更广泛地帮助我掌握基础数学来让一切都融合得很好。 我包含了3种不同的级别风格来显示完整功能。 步骤如下: 1. 为随机数生成器设置种子值,生成房间1和随机化起始位置,使用一个所有值都可被4整除的数组,这是墙壁和门的宽度。也可以使用此数组来设置生成时可以选择的距离,这样可以将生成分散开来或保持紧密。 2. 生成房间2和随机化起始位置。要生成一个房间,先从一堵墙开始。确保转轴点位于一侧,才能控制起始和结束点的位置。步到一端,生成另一堵墙。生成一侧所需的所有墙壁。旋转起始点,生成另一堵墙,重复此过程,生成另一堵墙。 3. 生成房间3和随机化起始位置。要生成地板,进行同样的操作,但将墙壁的数量翻倍,因为它们的大小是地板的一半。 4. 生成房间4和随机化起始位置 5. 生成房间5和随机化起始位置 6. 检查墙壁是否为内部/外部,通过发送出向前和向后的射线,相对于每堵墙。如果前后都碰撞,则为内部,否则为外部。 有一个陷阱,这个陷阱是,如果墙壁是外部边缘但仍然感知到另一个房间的周边,则会注册为内部房间,但我们稍后会处理这个问题。 7. 记录内部墙壁,只是为了以后使用 8. 在每个内部墙壁上随机生成门 9. 检查这些门是否实际上是外部的,这是步骤6的陷阱,我们然后发送一个射线向下,向下方的墙壁。如果我们击中了两边,我们就好,否则,我们就在边缘上,我们应该在房间之间建立一个周边连接。 10. 清理地板旋转,使所有地板都旋转相同的旋转,以便它们可视化 11. 清除重复的墙壁,门和地板,首先是门,使用物理碰撞盒方法,因为它有可靠的方法来检测我们击中的内容。它不会以可靠的方式报告碰撞结果,所以一定要确保我们不使用这些结果来进行任何随机操作。也不能在所有生成器代码中使用销毁函数,因为这会改变列表长度,这些长度将用于随机函数。 12. 运行周边门连接方法,运行一个射线从周边门向连接房间,关闭墙壁面板,实例化一个门。运行每侧的墙壁,从连接走廊中。 13. 在走廊中生成地板 14. 添加周边连接地板碰撞,使墙壁能够检测它们是否是内部或外部的下一步 15. 定义周边,通过从每个内部墙壁面板向下方的墙壁发送一个射线,如果击中了地板,则是周边,如果没有,则是内部墙 16. 运行墙壁面板的变体,允许视觉分割 17. 检查安全地板面板,以便可以为地板面板的变体可用。通过运行物理碰撞盒来做到这一点,检查每个地板块,如果它击中了墙壁,则不适合地板面板的变体。这是为了防止生成在墙壁下方,因为这不会符合视觉效果。 18. 运行地板面板的变体,根据上述选择 19. 从一个列表中生成详细对象,让它们只在安全地板面板上生成,确保我们不会生成太近的墙壁,形成死角 20. 创建自定义房间入口样式,允许在洞穴中生成门,生成通过地下的通道。将添加支持生成许多类型的特殊入口/出口,以便允许区域样式的变体。 21. 清理内部光源,仅用于内部场景,以确保入口处不会生成光源,因为这不会符合视觉效果 22. 删除内部墙壁,选项步骤,用于开放区域 23. 启用外部地形,一种简单的平面,给周围区域提供一个地面而不需要复杂的地面生成 24. 装饰周边使用相同的森林项目装饰内部场景(仅用于外部场景) 25. 保存所有对象的位置和启用/禁用状态,特别是摧毁盒等和掉落的财物,以及所有敌人及其类型 26. 清理周边详细内容,通过在每个悬崖等上运行物理碰撞盒,如果击中,则移动到悬崖顶部。不是完美的,但足够了。 27. 删除门内部,仅用于内部场景,以便我们可以通过生成的门走 28. 生成导航网格,以便敌人移动,考虑到所有详细对象的位置 29. 将玩家放入起始区域,相对于他们的入口,所以如果前一个级别是通过右边退出,则从左边开始等等 30. 完成,运行游戏。所有这一切都发生在1-2秒内,而级别加载时对玩家不可见。所有这一切都在一个单一的脚本中生成,这不是高效的,但足够完成工作。
为我的新RPG生成程序化地图。基本步骤。
评论 (0)