教程:从零开始的ACTION GAME MAKER 第四章

第四章:让游戏“成立”

上次我们完成了发射子弹击倒敌人的游戏基本操作。

本次将讲解如何让游戏“真正可玩”。

思考作为游戏还缺少什么

在当前版本中,我们已经实现了玩家移动和敌人功能,但仍存在若干不足。

首先,舞台过于狭窄,似乎需要将其扩大。

此外,虽然玩家有受击反应,但处于“不会受伤”的状态。由于不清楚当前的生命值(HP),需要将其显示出来。

最后,游戏缺乏“目标”。原本想加入Boss战等内容,但本次我们简化为“击倒5个敌人即通关”。

完成效果预览

扩展 Stage1

首先,通过涂色扩展瓷砖来扩大舞台。舞台变宽后,玩家可能会超出摄像机的范围,因此似乎需要让摄像机跟随玩家移动。

涂色扩展瓷砖

瓷砖是通过 Base(TileMapLayer) 节点创建的,请使用该节点进行扩展。

  1. 切换到 stage1 场景标签页。

  2. 在场景窗口中选择 Base(TileMapLayer) 节点。

  3. 在下方的“瓷砖放置”窗口中选择瓷砖。

  1. 尝试在右侧空间中自由放置瓷砖。为了便于轻松跳跃,空中的平台和墙壁高度请控制在 4 格以内,陷阱的宽度也请保持在 4 格左右。

完成一定程度的制作后,即可进入下一步。

让相机跟随玩家。

相机跟随功能通过“目标 ID”系统实现。您是否记得在创建玩家时添加了“CameraTargetSettings”节点?在该节点中,可以通过属性设置“目标 ID”。

ACTION GAME MAKER 的相机节点“ZoomCamera2D”同样支持设置“目标 ID”,其设计逻辑是跟随具有相同“目标 ID"的游戏对象。

现在,让我们为“ZoomCamera2D”和“CameraTargetSettings”设置“目标 ID”。

为 IntialCamera(ZoomCamera2D) 节点设置目标 ID。

  1. 在 Stage1 的场景标签页中,选择 IntialCamera(ZoomCamera2D) 节点。

  2. 展开检查器中的“目标 ID”数组…

  3. 点击“添加元素”按钮。

  1. 会出现“”字符串,请删除该文字并输入“player”。

为玩家的“CameraTargetSettings”节点添加目标 ID。

  1. 将场景标签页切换到“player”。

  2. 选择“CameraTargetSettings”节点。

  3. 在检查器的“目标 ID”中输入“player”。

测试扩大的关卡。

请通过测试游玩来验证功能是否正常,并尝试到达关卡的右端。

如果一切正常,相机应该会跟随玩家移动。

检查清单

如果相机不跟随:请检查 Stage1 中的 InitialCamera 和 player 的 CameraTargetSettings。

如果无法到达关卡右端:请在 Base(TileMapLayer) 中调整陷阱的大小或墙壁的高度。

为角色添加“倒下”效果:创建粒子效果

与敌人一样,当角色的生命值(HP)降为0时,也应进入“倒下”状态。由于没有现成的“倒下”状态动画帧,我们可以使用“粒子”效果来呈现这一状态。

什么是“粒子”?

“粒子”在日语中意为“微粒”。通过散布大量小图像来制作特效。您可以将其想象成撒纸屑的效果。您可以自由调整纸屑的外观和飞行方式。

在 Godot Engine 中,可以使用“GPUParticle2D”和“CPUParticle2D”节点来实现。而在 ACTION GAME MAKER 中,则可以通过“ParticleObject”节点来处理。

此外,“ParticleObject”还支持20多种粒子模板。

创建粒子对象

创建方法与游戏对象完全相同:

  1. 创建一个新的场景标签页。

  2. 在“创建根节点”中选择“游戏对象”。

  3. 将对象名称设置为“倒下粒子”,模板选择“粒子”,然后点击“创建”。

  4. 在场景窗口中选择已创建的“倒下粒子”节点。

  5. 在检查器中,将粒子模板从“无”更改为“烟花※粒子较多”。

  1. 系统将自动添加一个名为“GPUParticles2D”的节点。

  2. 在 GPUParticles2D 的检查器中,勾选“Emitting”(发射)。这是控制粒子发射的属性。

  1. 此时场景画面中应会发射出粒子并显示烟花效果。右键点击场景标签页中的[未保存](*),将“倒下粒子.tscn”保存起来。

为玩家的视觉脚本添加“倒下”状态

关于“倒下”状态的考量

当HP变为0时,最好设置为无法移动并释放“倒下粒子”。链接似乎应该从AnyState连接,但这里有一个问题。如下图所示,无论处于“何种状态”,只要“受到攻击”,都会转移到“受击”状态。

HP变为0意味着敌人正在攻击,因此即使处于“倒下”状态,若受到攻击,仍可能转移到“受击”状态。

因此,请按照以下方式,在通往“受击”的链接条件中添加“HP不为0”,以防止转移。

创建“倒下”状态

由于没有合适的动画,我们将复用“受击”动画。但如果完全相同,则无法判断是否处于倒下状态,因此请使用改变物体外观的“滤镜”功能,使其外观也发生变化。

  1. 打开Player场景。
  2. 将编辑器画面从2D更改为Script。
  3. 在“受击”信息空间中添加“状态”。
  4. 将状态名称更改为“倒下”。
  5. 将动画类别名称设置为“受击”。

  1. 展开“动作设置”。
  2. 将“不接受移动输入”属性开启。

  1. 选择“+ 添加执行动作”按钮。
  2. 选择“显示粒子”动作。
  3. 点击粒子对象路径旁的:page_with_curl:图标,选择之前创建的“倒下粒子.tscn”。

  1. 选择“添加”按钮。
  2. 再次选择“+ 添加执行动作”按钮。
  3. 选择“设置滤镜”。
  4. 将滤镜类型更改为“透明”,并将完成时间(秒)设置为3.0秒。这样将在3秒内逐渐变透明。

  1. 按下“添加”按钮,如果如下所示,则状态创建完成。

创建从AnyState到“倒下”状态的链接

  1. 右键点击AnyState,选择“添加链接”,并连接到“倒下”。
  2. 点击“+ 添加其他条件”按钮。

  1. 选择“HP变为0”条件并点击“添加”。

添加通往“受击”的转移条件

最后,添加通往“受击”的转移条件。通过启用通用设置中的“反转条件”,可以将条件取反。也就是说,“HP变为0”条件通过此设置可变为“HP不为0”。

  1. 选择AnyState→“受击”的链接。
  2. 选择“添加其他条件”按钮。
  3. 选择条件“HP变为0”。
  4. 开启“反转条件”并添加。

  1. 如果其他条件栏如下所示,则没问题。如果“反转”选项已启用,请检查“≠”图标是否变白,以确认反转是否正确生效。

测试“倒下”效果

让我们进行测试。目前HP初始值仅为1,因此只要受到一次敌人攻击,应该会进入“倒下”状态。

如果设置正确,当受到敌人攻击时,粒子将显示,玩家会逐渐变透明。倒下后,可以按“F5”键进行重置。

无法正常运行时的检查清单

烟花粒子不显示:请检查“倒下粒子”对象的内容以及“显示粒子”动作。

不变透明:请检查“设置滤镜”的内容。

出现受击反应:请检查链接条件。

制作“HP 条”

好了,一击必杀太严格了,让我们增加 HP 的数值吧。这样一来,就需要知道当前还剩多少 HP,所以我们要制作一个 HP 条。

在 ACTION GAME MAKER 中,可以使用 SimpleGauge 和 ImageGauge 节点来显示进度条,这次我们使用 SimpleGauge。

但是,由于相机是移动的,如果将 HP 条放置在玩家同一层级,它就会被甩在后面。像 HP 条这样需要始终显示的内容,请使用“UI”层级。

关于“UI”层级

还记得之前的说明吗?ACTION GAME MAKER 的层级结构如下所示,UI 层级和屏幕效果层级是“不受相机影响的特殊层级”。也就是说,放置在这些层级中的节点会始终显示,因此非常适合放置 HP 条。屏幕效果层级是用于“屏幕效果”动作的特殊层级,所以请将 HP 条放置在 UI 层级中。

将玩家的“体力”和“最大体力”值设为 10。

  1. 选择玩家的 BaseSettings 节点。
  2. 在检查器中将“体力”和“最大体力”的值从 1 更改为 10。

添加并设置"SimpleGauge"节点。

  1. 将场景标签切换到 stage1,并将编辑器画面从 Script 切换回 2D。
  2. 选择 UI 节点。
    图片 151
  3. 点击场景窗口左上角的 +(添加子节点)按钮。
  4. 选择 SimpleGauge 并点击“创建”。
  5. 首先调整位置。目前它应该处于如下所示的压扁状态。
  6. 拖动橙色的点,将其放大到图片所示的大小。
  7. UI 层级的显示范围是由以下细蓝线包围的区域。请将进度条移动到该范围内的左上角附近。
  8. 接下来,设置此进度条以显示玩家的 HP。请将检查器窗口中的变量类型设置为“指定对象”。
  9. 点击新出现的“指定目标对象路径”旁边的 :page_with_curl: 图标。
  10. 选择 player.tscn 并点击“打开”。
  11. “变量名”栏默认应已填入 hp,因此无需更改。此栏用于指定作为“当前值”使用的变量。
  12. 接下来,请勾选“使用变量作为最大值”。
  13. 重复步骤 9~10,指定 player.tscn。
  14. 作为最大值的变量应该包含 object_id,请点击并将其更改为 max_hp。这样,最大 HP 就被指定为进度条的最大值了。

测试"HP 条”

点击测试播放按钮进行测试。如果设置正确,当受到敌人攻击时,应该会触发伤害反应,HP 条也会减少。

无法正常工作时的检查清单

看不到进度条:请确认 SimpleGauge 是否正确成为了 UI 层级的子节点,以及是否放置在蓝线范围内。

HP 一开始就很少:请确认玩家的 BaseSettings 中的“体力”值是否已修正为 10。

HP 是最大值却一击归零:请确认 BaseSettings 中的“最大体力”值是否为 10,以及 SimpleGauge 的“作为最大值的变量”是否已正确指定。

设置“坠落死亡”

您可能在测试游戏中已经注意到,目前掉入陷阱后会持续下落。让我们实现掉入陷阱即死亡的功能。

只需限制摄像机的移动范围,防止其无限跟随,并设置当摄像机移出范围时触发“死亡”状态即可。

限制 InitialCamera (ZoomCamera2D) 的移动范围

  1. 选择 InitialCamera 节点。

  2. 在检查器中展开“限制值”。

  1. 将“下”限制值从 10000000 改为 500。这样,摄像机向下最多只能移动 500 像素(红线以下)。

  1. 进行测试运行。如果设置正确,摄像机应能跟随左右和上下移动,但在向下方向上,超过一定位置后将不再跟随。

如果遇到问题,请检查以下事项:

摄像机画面变黑:可能是图块相对于原点(红线与绿线交点)发生了偏移。尝试将摄像机的限制值改为 1000、2000 等,以找到合适的数值。

在玩家视觉脚本中添加“坠落死亡”

“死亡”状态本身已存在,只需在链接中添加新条件“超出摄像机范围”即可。

  1. 将场景标签切换到“玩家”,编辑器画面切换到“脚本”。

  2. 选择 AnyState → 死亡的链接。

  3. 点击“添加其他条件”。

  1. 选择条件“超出摄像机范围”。

  2. 将数据类型从“未设置”更改为“自身”。

  3. 将“与前一个条件的逻辑关系”更改为OR并添加。

  1. 确认设置如下所示,并确保“超出摄像机范围”条件与前一条件之间是“OR”关系。

测试“坠落死亡”

进行测试运行并让角色坠落。如果掉入陷阱并在超出范围时看到烟花粒子效果,则说明成功。

如果遇到问题,请检查以下事项:

确认 AnyState → 死亡链接中的条件是否正确设置为"HP 为 0"、“或”、“超出摄像机范围”。

思考“击败5个敌人即通关”:变量的使用方法

我们需要通过某种方法来计数数字“5”。这个数字会在每次击败敌人时减少,当数字变为0时,触发通关演出,这似乎是我们想要实现的目标。在这种情况下,游戏制作中会使用“变量”这一概念。

什么是“变量”?

“变量”就像一个用来存放数值的容器。之前提到的体力(HP)实际上也是一个变量,当“受到敌人攻击”时,体力容器中的数值会减少1。

在 ACTION GAME MAKER 中设置变量主要有两种方法:一种是使用对象的 VariableSettings 节点,另一种是使用数据库中的“项目变量”。之前提到的“体力”属于前者。

“VariableSettings 的变量(对象变量)”与“项目变量”的区别

“对象变量”是对象专用的容器,而“项目变量”则是任何人都可以在任何地方使用的通用容器。

主要区别在于:“对象变量”依附于对象,因此当对象消失时,变量也会随之消失;而“项目变量”只要在同一项目内就可以使用。与对象绑定的数据,如“体力”或“攻击力”,应使用对象变量;而希望在切换存档时也能保存的数据(如“最高分”),或需要在多个关卡之间保持的数据(如“金币数量”或“剩余生命数”),则应使用“项目变量”。

那么,“剩余敌人数量”应该使用哪种变量?

原则上两者都可以,但由于可能需要从多个对象进行操作,这次我们将使用“项目变量”来实现。

当敌人进入“消失”状态时,将“剩余敌人数”减1。当“剩余敌人数”变为“0”时,执行通关演出。这样应该就能实现目标。

实现通关演出的方法

最好创建一个专门用于检查剩余敌人数量的游戏对象,并将其放置在始终显示的 UI 图层中。在该对象中,像 HP 条一样显示当前的击破计数,这样就能解决“不知道还需要击败多少敌人”的问题。接下来,我们将按照以下步骤进行制作:创建“项目变量”和“剩余敌人数”,在“敌人”的“消失”状态中添加击破计数动作,最后放置通关演出对象。

向“项目变量”添加“剩余敌人数量”。

“项目变量”位于数据库中。让我们立即添加它。

  1. 点击屏幕左上角菜单中的“数据库”按钮。

图片168

  1. 将打开一个名为“数据管理窗口”的新窗口。

  2. 打开名为“用户数据库”的选项卡,然后切换到“项目变量”选项卡。

  1. 点击窗口左上角的“+”按钮。

  1. 窗口底部将出现一行名为“variables1”的新行,请将其重命名为“剩余敌人数量”。

  2. 由于敌人数量为 5,请将“值”设置为 5.0。

  1. 点击“确定”并关闭窗口即可完成。
1 个赞

为“enemy”对象的“消亡”状态添加动作。

在 ACTION GAME MAKER 中,操作变量需使用“更改属性”动作。因此,可以通过四则运算(加、减、乘、除)来修改变量。例如,将“剩余敌人数量”、“减”、“1”组合即可实现该功能。

  1. 打开场景标签页“enemy”,并将编辑器界面切换至“Script”。

  2. 选择“消亡”状态,点击“+添加执行动作”。

  1. 选择“更改属性”动作。

  2. 按如下方式设置:

目标对象类型:项目数据库
数据库类型:项目变量
记录名称:剩余敌人数量
计算公式:―=
常量值:1

请注意,设置项共有 5 处。

完成此设置后,执行该动作时,项目变量“剩余敌人数量”将执行减 1 操作。

  1. 最后,调整执行动作的顺序。目前显示顺序应如下所示,但由于执行动作是按“从上到下”的顺序执行的,若不调整,将在“更改属性”之前触发“消亡”,导致修改无效。

点击“更改属性”动作旁边的三条横线图标并拖动,将顺序调整为“更改属性”排在最前面。

补充:为什么使用“―=”而不是单纯的“―”?

这种写法在编程中是常见的,但“―=”实际上是某个表达式的简写形式。

它省略了“之前的剩余敌人数量”-“1”=“新的剩余敌人数量”这一表达式中的“-”和“=”。

如果缺少“=”,系统将无法指定将“之前的剩余敌人数量”减去“1”后的结果保存到哪个变量中。

创建 UI 对象“剩余敌人数量管理”

我们将创建一个用于管理剩余敌人数量的 UI 对象。

该对象将显示“当前剩余敌人数量”的值,并在数值变为 0 时执行通关演出。为了清晰起见,请在 Sprite2D 显示的“敌人图标”旁边,通过动作显示变量“剩余敌人数量”。敌人图标的图像可以直接使用敌人的精灵图。

  1. 将编辑器界面切换为"2D"模式。

  2. 打开一个新的场景标签页,创建根节点:选择“游戏对象”。

  3. 将对象名称设置为“剩余敌人数量管理”,模板使用"UI",类型(类)设置为“空”,然后点击创建按钮。

  1. 创建完成后请保存。

  1. 从“文件系统”中将用于敌人精灵图的"enemy.png"拖放到编辑器界面原点(红线与绿线交点)左侧的空间中。

  2. 系统会自动添加一个名为 Enemy 的 Sprite2D 节点。在 Godot 引擎中,直接将图像文件放置到编辑器界面时,会自动生成 Sprite2D 节点,并将其自动设置为纹理。

设置“剩余敌人数量管理”的视觉脚本。(变量显示篇)

首先,我们只考虑变量显示。似乎只需要一个名为“计数”的状态来显示“剩余敌人数量”变量即可。

显示变量时,请使用“显示文本”操作。

创建“计数”状态

  1. 通过场景窗口的“:page_with_curl:+”按钮附加脚本。

  2. 创建 剩余敌人数量管理.vs 文件。

  1. 将默认状态 001 重命名为“计数”。

  2. 选择执行操作“显示文本”。

基本设置如下:

文本类型:变量

变量来源:数据管理

数据库类型:项目变量

记录名称:剩余敌人数量

  1. “布局与操作”部分的设置如下:

持久化:开

字体:新建 SystemFont

字体大小:64

显示区域:x=80, y=80

上(左、右、下)边距:全部为 0

水平对齐:居中

垂直对齐:居中

补充说明:“显示文本”操作的布局

此操作会创建一个以基准点为中心、指定大小的文本框,并在其中显示指定时间的文本(变量)。显示基准点的“此对象中心”即原点(红色和绿色线条相交的点)。

在本例中,将创建一个以原点为中心的 80x80 像素文本框,以居中方式显示变量,且显示时间为永久。

“计数”的测试

将对象放置到场景中,测试“计数”是否正确显示。由于希望始终显示,因此应将其放置在 UI 图层。

  1. 切换到场景标签中的 stage1,并将编辑器画面切换为 2D 模式。

  2. 选中 UI (CanvasLayer) 中的 SimplaGauge 节点。

  3. 在文件系统中选择 剩余敌人数量管理.tscn,将其拖放到 UI 图层显示区域(蓝色框)的右上角附近。

  1. 进行测试运行,确认“剩余敌人数量 5”正常显示,并且在击败敌人后数字变为 4。

无法正常工作时的检查清单

图标和数字均未显示:请确认是否正确放置在 UI 图层,并且位于蓝色框范围内。

图标存在但数字未显示:请检查“剩余敌人数量管理”对象中图标是否正确放置在原点附近,以及“计数”状态中“显示文本”操作的内容是否正确。

击败敌人后数字未变化:请确认 enemy 对象的消失状态处理顺序是否正确,即先执行“更改属性”,再执行“自身消失”。

制作通关特效

接下来是通关特效。这里也可以使用“显示文本”操作。

在屏幕中央大字显示“STAGE CLEAR”,看起来就会很有通关的感觉。

转移条件可以设定为:变量“剩余敌人数”变为 0。

  1. 将场景标签切换为“剩余敌人数管理”,将编辑器画面切换为 Script。

  2. 在计数状态附近点击“添加状态”。

  3. 将标题重命名为“关卡通关”。

  4. 点击“+添加执行操作”。

  1. 选择“显示文本”操作。

  2. 按如下方式进行设置。(由于设置项较多,请注意。)

正文:“STAGE CLEAR”

持久化:开

字体:新建 SystemFont

字体大小:96

显示区域:x=1200, y=120

水平对齐:居中

垂直对齐:居中

显示基准点:以场景为基准

锚点:居中

什么是“以场景为基准”的显示基准点?

这不是以该游戏对象的位置为基准,而是以整个游戏场景,即相机显示的区域为基准。在这种情况下,STAGE CLEAR 的文字将以居中对齐的方式显示在场景中央、宽 1200、高 120 的区域内。

  1. 右键点击计数状态,选择“添加链接”,连接到“关卡通关”状态。

  2. 选择“+添加其他条件”按钮。

  1. 选择“开关/变量发生变化”条件。

  2. 变量类型:变量
    数据类型:项目变量
    数据库记录名:剩余敌人数
    变量运算符:=

请进行上述设置,这样当剩余敌人数为 0 时就会发生转移。

测试通关特效

首先,由于敌人数量不足,请将其增加到 5 个,然后测试通关特效是否正确显示。

  1. 将场景标签切换为 stage1,将编辑器画面切换为 2D。

  2. 选中 BaseLayer 的子节点,如 enemy 节点或 player 节点等。

  3. 从文件系统中将 enemy.tscn 拖拽并放置到场景中。

  1. 重复步骤 1~3,直到放置完 enemy5 即可。

  2. 尝试测试运行。

如果设置正确,击败所有敌人后应该会显示 STAGE CLEAR 字样。

无法顺利运行时的检查清单

明明放置了 5 个敌人却不见了:可能是掉落到了画面外。请检查是否正确放置在地板上,以及“模板移动的台阶不掉落”选项是否已开启。

计数变为 0 后没有任何反应:请确认“关卡通关”状态的内容以及转移条件是否正确。

第四章回顾

那么,本次我们学习了“摄像机跟随机制”、“粒子效果”、“UI”和“变量”,使游戏具备了实际运行的功能。

然而,目前的表现效果仍显平淡,且没有音效。

在下一章(第五章)中,我们将进行“音效设置”和“背景设置”等操作,提升游戏的完成度,并尝试输出为任何人都可以游玩的版本。