第四章:让游戏“成立”
上次我们完成了发射子弹击倒敌人的游戏基本操作。
本次将讲解如何让游戏“真正可玩”。
思考作为游戏还缺少什么
在当前版本中,我们已经实现了玩家移动和敌人功能,但仍存在若干不足。
首先,舞台过于狭窄,似乎需要将其扩大。
此外,虽然玩家有受击反应,但处于“不会受伤”的状态。由于不清楚当前的生命值(HP),需要将其显示出来。
最后,游戏缺乏“目标”。原本想加入Boss战等内容,但本次我们简化为“击倒5个敌人即通关”。
上次我们完成了发射子弹击倒敌人的游戏基本操作。
本次将讲解如何让游戏“真正可玩”。
在当前版本中,我们已经实现了玩家移动和敌人功能,但仍存在若干不足。
首先,舞台过于狭窄,似乎需要将其扩大。
此外,虽然玩家有受击反应,但处于“不会受伤”的状态。由于不清楚当前的生命值(HP),需要将其显示出来。
最后,游戏缺乏“目标”。原本想加入Boss战等内容,但本次我们简化为“击倒5个敌人即通关”。
首先,通过涂色扩展瓷砖来扩大舞台。舞台变宽后,玩家可能会超出摄像机的范围,因此似乎需要让摄像机跟随玩家移动。
瓷砖是通过 Base(TileMapLayer) 节点创建的,请使用该节点进行扩展。
切换到 stage1 场景标签页。
在场景窗口中选择 Base(TileMapLayer) 节点。
在下方的“瓷砖放置”窗口中选择瓷砖。
完成一定程度的制作后,即可进入下一步。
相机跟随功能通过“目标 ID”系统实现。您是否记得在创建玩家时添加了“CameraTargetSettings”节点?在该节点中,可以通过属性设置“目标 ID”。
ACTION GAME MAKER 的相机节点“ZoomCamera2D”同样支持设置“目标 ID”,其设计逻辑是跟随具有相同“目标 ID"的游戏对象。
现在,让我们为“ZoomCamera2D”和“CameraTargetSettings”设置“目标 ID”。
在 Stage1 的场景标签页中,选择 IntialCamera(ZoomCamera2D) 节点。
展开检查器中的“目标 ID”数组…
点击“添加元素”按钮。
将场景标签页切换到“player”。
选择“CameraTargetSettings”节点。
在检查器的“目标 ID”中输入“player”。
请通过测试游玩来验证功能是否正常,并尝试到达关卡的右端。
如果一切正常,相机应该会跟随玩家移动。
检查清单
如果相机不跟随:请检查 Stage1 中的 InitialCamera 和 player 的 CameraTargetSettings。
如果无法到达关卡右端:请在 Base(TileMapLayer) 中调整陷阱的大小或墙壁的高度。
与敌人一样,当角色的生命值(HP)降为0时,也应进入“倒下”状态。由于没有现成的“倒下”状态动画帧,我们可以使用“粒子”效果来呈现这一状态。
“粒子”在日语中意为“微粒”。通过散布大量小图像来制作特效。您可以将其想象成撒纸屑的效果。您可以自由调整纸屑的外观和飞行方式。
在 Godot Engine 中,可以使用“GPUParticle2D”和“CPUParticle2D”节点来实现。而在 ACTION GAME MAKER 中,则可以通过“ParticleObject”节点来处理。
此外,“ParticleObject”还支持20多种粒子模板。
创建方法与游戏对象完全相同:
创建一个新的场景标签页。
在“创建根节点”中选择“游戏对象”。
将对象名称设置为“倒下粒子”,模板选择“粒子”,然后点击“创建”。
在场景窗口中选择已创建的“倒下粒子”节点。
在检查器中,将粒子模板从“无”更改为“烟花※粒子较多”。
系统将自动添加一个名为“GPUParticles2D”的节点。
在 GPUParticles2D 的检查器中,勾选“Emitting”(发射)。这是控制粒子发射的属性。
当HP变为0时,最好设置为无法移动并释放“倒下粒子”。链接似乎应该从AnyState连接,但这里有一个问题。如下图所示,无论处于“何种状态”,只要“受到攻击”,都会转移到“受击”状态。
HP变为0意味着敌人正在攻击,因此即使处于“倒下”状态,若受到攻击,仍可能转移到“受击”状态。
因此,请按照以下方式,在通往“受击”的链接条件中添加“HP不为0”,以防止转移。
由于没有合适的动画,我们将复用“受击”动画。但如果完全相同,则无法判断是否处于倒下状态,因此请使用改变物体外观的“滤镜”功能,使其外观也发生变化。
最后,添加通往“受击”的转移条件。通过启用通用设置中的“反转条件”,可以将条件取反。也就是说,“HP变为0”条件通过此设置可变为“HP不为0”。
让我们进行测试。目前HP初始值仅为1,因此只要受到一次敌人攻击,应该会进入“倒下”状态。
如果设置正确,当受到敌人攻击时,粒子将显示,玩家会逐渐变透明。倒下后,可以按“F5”键进行重置。
无法正常运行时的检查清单
烟花粒子不显示:请检查“倒下粒子”对象的内容以及“显示粒子”动作。
不变透明:请检查“设置滤镜”的内容。
出现受击反应:请检查链接条件。
好了,一击必杀太严格了,让我们增加 HP 的数值吧。这样一来,就需要知道当前还剩多少 HP,所以我们要制作一个 HP 条。
在 ACTION GAME MAKER 中,可以使用 SimpleGauge 和 ImageGauge 节点来显示进度条,这次我们使用 SimpleGauge。
但是,由于相机是移动的,如果将 HP 条放置在玩家同一层级,它就会被甩在后面。像 HP 条这样需要始终显示的内容,请使用“UI”层级。
还记得之前的说明吗?ACTION GAME MAKER 的层级结构如下所示,UI 层级和屏幕效果层级是“不受相机影响的特殊层级”。也就是说,放置在这些层级中的节点会始终显示,因此非常适合放置 HP 条。屏幕效果层级是用于“屏幕效果”动作的特殊层级,所以请将 HP 条放置在 UI 层级中。

点击测试播放按钮进行测试。如果设置正确,当受到敌人攻击时,应该会触发伤害反应,HP 条也会减少。
无法正常工作时的检查清单
看不到进度条:请确认 SimpleGauge 是否正确成为了 UI 层级的子节点,以及是否放置在蓝线范围内。
HP 一开始就很少:请确认玩家的 BaseSettings 中的“体力”值是否已修正为 10。
HP 是最大值却一击归零:请确认 BaseSettings 中的“最大体力”值是否为 10,以及 SimpleGauge 的“作为最大值的变量”是否已正确指定。
您可能在测试游戏中已经注意到,目前掉入陷阱后会持续下落。让我们实现掉入陷阱即死亡的功能。
只需限制摄像机的移动范围,防止其无限跟随,并设置当摄像机移出范围时触发“死亡”状态即可。
选择 InitialCamera 节点。
在检查器中展开“限制值”。
如果遇到问题,请检查以下事项:
摄像机画面变黑:可能是图块相对于原点(红线与绿线交点)发生了偏移。尝试将摄像机的限制值改为 1000、2000 等,以找到合适的数值。
“死亡”状态本身已存在,只需在链接中添加新条件“超出摄像机范围”即可。
将场景标签切换到“玩家”,编辑器画面切换到“脚本”。
选择 AnyState → 死亡的链接。
点击“添加其他条件”。
选择条件“超出摄像机范围”。
将数据类型从“未设置”更改为“自身”。
将“与前一个条件的逻辑关系”更改为OR并添加。
进行测试运行并让角色坠落。如果掉入陷阱并在超出范围时看到烟花粒子效果,则说明成功。
如果遇到问题,请检查以下事项:
确认 AnyState → 死亡链接中的条件是否正确设置为"HP 为 0"、“或”、“超出摄像机范围”。
我们需要通过某种方法来计数数字“5”。这个数字会在每次击败敌人时减少,当数字变为0时,触发通关演出,这似乎是我们想要实现的目标。在这种情况下,游戏制作中会使用“变量”这一概念。
“变量”就像一个用来存放数值的容器。之前提到的体力(HP)实际上也是一个变量,当“受到敌人攻击”时,体力容器中的数值会减少1。
在 ACTION GAME MAKER 中设置变量主要有两种方法:一种是使用对象的 VariableSettings 节点,另一种是使用数据库中的“项目变量”。之前提到的“体力”属于前者。
“对象变量”是对象专用的容器,而“项目变量”则是任何人都可以在任何地方使用的通用容器。
主要区别在于:“对象变量”依附于对象,因此当对象消失时,变量也会随之消失;而“项目变量”只要在同一项目内就可以使用。与对象绑定的数据,如“体力”或“攻击力”,应使用对象变量;而希望在切换存档时也能保存的数据(如“最高分”),或需要在多个关卡之间保持的数据(如“金币数量”或“剩余生命数”),则应使用“项目变量”。
原则上两者都可以,但由于可能需要从多个对象进行操作,这次我们将使用“项目变量”来实现。
当敌人进入“消失”状态时,将“剩余敌人数”减1。当“剩余敌人数”变为“0”时,执行通关演出。这样应该就能实现目标。
最好创建一个专门用于检查剩余敌人数量的游戏对象,并将其放置在始终显示的 UI 图层中。在该对象中,像 HP 条一样显示当前的击破计数,这样就能解决“不知道还需要击败多少敌人”的问题。接下来,我们将按照以下步骤进行制作:创建“项目变量”和“剩余敌人数”,在“敌人”的“消失”状态中添加击破计数动作,最后放置通关演出对象。
“项目变量”位于数据库中。让我们立即添加它。

将打开一个名为“数据管理窗口”的新窗口。
打开名为“用户数据库”的选项卡,然后切换到“项目变量”选项卡。
窗口底部将出现一行名为“variables1”的新行,请将其重命名为“剩余敌人数量”。
由于敌人数量为 5,请将“值”设置为 5.0。
在 ACTION GAME MAKER 中,操作变量需使用“更改属性”动作。因此,可以通过四则运算(加、减、乘、除)来修改变量。例如,将“剩余敌人数量”、“减”、“1”组合即可实现该功能。
打开场景标签页“enemy”,并将编辑器界面切换至“Script”。
选择“消亡”状态,点击“+添加执行动作”。
选择“更改属性”动作。
按如下方式设置:
目标对象类型:项目数据库
数据库类型:项目变量
记录名称:剩余敌人数量
计算公式:―=
常量值:1
请注意,设置项共有 5 处。
完成此设置后,执行该动作时,项目变量“剩余敌人数量”将执行减 1 操作。
点击“更改属性”动作旁边的三条横线图标并拖动,将顺序调整为“更改属性”排在最前面。
补充:为什么使用“―=”而不是单纯的“―”?
这种写法在编程中是常见的,但“―=”实际上是某个表达式的简写形式。
它省略了“之前的剩余敌人数量”-“1”=“新的剩余敌人数量”这一表达式中的“-”和“=”。
如果缺少“=”,系统将无法指定将“之前的剩余敌人数量”减去“1”后的结果保存到哪个变量中。
我们将创建一个用于管理剩余敌人数量的 UI 对象。
该对象将显示“当前剩余敌人数量”的值,并在数值变为 0 时执行通关演出。为了清晰起见,请在 Sprite2D 显示的“敌人图标”旁边,通过动作显示变量“剩余敌人数量”。敌人图标的图像可以直接使用敌人的精灵图。
将编辑器界面切换为"2D"模式。
打开一个新的场景标签页,创建根节点:选择“游戏对象”。
将对象名称设置为“剩余敌人数量管理”,模板使用"UI",类型(类)设置为“空”,然后点击创建按钮。
从“文件系统”中将用于敌人精灵图的"enemy.png"拖放到编辑器界面原点(红线与绿线交点)左侧的空间中。
系统会自动添加一个名为 Enemy 的 Sprite2D 节点。在 Godot 引擎中,直接将图像文件放置到编辑器界面时,会自动生成 Sprite2D 节点,并将其自动设置为纹理。
首先,我们只考虑变量显示。似乎只需要一个名为“计数”的状态来显示“剩余敌人数量”变量即可。
显示变量时,请使用“显示文本”操作。
通过场景窗口的“
+”按钮附加脚本。
创建 剩余敌人数量管理.vs 文件。
将默认状态 001 重命名为“计数”。
选择执行操作“显示文本”。
基本设置如下:
文本类型:变量
变量来源:数据管理
数据库类型:项目变量
记录名称:剩余敌人数量
持久化:开
字体:新建 SystemFont
字体大小:64
显示区域:x=80, y=80
上(左、右、下)边距:全部为 0
水平对齐:居中
垂直对齐:居中
补充说明:“显示文本”操作的布局
此操作会创建一个以基准点为中心、指定大小的文本框,并在其中显示指定时间的文本(变量)。显示基准点的“此对象中心”即原点(红色和绿色线条相交的点)。
在本例中,将创建一个以原点为中心的 80x80 像素文本框,以居中方式显示变量,且显示时间为永久。
将对象放置到场景中,测试“计数”是否正确显示。由于希望始终显示,因此应将其放置在 UI 图层。
切换到场景标签中的 stage1,并将编辑器画面切换为 2D 模式。
选中 UI (CanvasLayer) 中的 SimplaGauge 节点。
在文件系统中选择 剩余敌人数量管理.tscn,将其拖放到 UI 图层显示区域(蓝色框)的右上角附近。
无法正常工作时的检查清单
图标和数字均未显示:请确认是否正确放置在 UI 图层,并且位于蓝色框范围内。
图标存在但数字未显示:请检查“剩余敌人数量管理”对象中图标是否正确放置在原点附近,以及“计数”状态中“显示文本”操作的内容是否正确。
击败敌人后数字未变化:请确认 enemy 对象的消失状态处理顺序是否正确,即先执行“更改属性”,再执行“自身消失”。
接下来是通关特效。这里也可以使用“显示文本”操作。
在屏幕中央大字显示“STAGE CLEAR”,看起来就会很有通关的感觉。
转移条件可以设定为:变量“剩余敌人数”变为 0。
将场景标签切换为“剩余敌人数管理”,将编辑器画面切换为 Script。
在计数状态附近点击“添加状态”。
将标题重命名为“关卡通关”。
点击“+添加执行操作”。
选择“显示文本”操作。
按如下方式进行设置。(由于设置项较多,请注意。)
正文:“STAGE CLEAR”
持久化:开
字体:新建 SystemFont
字体大小:96
显示区域:x=1200, y=120
水平对齐:居中
垂直对齐:居中
显示基准点:以场景为基准
锚点:居中
什么是“以场景为基准”的显示基准点?
这不是以该游戏对象的位置为基准,而是以整个游戏场景,即相机显示的区域为基准。在这种情况下,STAGE CLEAR 的文字将以居中对齐的方式显示在场景中央、宽 1200、高 120 的区域内。
右键点击计数状态,选择“添加链接”,连接到“关卡通关”状态。
选择“+添加其他条件”按钮。
选择“开关/变量发生变化”条件。
变量类型:变量
数据类型:项目变量
数据库记录名:剩余敌人数
变量运算符:=
请进行上述设置,这样当剩余敌人数为 0 时就会发生转移。
首先,由于敌人数量不足,请将其增加到 5 个,然后测试通关特效是否正确显示。
将场景标签切换为 stage1,将编辑器画面切换为 2D。
选中 BaseLayer 的子节点,如 enemy 节点或 player 节点等。
从文件系统中将 enemy.tscn 拖拽并放置到场景中。
重复步骤 1~3,直到放置完 enemy5 即可。
尝试测试运行。
如果设置正确,击败所有敌人后应该会显示 STAGE CLEAR 字样。
无法顺利运行时的检查清单
明明放置了 5 个敌人却不见了:可能是掉落到了画面外。请检查是否正确放置在地板上,以及“模板移动的台阶不掉落”选项是否已开启。
计数变为 0 后没有任何反应:请确认“关卡通关”状态的内容以及转移条件是否正确。