My Assistant
![]() ![]() |
|
2023-10-08, 15:51
Post
#1
|
|||
|
GEEKs will Eventually Evolve into Kryptonians. | All my jokes are cries for help.
Group: Avatar Posts: 1151 Joined: 2008-05-18 Member No.: 21346 |
* 演示视频:https://www.bilibili.com/video/BV1hz4y1F7yr/ * 英文版:https://bozar.itch.io/ghost-in-the-swamp/devlog/616331/post-mortem-ghost-in-the-swamp > 沼泽宽广无垠。 > > 你是一片平静沼泽的半鬼魂守护者。人类入侵了你的家园,偷走了三件珍贵宝藏。你需要吓跑入侵者,取回失窃物品,最后将它们藏在瑞丝琪的秘密小岛上。如果遇到以下三种情况,游戏将会失败:你暴露在人类视线中并且没有魔法值,你在沼泽中沉没了,你无法采取任何行动。 《沼泽迷魂(Ghost in the Swamp)》是一款回合制、短时长的 Roguelike 游戏,使用 Godot 引擎制作。一局游戏花费五到十分钟。你可以在 [GitHub](https://github.com/Bozar/GhostInTheSwamp) 和 [itch.io](https://bozar.itch.io/ghost-in-the-swamp) 下载游戏或在线试玩。 根据 GitHub 提交历史,这个项目开始于一年前,但是我估计实际开发时间应该不超过八个月,其余四个月被工作、生活和电子游戏占据了。这款游戏在八月底发布了,原本打算九月份写这篇笔记的,但是因为玩晨风耽搁了几周。 本文包括三部分:第一,设计游戏机制;第二,使用射线检测环境;第三,使用小地图块拼接出整个地下城。 ## 为《沼泽迷魂》设计游戏机制 在《游戏机制——高级游戏设计技术》这本书中,作者指出,为了制作一款涌现型游戏,即使用少量规则产生大量可能选择的游戏,你需要建立多个在不同层级上相互作用的反馈循环。一个反馈循环包括了资源的生成、转化和消耗。从这些思路出发,我先在纸上画了几张机制图,然后用 [draw.io](https://app.diagrams.net/) 输入电脑。 » Click to show Spoiler - click again to hide... « 图 1:游戏机制概览。 以上是《沼泽迷魂》的游戏机制。这些示意图仅用于初期构思,它们展示了不同资源之间非定量的关系。此外,我也没有严格遵循《游戏机制》所使用的标志。在我的示意图中,圆圈代表资源池,方框是来源或消耗器,三角代表转换器,菱形是触发器——你可以把它看做按钮,点击后将产生某些效果。 » Click to show Spoiler - click again to hide... « 图 2:最终目标。 游戏的最终目标是一个“锁-钥匙”系统。为了航行到达最终小岛,你需要三件物品和魔法值。为了获得这些物品,你需要消耗魔法值惊吓非玩家人物。因此,游戏大部分时候都在努力确保魔法值引擎顺利运转。 » Click to show Spoiler - click again to hide... « 图 3:魔法值引擎。 魔法源头稳定地生成魔法值,有两个因素影响产量。非玩家人物会减少产量。使用鬼魂点亮码头能够增加产量。点亮过程中可能要消耗额外的魔法值,这取决于玩家技术,因此我使用百分号而不是 `+1`。鬼魂和魔法值在两方面产生交互。第一,魔法值越多,鬼魂产量越少。第二,如果被鬼魂附身,惊吓非玩家人物时需要更多魔法值。 » Click to show Spoiler - click again to hide... « 图 4:三件物品:朗姆酒,鹦鹉和手风琴。 玩家人物拥有的物品越多,惊吓非玩家人物所消耗的魔法值也越多。除了这条规则,三件物品都在不同方面影响着魔法值的生成与消耗。 朗姆酒提升了魔法值的上限,因此熟练的玩家“有可能”累积更多魔法。 鹦鹉允许玩家人物与非玩家人物交换位置。该行动本身不消耗魔法值。但是,如果玩家借此机会移动到敌人的侧面或者后方,惊吓时所消耗的魔法值要比迎面而上来得少。这个行动也能把非玩家人物移动到更偏僻的位置,使其需要花费更多时间才能与另一个同伴碰撞。非玩家人物之间的碰撞会降低魔法值的生成速度。使用鹦鹉并不一定能带给玩家上述优势,因此我在这里使用了两个百分号。 手风琴让玩家人物进入码头以及乘坐海盗船。如果玩家设法来到有利地点,手风琴将减少惊吓消耗的魔法值。此外,由于非玩家人物无法进入沼泽,如果玩家借助海盗船进入码头,然后用鬼魂将其点亮,即可完全避免陆地上的冲突,节省大量魔法值。 ## 使用射线检测环境 当玩家按下空格键,游戏显示能够出在四个方向上使用的能力。此外,游戏在每一轮都会根据玩家人物的位置,计算魔法值的回复量以及非玩家人物的视线。所有这些需求都能通过侦测射线来满足。 每次玩家人物开始行动前,向着四个方向(上下左右)发出射线。检查每一格的地形以及(可能存在的)非玩家人物。一旦射线命中障碍物,返回终点数据。核心函数如下: func cast_ray(cast_from_land, cast_from_swamp) -> Dictionary: pass `cast_from_land` 和 `cast_from_swamp` 是两个函数,它们根据玩家人物的当前位置判定射线是否遇到障碍物。字典返回值包括四组数据: { LEFT: EndPointData, RIGHT: EndPointData, UP: EndPointData, DOWN: EndPointData, } `EndPointData` 是一个自定义对象,包含了游戏需要的全部信息。如果你想深入了解实现细节,可以在我的 GitHub 仓库里搜索文件 `CastRay.gd`。 ## 使用小地图块拼接出整个地下城 整座地下城被平均分成 9 块(3x3)小地图,编号见下文。每块小地图包含三种布局,每种布局都包含固定和随机的地形。创建世界期间,游戏选出并且拼接九块小地图,然后水平或垂直地翻转整座地下城。更多技术细节详见 GitHub 仓库里的以下文件:`InitWorldHelper.gd`,`DungeonPrefab.gd` 和 `FileIoHelper.gd`。 小地图编号: a0 a1 a2 b0 b1 b2 c0 c1 c2 这种做法的好处在于,我只需要设计 27 张(3x9)地图,就能得到超过 19683 个(3^9)地下城。不过,我强烈建议在游戏开发的大部分时间内使用一张手绘地图,在这样一张基本静态的地图上测试完大部分内容之后(玩家人物的能力,非玩家人物的行为,与建筑物互动等),再着手生成更加动态的世界。 我使用 [REXPaint](https://www.gridsagegames.com/rexpaint/) 绘制地图。每张地图必须满足三个要求: * 连通性:一张地图必须通过道路与相邻区域连接。 * 功能性:大部分区块必须恰好包括一座码头。 * 多变性:同一区块的地图看起来有显著区别。 接下来以 `c2` 系列地图为例展开说明。 » Click to show Spoiler - click again to hide... « 图 5:`c2_0`。 地图 `c2_0` 是一个空白模板。它要求该系列必须铺设两条通往邻近区域的道路(`-`)。 » Click to show Spoiler - click again to hide... « 图 6:`c2_1`。 地图 `c2_1` 的骨架是两条平行的水平道路和装饰路面(`=`),通过一条垂直道路连接。玩家人物可以从 `a2` (使用鹦鹉)传送至码头(`H`)。地图右下角可能有一块无法通过的灌木(`+`)。另外还有两条长度随机的道路:`E` 代表起点,`X` 是道路中段,`Z` 标记出最大长度(3 格)。 » Click to show Spoiler - click again to hide... « 图 7:`c2_2`。 在 `c2_2` 中,骨架是两条较长的水平道路。可以从 `c1` 而不是 `a2` 抵达码头。地图中可能出现的灌木比 `c2_1` 更多。 » Click to show Spoiler - click again to hide... « 图 8:`c2_3`。 在 `c2_3` 中,骨架是 L 型的。如果两条可变长度的道路都是 3 格长,那么它们将形成一个环,方便玩家人物躲避敌人。 |
|||
|
2023-10-20, 19:09
Post
#2
|
|||
|
主物质者
Group: Primer Posts: 2 Joined: 2022-12-01 Member No.: 101445 |
好强 (IMG:style_emoticons/default/smile.gif)
|
|||
![]() ![]() ![]() |
| Copyright © 2005-2023 The Ring of Wonder | Time is now: 2023-11-08, 00:41 |