欢迎光临散文网 会员登陆 & 注册

《沼泽迷魂(Ghost in the Swamp)》开发笔记

2023-10-08 15:32 作者:bozar42  | 我要投稿

沼泽宽广无垠。

你是一片平静沼泽的半鬼魂守护者。人类入侵了你的家园,偷走了三件珍贵宝藏。你需要吓跑入侵者,取回失窃物品,最后将它们藏在瑞丝琪的秘密小岛上。如果遇到以下三种情况,游戏将会失败:你暴露在人类视线中并且没有魔法值,你在沼泽中沉没了,你无法采取任何行动。

《沼泽迷魂(Ghost in the Swamp)》是一款回合制、短时长的 Roguelike 游戏,使用 Godot 引擎制作。一局游戏花费五到十分钟。你可以在 GitHub[1] 和 itch.io[2] 下载游戏或在线试玩。

根据 GitHub 提交历史,这个项目开始于一年前,但是我估计实际开发时间应该不超过八个月,其余四个月被工作、生活和电子游戏占据了。这款游戏在八月底发布了,原本打算九月份写这篇笔记的,但是因为玩晨风耽搁了几周。

本文包括三部分:第一,设计游戏机制;第二,使用射线检测环境;第三,使用小地图块拼接出整个地下城。

为《沼泽迷魂》设计游戏机制

在《游戏机制——高级游戏设计技术》这本书中,作者指出,为了制作一款涌现型游戏,即使用少量规则产生大量可能选择的游戏,你需要建立多个在不同层级上相互作用的反馈循环。一个反馈循环包括了资源的生成、转化和消耗。从这些思路出发,我先在纸上画了几张机制图,然后用 draw.io[3] 输入电脑。

图 1:游戏机制概览。

以上是《沼泽迷魂》的游戏机制。这些示意图仅用于初期构思,它们展示了不同资源之间非定量的关系。此外,我也没有严格遵循《游戏机制》所使用的标志。在我的示意图中,圆圈代表资源池,方框是来源或消耗器,三角代表转换器,菱形是触发器——你可以把它看做按钮,点击后将产生某些效果。

图 2:最终目标。

游戏的最终目标是一个“锁-钥匙”系统。为了航行到达最终小岛,你需要三件物品和魔法值。为了获得这些物品,你需要消耗魔法值惊吓非玩家人物。因此,游戏大部分时候都在努力确保魔法值引擎顺利运转。

图 3:魔法值引擎。

魔法源头稳定地生成魔法值,有两个因素影响产量。非玩家人物会减少产量。使用鬼魂点亮码头能够增加产量。点亮过程中可能要消耗额外的魔法值,这取决于玩家技术,因此我使用百分号而不是 `+1`。鬼魂和魔法值在两方面产生交互。第一,魔法值越多,鬼魂产量越少。第二,如果被鬼魂附身,惊吓非玩家人物时需要更多魔法值。

图 4:三件物品:朗姆酒,鹦鹉和手风琴。

玩家人物拥有的物品越多,惊吓非玩家人物所消耗的魔法值也越多。除了这条规则,三件物品都在不同方面影响着魔法值的生成与消耗。

朗姆酒提升了魔法值的上限,因此熟练的玩家“有可能”累积更多魔法。

鹦鹉允许玩家人物与非玩家人物交换位置。该行动本身不消耗魔法值。但是,如果玩家借此机会移动到敌人的侧面或者后方,惊吓时所消耗的魔法值要比迎面而上来得少。这个行动也能把非玩家人物移动到更偏僻的位置,使其需要花费更多时间才能与另一个同伴碰撞。非玩家人物之间的碰撞会降低魔法值的生成速度。使用鹦鹉并不一定能带给玩家上述优势,因此我在这里使用了两个百分号。

手风琴让玩家人物进入码头以及乘坐海盗船。如果玩家设法来到有利地点,手风琴将减少惊吓消耗的魔法值。此外,由于非玩家人物无法进入沼泽,如果玩家借助海盗船进入码头,然后用鬼魂将其点亮,即可完全避免陆地上的冲突,节省大量魔法值。

使用射线检测环境

当玩家按下空格键,游戏显示能够出在四个方向上使用的能力。此外,游戏在每一轮都会根据玩家人物的位置,计算魔法值的回复量以及非玩家人物的视线。所有这些需求都能通过侦测射线来满足。

每次玩家人物开始行动前,向着四个方向(上下左右)发出射线。检查每一格的地形以及(可能存在的)非玩家人物。一旦射线命中障碍物,返回终点数据。核心函数如下:

`cast_from_land` 和 `cast_from_swamp` 是两个函数,它们根据玩家人物的当前位置判定射线是否遇到障碍物。字典返回值包括四组数据:

`EndPointData` 是一个自定义对象,包含了游戏需要的全部信息。如果你想深入了解实现细节,可以在我的 GitHub 仓库里搜索文件 `CastRay.gd`。

使用小地图块拼接出整个地下城

整座地下城被平均分成 9 块(3x3)小地图,编号见下文。每块小地图包含三种布局,每种布局都包含固定和随机的地形。创建世界期间,游戏选出并且拼接九块小地图,然后水平或垂直地翻转整座地下城。更多技术细节详见 GitHub 仓库里的以下文件:`InitWorldHelper.gd`,`DungeonPrefab.gd` 和 `FileIoHelper.gd`。

小地图编号:

这种做法的好处在于,我只需要设计 27 张(3x9)地图,就能得到超过 19683 个(3^9)地下城。不过,我强烈建议在游戏开发的大部分时间内使用一张手绘地图,在这样一张基本静态的地图上测试完大部分内容之后(玩家人物的能力,非玩家人物的行为,与建筑物互动等),再着手生成更加动态的世界。

我使用 REXPaint[4] 绘制地图。每张地图必须满足三个要求:

  • 连通性:一张地图必须通过道路与相邻区域连接。

  • 功能性:大部分区块必须恰好包括一座码头。

  • 多变性:同一区块的地图看起来有显著区别。

接下来以 `c2` 系列地图为例展开说明。

图 5:`c2_0`。

地图 `c2_0` 是一个空白模板。它要求该系列必须铺设两条通往邻近区域的道路(`-`)。

图 6:`c2_1`。

地图 `c2_1` 的骨架是两条平行的水平道路和装饰路面(`=`),通过一条垂直道路连接。玩家人物可以从 `a2` (使用鹦鹉)传送至码头(`H`)。地图右下角可能有一块无法通过的灌木(`+`)。另外还有两条长度随机的道路:`E` 代表起点,`X` 是道路中段,`Z` 标记出最大长度(3 格)。

图 7:`c2_2`。

在 `c2_2` 中,骨架是两条较长的水平道路。可以从 `c1` 而不是 `a2` 抵达码头。地图中可能出现的灌木比 `c2_1` 更多。

图 8:`c2_3`。

在 `c2_3` 中,骨架是 L 型的。如果两条可变长度的道路都是 3 格长,那么它们将形成一个环,方便玩家人物躲避敌人。

[1] https://github.com/Bozar/GhostInTheSwamp
[2] https://bozar.itch.io/ghost-in-the-swamp
[3] https://app.diagrams.net/
[4] https://www.gridsagegames.com/rexpaint/


《沼泽迷魂(Ghost in the Swamp)》开发笔记的评论 (共 条)

分享到微博请遵守国家法律