教程:“从零开始使用ACTION GAME MAKER” – 第2章

第 2 章:让我们创建一个简单的舞台!

第 2 章的目标

从这里开始,我们将实际构建一个动作射击游戏
在本章中,我们将逐步创建一个简单的舞台,其中:

  • 玩家角色可以行走和跳跃

到本章结束时,您将得到如下所示的示例效果。


工作流程

  1. 首先,我们需要一个用于舞台本身的场景

  2. 在该舞台内,我们将放置角色可以行走和跳跃的平台

  3. 接下来,我们将创建一个角色场景,然后使用可视化脚本为其添加移动功能。

了解“游戏场景”和“游戏对象”

在第 1 章中,我们仅使用 Godot Engine 的功能创建了所有内容。
从这一点开始,我们将开始使用 ACTION GAME MAKER 的附加功能来构建我们的游戏。

在 Godot Engine 中,您通常通过逐个将节点添加到根节点来创建角色、关卡和其他元素。然而,这可能非常耗时。

为了简化操作,ACTION GAME MAKER 提供了两种主要的预设场景类型:

  • 游戏场景 (Game Scene)

    • 游戏场景是用于关卡或赛道的场景。
  • 游戏对象 (Game Object)

    • 游戏对象是用于玩家、敌人、物品及类似元素的场景。

在 ACTION GAME MAKER 中,您通过在游戏场景内放置游戏对象来创建游戏。


如何识别 ACTION GAME MAKER 添加的功能

由 ACTION GAME MAKER 添加的功能(例如游戏场景游戏对象)均标有蓝橙双色图标
每当您看到这些彩色节点或按钮时,即表示它们是 ACTION GAME MAKER 的功能。

相比之下,原始的 Godot 节点使用单色图标(白色、蓝色、绿色等),尽管少数节点可能使用多种颜色。

创建“游戏场景”

让我们开始设置一个游戏场景


步骤

  1. 场景选项卡中,点击**“+”(添加新场景)**按钮。

  2. 在场景窗口中,在创建根节点下,选择游戏场景

  3. 场景窗口中将自动出现大量节点。这些是构成游戏场景的预设节点

  4. 由于这是一个新场景,让我们保存它。

  5. 因为这是一个关卡(课程)场景,将其保存为stage1.tscn


游戏场景的结构

你可能会注意到突然添加了大量节点——但每个节点具体是做什么的呢?

动作游戏制作器中,游戏场景是使用“层级”的概念来组织的

层级是表达深度的一种方式,类似于剧院舞台:

  • 背景层(背景布景)位于最后方。
  • 角色层位于中间,演员在此表演。
  • 前景层位于前方,道具放置在最靠近观众的位置。

当“通过放置在前方的一台摄像机”观看时,这些层级共同构成了游戏的场景。

动作游戏制作器提供了七个默认层级。每个层级都有不同的名称和图标,功能略有不同,但它们按照下图所示堆叠。

默认情况下,每个层级都已放置了最少必要的预设节点,以及一个捕捉整个场景的摄像机


“SceneLayer”节点与“UI”/“PostEffectLayer”节点的区别

如果你仔细观察这七个图标的细节,会发现它们存在一些差异。从广义上讲,有两种类型:

  1. BaseDistantView的五个层级,它们是SceneLayer节点的子节点。
  2. 两个层级UIPostEffectLayer

区别在于:

  • SceneLayer 节点代表具有深度的空间,其中所见内容会根据摄像机的位置而变化。
  • UI 和 PostEffectLayer 节点无论摄像机位置如何,始终显示在摄像机中。

使用剧院类比:

  • 舞台本身SceneLayer
  • 放置在摄像机镜头前的滤镜UIPostEffectLayer

设置“初始场景”

在 ACTION GAME MAKER 中,场景通过专用的场景过渡系统进行管理。
该系统允许您定义场景之间如何连接,使用类似于视觉脚本的操作。

首先,让我们将刚才创建的场景设置为初始场景,这是游戏启动时显示的第一个场景。


步骤

  1. 在屏幕顶部中央,将编辑器模式切换为SceneTransition

    • 此按钮会更改中央编辑器窗口中显示的内容。
  2. 将出现一个空白网格。

    • 从左下角的文件系统面板中,将之前保存的场景(stage1.tscn)拖放到网格上。

  3. 如果stage1.tscn现在出现在网格上,则完成设置。

  4. 从顶部中央按钮切换回2D模式,以返回之前的视图。

    image

    • 现在,当游戏启动时,stage1将作为第一个场景显示。

注意:如果不设置初始场景会发生什么?

在 ACTION GAME MAKER 中,一个名为core.tscn的特殊场景始终在后台运行。
通常情况下,它会加载并显示指定的游戏场景。

如果您未设置初始场景,则只会显示core.tscn——这意味着游戏将以空白屏幕启动。

设置图块

现在,让我们为舞台创建平台。

我们需要一个地面和一些可供跳跃的悬浮平台。虽然有多种方法可以使用不同的节点来创建平台,但由于我们将构建一个具有多种形状的大型舞台,因此我们将使用专为这一目的设计的节点:图块(tiles)

图块就像地板砖一样——一种在网格中重复的小图像,用于构建更大的结构,例如平台。


将图块图像导入文件系统

首先,让我们准备图块图像。

通过右键点击并保存来下载提供的图像。

tile

正如第 1 章所解释的,Godot 引擎仅支持放置在项目文件系统内的资源。
可以将文件系统想象为一个仓库,您的游乐园材料必须存放在这里才能被使用。

导入方法很简单:只需将文件拖放到编辑器中即可。

  1. 保持 PC 上包含下载图像的文件夹打开。

  2. 在编辑器中,转到文件系统面板(左下角)并选择 res://

    • 导入的文件将存储在您所选的文件夹中。
  3. tile.png 从您的 PC 文件夹拖入编辑器窗口。


选择放置图块的图层

接下来,让我们决定将图块放置在哪个图层中。
我们将使用基础图层(BaseLayer),这是专为地面图块设计的默认图层。

在基础图层内部,您会看到三个节点:BaseBaseDecorationBaseCover
这些实际上是TileMapLayer 节点,只是重命名了。

为什么要有同一节点的三个版本?

  • 这样您可以将图块堆叠在一起以创建深度感。

  • 例如,您可能想在地板图块上方放置一个火炬。

  • 如果只有一个图层,放置火炬会覆盖地面图块。

  • 如果有多个图层,您可以将它们堆叠在一起,同时显示地面和装饰。

现在,选择名为 Base 的节点来放置图块。

在底部,您会看到一个面板,显示类似以下内容:
“未找到图块集(TileSet)。请在检查器中创建图块集。”


创建图块集(TileSet)

图块集(TileSet) 定义了您将在该 TileMapLayer 节点中使用的图块的基本信息:

  • 每个图块的大小形状

  • 角色是否可以与其碰撞或穿过它

我们准备的图块图像是一个 48×48 像素的正方形。它将作为玩家可以站立的平台,因此需要启用碰撞。

  1. 在**检查器(Inspector)**中,在 TileSet 旁边,点击 ,然后选择 新建图块集(New TileSet)

  2. 现在您可以编辑图块集属性。按如下方式设置:

    • 图块形状(Tile Shape):正方形

    • 图块大小(Tile Size):x = 48 px, y = 48 px

  3. 展开**物理图层(Physics Layers)**部分并点击 + 添加元素(Add Element)

  4. 碰撞图层 / 碰撞掩码(Collision Layer / Collision Mask) 保持为默认值。

    • 如果您的检查器看起来像添加了物理图层 0 的示例,则您的图块集设置已完成。


注意:碰撞图层和掩码

在 Godot 中,碰撞由两个设置决定:

  • 碰撞图层(Collision Layer):节点所属的组

  • 碰撞掩码(Collision Mask):该节点可以与哪些组发生碰撞

我们将在第 3 章中更详细地解释这一点。


配置图块

创建图块集后,底部的消息将更改为类似以下内容:
“图块集没有源(No source for TileSet)”

这意味着我们仍然需要为图块分配一个图像
我们还需要为它们设置碰撞形状(墙壁/地板)。

  1. 在底部面板中,将选项卡从 TileMap 切换到 TileSet

  2. tile.png 从文件系统面板拖入 TileSet 编辑器左侧的黑色框中。

  3. 将弹出一个新窗口。由于我们的图块是 48×48 的正方形,请设置 图块大小:x=48, y=48,然后点击 是(Yes)

  4. 下一个窗口将询问:“将图块格式设置为自动图块(Auto Tile)?”请选择 否(No)


注意:什么是图集和自动图块

图集(Atlas) 是一个包含许多较小图像(例如地板、墙壁、斜坡)的大型图像文件。
引擎只需加载一个大型图像并将其切片为图块,而不是处理许多单独的图像文件。
这提高了效率。

自动图块(Auto Tile) 是 ACTION GAME MAKER 独有的功能之一。
它会自动将按特定格式放置的图块图集整齐排列,但本次我们不会使用它。


为图块添加碰撞形状

  1. 在 TileSet 编辑器中,切换到顶部的 选择(Select) 选项卡。

    • 此选项卡允许您配置单个图块的详细设置。
  2. 在右侧,点击图块图像以选中它。

  3. 向下滚动并打开 物理 > 物理图层 0(Physics > Physics Layer 0)

    • 这是我们之前创建的物理图层。
  4. 点击 添加多边形工具(Add Polygon Tool) 按钮(带有“+”图标的正方形)。

    • 此工具用于添加顶点以绘制多边形。

    • 多边形只是通过连接点定义的形状。

  5. 点击绿色正方形的右上角。将出现一个菱形点。

  6. 以顺时针顺序对右下角、左下角和左上角执行相同的操作。

  7. 最后,再次点击您放置的第一个点(右上角)。

    • 图块将变为橙色,表示整个正方形已被标记为碰撞区域

故障排除

  • 如果点位置错误:使用 编辑点工具(Edit Point Tool)(带箭头图标的正方形)来移动点。

  • 如果添加了太多点:使用 删除点工具(Delete Point Tool)(带 X 图标的正方形)来删除多余的点。


:white_check_mark: 在此阶段,您已成功导入图块、创建图块集、分配图像并设置碰撞,使其可以充当平台。

放置图块

现在我们已经准备好了图块,让我们开始放置它们。
我们的目标是在摄像头的可见范围内创建地板和一些平台


步骤

  1. 查看屏幕中央的编辑器视图

    • 你应该会看到细紫色线条形成一个矩形,该矩形以红色和绿色线条交叉的点为中心。

    • 这个紫色矩形代表摄像头的可见区域

    • 首先,调整视图以确保摄像头区域完全可见。

  2. 在编辑器视图中,按住鼠标中键(滚轮点击)

    • 光标应变为十字形箭头。

    • 按住的同时移动鼠标以平移视图,直到紫色矩形完全可见。

    • 如果紫色矩形看起来太小或太大,请使用鼠标滚轮进行缩放,直到它完美地适应屏幕。

  3. 在底部面板中,将选项卡切换回TileMap(图块绘制)。

  4. 在底部面板的右侧,点击该图块以选中它。

  5. 将鼠标移动到编辑器视图中——图块应作为预览显示在光标下方。

    • 左键单击以放置图块。

    • 右键单击以擦除图块。

    • 如果无法执行操作,编辑器面板可能处于“移动模式”,请将其切换回“选择模式”。

      1. 绘制地板和平台,类似于下面的示例。

    • 不需要完全精确,但如果平台放置得太高,玩家的跳跃可能无法到达。

通过测试运行检查

让我们确认一下游戏中的效果。

  • 在右上角菜单中,点击运行项目 (F5)

  • 如果设置正确,场景应显示由图块构成的地板和平台。


故障排除清单

如果图块未按预期显示,请检查以下内容:

  • 图块是否放置在紫色矩形内(摄像头区域)?

  • 场景过渡 (SceneTransition) 中,初始场景是否正确设置为 stage1.tscn

设置输入映射(控制)

现在我们已经有了一个简单的舞台,下一步通常是创建玩家角色。但在这样做之前,让我们先配置输入映射(控制)

输入映射允许您定义:

  • “当按下此按钮或按键时,执行此操作。”

在本教程中,我们将创建一个简单的动作射击游戏,仅包含基本移动。目前,我们只需要四个操作:

  • 攻击

  • 跳跃

  • 向右移动

  • 向左移动

(稍后,您可以添加更多操作,如滑行、武器选择或爬梯子,但目前我们只需创建基本操作。)


步骤

  1. 从左上角的项目菜单中,打开项目设置

  2. 会出现一个窗口。将顶部的选项卡从常规切换到输入映射

  3. 在标有**“添加新操作”**的字段中输入名称。

  4. 输入 Right,然后单击右侧的 + 添加 按钮。

  5. 重复上述过程以添加以下操作:

  6. 接下来,单击操作 Right 最右侧的 + 按钮(添加事件)

  7. 会出现一个标题为**“为 Right 添加事件”**的窗口。按下键盘上的 →(右箭头) 键。

  8. 如果现在显示 Right 或 Right (Physical) 或 Right(Unicode),则说明成功。单击 确定

  9. 对其他操作重复相同步骤:

    • Left → 分配 ←(左箭头)

    • Jump → 分配 Z 键

    • Attack → 分配 X 键

      当您的输入映射如下面的截图所示时,即完成。

  10. 最后,单击 关闭 按钮以完成设置。

创建“游戏对象”场景

现在,让我们为我们的游戏对象创建一个场景。


步骤

  1. 就像创建Stage1时一样,点击编辑器顶部的**“+”(添加新场景)**按钮。

  2. 创建根节点下,选择游戏对象

  3. 将显示创建新游戏对象窗口。
    在ACTION GAME MAKER中,您可以从模板创建各种对象。
    请按如下方式设置:

    • 对象名称:Player

    • 模板:characters

    • 类型:2DSprite Character Base

    • 对象组:Player

    • 由输入设备操作的对象:开启

    • 添加CameraTargetSettings节点:开启

  4. 将生成一个包含多个节点的新场景。

  5. 为场景命名并保存。您可以直接将其保存为player.tscn

理解游戏对象的结构

乍一看,游戏对象中的许多节点可能会让人感到不知所措。
然而,这些节点大致可以分为三类


1. 名称中包含“设置”的节点

这些节点存储可以在 ACTION GAME MAKER 的可视化脚本 中访问和使用的数据。
通过在此处设置值——例如 HP、攻击力、移动速度和跳跃强度——您可以使它们可在可视化脚本中使用。


2. 名称中包含“碰撞”的节点

这些节点定义了用于碰撞检测的形状。例如:

  • CollisionShape2D → 与墙壁和地面的碰撞

  • AttackCollision → 攻击判定框的形状

  • HitCollision → 检测受到伤害时的形状


3. 与动画相关的节点

  • AnimationPlayer → 控制角色的动画

  • Sprite2D → 提供动画中使用的图像


在配置游戏对象时,您将使用这三组节点。


可视化脚本仅可设置在游戏对象上

ACTION GAME MAKER 的可视化脚本通过读取这些节点中的数据来工作。
因此,可视化脚本只能分配给 GameObject 节点(在本例中为 Player 节点)。


规划对象设置

在本节中,我们仅设置移动和跳跃
这意味着我们暂时不需要配置攻击或伤害。

目前我们只需要:

  • 玩家图像

  • 移动跳跃的动画

  • 移动速度

  • 跳跃强度

  • 移动按键

因此,在本部分中,我们将仅配置这些元素。

在 Sprite2D 上设置玩家精灵

让我们将玩家的图像应用到用于显示图像的 Sprite2D 节点上。我们将使用本教程提供的图像。


步骤

  1. 右键单击下方的图像并将其保存到计算机。

  2. 将下载的图像拖放到 文件系统 中以导入它。

  3. 选择将显示图像的 Sprite2D 节点。

  4. 在右侧的 检查器面板 中找到 Texture(纹理) 属性(当前设置为 <empty>)。
    将导入的 player.png 文件拖放到该属性上。

  5. 图像将会出现——但您会注意到 所有 9 个角色 同时显示。

    • 这是因为该文件是一个 精灵表(sprite sheet),即包含所有动画帧的单个图像(一种图集图像,类似于我们之前讨论过的瓦片)。

    • 我们需要将 精灵表分割 成更小的帧,并告诉 Godot 要显示哪一部分。


分割精灵表

  1. 在检查器中展开 Animation(动画) 部分。

  2. Hframes(水平帧数) 设置为 5,将 Vframes(垂直帧数) 设置为 2

  3. 尝试点击检查器中 Frame(帧) 属性的上/下箭头。

    • 每次点击时,显示的图像都会略有变化。

    • 游戏动画正是以这种方式创建的——像翻页书一样依次切换帧。


注意:为什么第一帧从 0 开始?

您可能会觉得奇怪,第一帧的标签是 0 而不是 1
在编程中,列表通常从 0 开始。
Godot 遵循相同的约定,因此帧编号也从 0 开始。

使用 AnimationPlayer 节点创建动画

在 Godot Engine / ACTION GAME MAKER 中,动画是使用 AnimationPlayer 节点创建的。
该系统采用基于时间轴的风格,类似于视频编辑。

在时间轴上,您可以创建轨道(用于图像、声音等),并放置关键帧(事件)。随着时间推移,AnimationPlayer 会执行其轨道上的每个关键帧。

可以将其想象成乐队的乐谱

  • 在第 1 秒,钢琴演奏 C 音。
  • 在同一时刻,小提琴演奏 D 音。

在这个类比中:

  • 轨道 = 乐器
  • 关键帧 = 演奏指令

我们需要创建的动画

本教程中,我们将创建三个基本动画:

  • Idle(待机) → 当没有输入时
  • Jump(跳跃) → 当按下跳跃按钮时
  • Move(移动) → 当输入左右方向时

我们将使用 AnimationPlayer 来创建这些动画。


步骤

  1. 在“场景”面板中,选择 AnimationPlayer 节点。

  2. 底部将出现一个新的 动画面板(类似于之前的瓦片编辑器)。

  3. 点击 动画按钮 并选择 新建

  4. 将弹出一个窗口,要求输入动画名称。首先输入 Idle。输入名称后按 确定

  5. 现在已创建 Idle 动画。

    • 我们将使用之前设置的精灵帧来构建动画。
  6. 选择 Sprite2D 节点。

    • 在 9 张图像中,Idle 仅使用左上角的帧。

    • 由于左上角的帧是 第 0 帧,我们只需将 Idle 动画设置为显示 第 0 帧

  7. 在检查器中,确认 动画 > 帧 设置为 0

    • 点击旁边的 :key:+ 按钮

      image

    • 这将插入一个 关键帧,将当前帧注册到活动动画中。

  8. 将弹出一个窗口。关闭“创建 RESET 轨道”,然后按 创建


注意:什么是 RESET 轨道?

RESET 轨道指定场景的初始状态。
例如,在 Idle 中,您可以将其设置为默认状态。
然而,ACTION GAME MAKER 通常不使用它,因此请保持其 关闭 状态。


  1. 时间轴上将出现一条名为 Sprite2D: frame 的轨道。

    • 在 0 秒处,设置了 player.png 的第 0 帧。
    • 当 Idle 动画开始时,将立即显示此图像。
    • 由于 Idle 仅使用一张图像,现在已完成。
  2. 重复步骤 1–8 以创建 Jump 动画。

  1. 最后,创建 Move 动画。
  • 与 Idle 和 Jump 不同,此动画使用 四帧

    • 底行的第一至第四张图像 → 第 5、6、7、8 帧。
  • 为了创建流畅的动作,我们将每 0.2 秒 切换一次帧,并循环播放动画。


创建 Move 动画

  1. 如前所述,创建一个名为 Move 的新动画。

  1. 将时间轴播放头移动到 0.2 秒(在显示时间的框中输入“0.2”)。

  2. 将 Sprite2D 的帧更改为 6,然后按 :key:+ 按钮 插入关键帧。

  1. 重复相同的过程:
  1. 调整 动画长度
  • 在动画面板的右上角,您会看到一个显示 1 的框(默认长度为 1 秒)。

  • 将其更改为 0.8,因为我们使用了 4 帧,每帧 0.2 秒。

  • 这确保了动画能够平滑循环。

  1. 启用循环。
  • 在时间框旁边,点击 循环按钮(圆形箭头)。

  • 这将使动画自动重复播放。


注意:循环与乒乓循环

  • 单击一次设置普通循环(动画从头开始重新播放)。

  • 再次单击启用 乒乓循环(动画向前播放,然后向后播放,再向前播放)。

    image


  1. 设置完成后,按 播放按钮 测试动画。
  • 如果运行流畅,则完成!

故障排除

  • 如果动画显示不正确:

    • 选择轨道上的每一帧并检查 字段。
    • 确保它们按顺序设置:5 → 6 → 7 → 8
    • 如果不是,请手动更改数字以进行修正。
  • 请仔细检查:

    • 动画是否设置为 循环
    • 长度是否设置为 0.8 秒

:white_check_mark: 至此,您已成功为您的玩家角色创建了 Idle、Jump 和 Move 动画

创建动画集

在 ACTION GAME MAKER 中,有一个称为动画集(Animation Set)的系统,它可以根据移动方向自动切换动画。

通过在动画集中为最多 8 个方向分配动画,您只需选择该集合一次,动画就会在向右、向左、向上等移动时自动切换。

对于我们的游戏,我们只需要两个移动方向:
目前,我们只有三个动画——待机(Idle)、跳跃(Jump)和移动(Move),并且它们都面向

不过,有一个选项可以自动翻转动画,该选项默认已启用。
这意味着我们无需创建单独的面向左的动画——系统会自动镜像它们。

此外,在这种情况下(仅需左右移动,且面向右的动画可以翻转),我们可以使用批量导入功能快速设置动画集。


步骤

  1. 场景面板中,选择玩家节点(GameObject 节点)。

    图像

  2. 检查器中,点击标有选择动画播放器(Select Animation Player)的按钮。

  3. 将弹出一个节点选择窗口——选择AnimationPlayer节点。

  4. 接下来,点击批量加载动画(Bulk Load Animations)按钮。

  5. 要确认一切是否正常,请展开动画集部分。

  6. 如果成功,您应该会在动画集中看到跳跃、待机和移动动画已列出。


故障排除

  • 如果动画未出现在集合中:

    • 返回分配动画播放器(Assign AnimationPlayer)并重新分配 AnimationPlayer 节点。

调整玩家设置

既然我们已经创建了动画,现在来配置玩家的设置。
我们需要完成三件事:

  1. 设置移动使用的按键

  2. 调整移动速度和跳跃力度

  3. 调整碰撞形状的大小以匹配角色身体


设置移动按键

让我们使用之前设置的输入动作来分配移动按键。

  1. 场景面板中,选择 MoveAndJumpSettings 节点。

  2. 检查器中,设置:


调整移动速度和跳跃力度

接下来,让我们将速度和跳跃力度调整为适合角色的数值。

  1. 保持选中 MoveAndJumpSettings 节点,查看检查器。

  2. Horizontal Speed(水平速度)的值从 100 改为 300

  3. 找到底部的 Jump Force(跳跃力度)属性。

    • 将其从 500 改为 700

    • 这意味着当按下跳跃按钮时,角色将以 每秒 700 像素 的速度向上弹起。


调整碰撞形状

CollisionShape2D 节点定义了角色用于与地面及其他物体碰撞的形状。
目前,该形状太小(比角色的头部还小),导致身体会陷入地面。
我们将调整其大小以覆盖整个精灵图。

  1. 场景面板中,选择 CollisionShape2D 节点。

    • 你会看到一个带有橙色控制点的小蓝色矩形——这是当前的碰撞形状。

    :warning: 如果角色当前显示的是 Jump(跳跃)或 Move(移动)帧,请将 AnimationPlayer 切换回 Idle(待机)。

    • 这样更容易将形状与身体对齐。
  2. 点击并拖动角落的 橙色控制点 来调整矩形大小。


:white_check_mark: 完成后,你的玩家将正确响应输入,以合适的速度移动和跳跃,并与地面发生碰撞而不会陷入其中。

使用可视化脚本移动角色

所有准备工作已完成——现在让我们使用可视化脚本(Visual Script)来控制玩家角色的移动。
首先,我们将附加(添加)一个可视化脚本到玩家身上。


附加可视化脚本

  1. 场景面板中,选择玩家节点(Player node,即 GameObject)。

  2. 点击**:scroll:+(附加脚本)**按钮。

  3. 将弹出一个新窗口,询问是附加VisualScript还是GDScript(标准编程脚本)。

    • 由于我们选择了玩家节点(GameObject),系统将自动选择VisualScript

    • 只需点击创建(Create)按钮。

  4. 编辑器视图将自动切换到脚本(Script)选项卡。

    • 您将看到两个框:State001AnyState

    • 这就是可视化脚本的工作区。


返回上一视图

如果您想返回上一屏幕,只需将顶部的选项卡切换回2D即可。
正如在场景过渡部分之前所解释的,顶部选项卡用于切换编辑器显示的内容。

image

创建状态

决定需要哪些状态

正如第 1 章所述,ACTION GAME MAKER 的可视化脚本是通过以下方式构建的:

  1. 为角色状态添加行为,以及

  2. 通过条件将这些状态相互连接(链接)。

对于我们的游戏,角色只需在舞台上走动并跳跃,我们只需要三个状态:

  • 待机 (Idle)

  • 移动 (Move)

  • 跳跃 (Jump)

通过连接这三个状态并在正确的条件下进行切换,我们可以创建玩家的动作。

让我们先准备待机移动跳跃状态,然后分配动画和行为。
我们可以重用现有的State001作为我们的待机状态。


创建待机状态

  1. 脚本窗口中,选择State001

  2. 在检查器中,将标题从“State001”更改为待机 (Idle)

  3. 要分配的动画 > 动画选择下,点击空白字段并选择待机 (Idle)

    • 现在,当角色处于待机状态时,待机动画集将播放。

创建移动状态

移动状态需要作为一个新状态来创建。

  1. 右键单击待机状态右侧的空白区域。

  2. 从菜单中选择添加状态

  3. 将出现一个新的“State001”。将标题重命名为移动 (Move)

  4. 动画类别下,选择移动 (Move)

    • 现在,当角色处于移动状态时,移动动画将播放。

创建跳跃状态

跳跃状态既需要动画,也需要跳跃动作。

  1. 待机移动状态下方创建一个新状态。

  2. 如前所述,将标题重命名为跳跃 (Jump),并将动画设置为跳跃 (Jump)

  3. 展开动作设置部分。

    • 勾选跳跃 (Jump) 复选框。

    • 现在,当角色进入跳跃状态时,它将自动执行跳跃动作。


注意:为什么移动状态没有“执行移动动作”之类的操作?

基于玩家输入的移动已经由我们在MoveAndJumpSettings中设置的按键绑定处理。
此系统适用于所有状态,因此移动状态不需要任何额外的移动动作设置。


:white_check_mark: 至此,您已设置好三个核心状态——待机、移动和跳跃,并准备好驱动角色的行为。

使用链接连接状态

现在我们已经创建了三个状态,让我们用链接将它们连接起来,以便玩家可以在它们之间平滑过渡。


思考过渡条件

对于这个游戏,基本逻辑如下:

  • 如果按下左/右输入 → 移动

  • 如果按下跳跃输入 → 跳跃

  • 如果没有输入 → 空闲

这意味着:

  • 空闲 → 移动 如果按下左/右键,移动 → 空闲 如果没有输入。

  • 空闲 → 跳跃 如果按下跳跃键,移动 → 跳跃 如果在移动时按下跳跃键。

  • 跳跃 → 空闲 当接触地面时(当向下与瓦片碰撞时)。

:backhand_index_pointing_right: 我们是否还需要一个 跳跃 → 移动 的链接?
不一定。当在按住移动键时落地,从空闲到移动的过渡会立即发生,因此不需要直接的跳跃到移动链接。


连接空闲和移动

  1. 右键点击 空闲 状态并选择 添加链接

  2. 将线从空闲拖动到 移动 状态。

    • 现在空闲和移动已连接。

    • 接下来,我们将添加条件:如果按下左/右键,则进入移动状态。

  3. 选择新链接。在检查器中,勾选 “触发于输入”

  4. 展开新的 输入操作列表 (Array[InputCondition])

  5. 点击 + 添加输入

  6. 将出现一个新的 <empty> 槽位。点击它并选择 新建输入条件

  7. <empty> 变为 输入条件。点击以展开它。

  8. 按如下方式设置字段:

    • 输入目标:四个任意输入键

    • 上键:无

    • 下键:无

    • 左键:左

    • 右键:右

    • 输入方式:被按下

  9. 现在,当按住左或右键时,角色将从 空闲 → 移动

  10. 接下来,让我们创建 移动 → 空闲 的链接。右键点击 移动 并选择 添加链接

  11. 选择新链接。

  12. 在检查器中,勾选 “触发于无输入”

    • 现在,当没有按键被按住时,角色会返回到空闲状态。

将玩家放入场景并测试

此时,玩家应该能够在地面上左右行走。
让我们将玩家场景放入 stage1.tscn 并进行测试。

  1. 将编辑器视图从 脚本 切换到 2D

  2. 保存玩家场景:右键点击 玩家标签 并选择 保存场景

  3. 切换到 stage1.tscn 标签。image

  4. 在场景面板中,选择 基础 (TileMapLayer)

  5. 从文件系统拖动 player.tscn 到场景中,将其放置在地面上。

  6. 确保玩家显示为 BaseLayer 的子节点

    • 如果它在错误的图层中,请在场景面板中拖动它以修复。

    • 如果其位置看起来不对,请使用 移动模式 进行调整。

  7. 点击右上角的 运行项目 (F5) 按钮。

  8. 如果一切正确,角色应该:

    • 按下左/右键时行走

    • 释放按键时停止


故障排除

  • 玩家不移动 → 检查 MoveAndJumpSettings 是否分配了正确的输入键。

  • 玩家移动但动画未改变 → 检查空闲 → 移动链接以及移动状态的动画设置。

  • 玩家不返回空闲 → 检查移动 → 空闲链接条件是否正确。

:warning: 错误:CameraTargetSettings 中未设置 ID。
此警告表示 CameraTargetSettings 存在但未配置。
由于我们将在 第 4 章 中设置相机跟踪,因此现在可以安全地忽略此错误。


连接空闲、移动和跳跃

现在让我们将跳跃与其他状态连接起来。

  1. 切换回 玩家 标签并将编辑器设置为 脚本视图

    image

  2. 右键点击 空闲,添加链接,并将其连接到 跳跃

  3. 选择链接并启用 “触发于输入”

  4. 展开输入列表 → + 添加输入 → → 新建输入条件

  5. 配置如下:

    • 输入目标:注册键

    • 输入键:跳跃

    • 条件:瞬间按下

    • 现在,在空闲时按下跳跃键将过渡到跳跃状态。

  6. 接下来,我们将链接 移动 → 跳跃

    • 由于条件相同,我们可以重用空闲 → 跳跃链接。
  7. 右键点击空闲 → 跳跃链接并选择 复制

  8. 右键点击 移动 状态并选择 粘贴链接

  9. 将新线从移动拖动到跳跃。

  10. 选择移动 → 跳跃链接并确认其设置正确(按下跳跃键)。


将跳跃链接回空闲

  1. 右键点击 跳跃 状态,添加链接,并将其连接到 空闲

  2. 由于这不是基于输入的,请打开检查器并点击 + 添加条件

  3. 将弹出一个窗口。选择 ContactWithTile

  4. 在条件中,设置 传入接触方向 → 底部

    这意味着:仅当玩家底部接触瓦片(地面)时。

  5. 如果链接现在显示此设置,则完成。


测试运行

点击 运行项目 (F5)

  • 在空闲或移动时,按下 Z → 玩家应该跳跃。

  • 落地时,玩家应返回空闲状态。


故障排除

  • 无法跳跃 → 检查空闲 → 跳跃和移动 → 跳跃链接,并确认跳跃状态中已启用跳跃动作。

  • 无法落地 → 检查跳跃 → 空闲链接,并确认已设置“ContactWithTile (底部)”条件。


:white_check_mark: 至此,您的玩家现在可以使用可视化脚本 平滑地空闲、移动和跳跃

第 2 章回顾

在第 2 章中,我们学习了游戏场景游戏对象的概念,并创建了一个舞台和一个玩家角色。

  • 游戏场景中,我们涵盖了图层的概念,以及如何导入和放置瓦片
  • 游戏对象中,我们学习了如何导入图像、创建动画、调整设置以及附加可视化脚本

这一工作流程几乎适用于所有游戏开发。
因此,每当您在未来的项目中感到困惑时,回顾这些步骤作为参考是一个好主意。

至此,您已经掌握了 ACTION GAME MAKER 的基本操作和核心概念
第 3 章中,我们将通过添加子弹射击和敌人创建,让游戏感觉更加真实。

1 个赞