教程:来学习子弹的做法和精灵动画吧!

关于本教程

在本教程中,我们将通过制作一颗边弹跳边飞行的火焰子弹,来讲解
ACTION GAME MAKER 的「子弹」系统
以及精灵动画的制作方法。

我们会使用在「跳跃动作教程」中创建的项目来进行讲解。
ACTION GAME MAKER 的子弹系统可以按以下步骤设置:

  1. 创建子弹用的对象
  2. 在发射源对象的子弹设置中进行登记
  3. 用发射源对象可视化脚本中的「发射子弹」动作来发射

Part1:来做子弹用的对象吧!

首先我们来制作子弹用的对象。这次要讲解的是如何用非模板格式的图像制作动画,以及判定动画功能的用法。

Part1-1:不使用模板的精灵动画制作方法

所谓精灵动画,就像是翻页漫画一样,通过按顺序显示图像来实现动画的功能。上次我们用模板格式一口气读入,这次来学习逐格选择制作的方法。

  1. 准备子弹用的图像。在「素材管理」视图中点击「导入官方素材」。

  2. 选择「武器」中的 P_002_fire.png 并「导入」。

  3. 在「对象」视图左侧的对象一览中点击「+新建」。

  4. 设置
    对象名称:火焰弹
    对象组:Player_Bullet
    碰撞角色:玩家的子弹
    然后在下方栏中选择「子弹(基本)」并点击「创建」。

  5. 切换到精灵动画标签页,点击「使用精灵动画」按钮。

  6. 点击右上角的「从素材表添加」按钮。

  7. 在「添加动画」窗口中点击「确定」。

  8. 命名为「move」并点击「确定」。

  9. 会打开「从素材表添加帧」窗口,点击「从图像一览…」按钮。

  10. 选择刚才添加的「P_002_fire.png」并点击「确定」。

  11. 图像被添加进来了,但有点小,我们放大一下。把「显示缩放」下拉框改为 800%。

  12. 接着,这张图像本来是 4 格,但现在被当成 1 格,我们来分割它。把「水平格数」设为「4」。图像上会出现竖线,变成 4 格。

  13. 接下来把判定的尺寸调整到与单格一致。点击「初始判定调整」按钮。

  14. 墙壁判定和攻击判定看起来都太大了,我们来调整。

  15. 拖动墙壁判定的手柄进行调整,大致调成宽 8、高 12。(预览的缩放可以用鼠标滚轮完成。)

  16. 切换到攻击判定进行调整。攻击判定要稍大一圈,大致调成宽 12、高 16。完成后点击「确定」。

  17. 最后添加帧。系统会按点击的顺序读入,所以从最左边的格子开始依次点击 1、2、3、4,完成后点击「添加」。

  18. 这样动画就添加好了。下方的「帧」栏中显示出刚才的 4 张图像就说明成功了。

  19. 试着点击窗口左上角的 [:play_button:] 按钮,可以预览动画,能看到火焰弹闪闪发光的动画已经加进去了。

Part1-2:用判定动画让图像旋转起来!

  1. 把标签页切换到判定动画。

  2. 判定动画是可以逐格设置判定以及图像的位置、大小、旋转状态等的功能。这里我们要设置让「对象图像」旋转。
    首先在「要素(部分已隐藏)」栏中选择对象图像。

  3. 在最下方的「move(4 帧)」栏的 5 个格子中,选择 END。

为什么动画只有 4 格,第 5 格却有 END?

简易动画功能是在「每一格开始播放的时间点」设置关键帧(状态)的功能。如果只有 4 格,就无法设置第 4 格结束时的状态=循环结束时的状态,因此仅在判定动画中会自动追加一个 END 格。

  1. 在右侧检查器的「Node2D > 变换」中,把「旋转」的值设为 360。这样就设置好了动画播放结束时的「旋转」值(这称为关键帧)。第 1 格的关键帧会自动设为创建时的状态=0 度,中间各格的关键帧会自动插值,所以只需这样设置就完成了。

  2. 试着点击窗口左上角的播放按钮,图像应该会不停旋转。如果不顺利,请检查是否确实把 END 格设为了 360 度——也可能是忘了切换,把第 1 格设成了 360 度。

为什么播放结束后 END 格的旋转变成了 359.9?

这只是显示上的问题。在启用循环播放的情况下,播放时 360 度的状态=真正的 END 状态会自动回到 0 秒位置,所以显示的是回退前一刻的状态,而 END 上确实设置了正确的 360,因此没有问题。

Part1-3:来修改移动速度和重力的设置吧!

接下来我们把它改成符合子弹的动作。移动速度要比玩家快,而且因为要弹跳,还需要受到重力影响。(普通的子弹不受重力影响,所以模板中禁用了重力。)

  1. 切换到预览标签页,在要素一览中选择「移动与跳跃」。

  2. 在右侧检查器的「移动速度设置」中,设置
    左右移动量:500
    上下移动量:500

  3. 稍微往下,「跳跃设置」中的「重力影响」值是 0,把它设为
    重力影响:5.0
    重力的默认值是 1.0,所以这里给这颗子弹施加了 5 倍的重力。普通重力下动作会显得轻飘飘的,特意施加较强的重力可以让动作更利落。

  4. 这样对象的设置就完成了,保险起见「保存」一下。

Part2:来设置子弹的可视化脚本吧!

接着给子弹设置可视化脚本。

  1. 点击「编辑可视化脚本」。

  2. 点击「创建可视化脚本」按钮。

  3. 把状态001 修改如下:
    要分配的动画>动画类别名称:move
    标题:移动

  4. 在「移动」状态中点击「+添加可执行动作」。
    左栏选择「移动>模板移动设置」。
    右栏把「模板移动类型」设为「弹跳」,并勾选「重力下落时也反弹」。
    弹跳是指碰到可碰撞物体时会反弹的移动方式,这样撞到地面时就会弹起。

关于模板移动动作

「模板移动设置」一旦执行,就会持续指定的移动,直到被别的模板移动命令「停止」为止。也就是说,即使跨越多个状态也会保持同样的动作,对于只做简单移动的对象来说非常方便。「敌人」的左右移动也是用它做的。

  1. 接着设置碰到敌人时消失。在附近创建一个新状态,把名称改为「消失」,然后点击「+添加可执行动作」。

  2. 添加「消失/复活」中的「自我消失」。

  3. 最后设置连接。从「移动」状态连接到「消失」状态,然后点击「+添加条件」。

  4. 左栏选择「对象控制>接触受击判定」。
    右栏把「从该对象视角的接触方向」全部方向启用,目标对象类型设为「对象组」,目标对象组设为「Enemy」,然后添加。

  5. 这样碰到敌人就会消失了,但就这样的话,只要不碰到敌人子弹就永远不会消失。我们让它从侧面撞到墙壁判定时也消失。再次点击「+添加条件」。

  6. 左栏选择「接触碰撞体」,右栏设置
    从该对象视角的接触方向:左、上、右(!!不含「下」,如果把「下」也加进去,子弹就不会在地面弹跳而是直接消失!!)
    之前条件的逻辑关系:「OR」
    这里很容易弄错,请仔细确认后再添加。

  7. 查看「接触碰撞体」,图标正确显示为「OR」就没问题了。这样子弹这边的设置就完成了。

Part3:在玩家这边设置子弹的发射吧!

接着我们在玩家这边进行子弹的设置。
步骤分两个阶段:在「子弹」设置中把「火焰弹」登记到子弹数据里;添加「发射子弹」动作。

Part3-1:来设置「子弹」吧!

  1. 回到对象视图,把对象切换为「玩家」。

  2. 点击左上角的「+ 添加设置」。

  3. 在「添加设置」窗口中,添加「对象利用」里的「子弹」。

  4. 查看右侧的检查器,点击「子弹列表」中的「Array[BulletData]」将其展开,接着点击出现的「BulletData」再次展开。

  5. 展开「子弹基本设置」。首先把子弹的名称设为「火焰弹」,然后通过「指定子弹对象」的「一览」按钮添加「火焰弹」。

  6. 接着打开基本设置中的「无限制」(这里如果是关闭的,场景中已存在火焰弹时就无法发射)。基本设置变成图中的样子就可以了。

  7. 接下来展开「子弹飞行方式(初始动作)」,设置为「向发射对象的显示方向飞行」。

  8. 这样子弹数据这边的设置就完成了。我们做出了这样一份数据:把「火焰弹」朝「发射对象的显示方向」发射,且「无论场景内已有多少火焰弹」都能发射。

Part3-2:来设置「发射子弹」动作吧!

  1. 进入「编辑可视化脚本」,在「移动」状态附近创建一个新状态,把动画类别名称设为「shoot」,并命名为「地面射击」。

  2. 点击「+添加可执行动作」。左栏选择「攻击/子弹」中的「发射子弹」,右栏选择子弹数据「火焰弹」,然后「添加」。如果没有火焰弹,请检查玩家的「子弹」设置中是否正确设置了火焰弹。

  3. 动作这边设置完成了,接下来创建连接。从「移动」状态向「地面射击」添加连接,勾选「有输入」,然后点击「+添加输入」。

  4. 左栏选择「用于输入的操作键」,右栏把输入键设为 B、输入条件设为「刚按下瞬间」,然后「添加」。

  5. 就这样的话只有移动中才能发射火焰弹,所以也要从待机连过来。内容完全相同,所以把「移动」→「地面射击」的连接复制后粘贴到待机上,再接到地面射击。

  6. 最后创建从「地面射击」回到「待机」的连接,把状态切换的条件设为「动画已结束」。这样「shoot」动画播放完后就会回到待机。

  7. 设置完成了,不过你可能会觉得线条有些杂乱。状态可以通过拖动来移动,趁这个机会稍微整理一下也不错。(下图中整体把状态的位置下移,并把地面射击移到了上方。)

  8. 那么我们来测试游玩吧。如果设置正确,火焰弹会朝玩家面向的方向飞出,并一边弹跳一边前进。另外,「在这个阶段即使设置正确,子弹会消失但打不倒敌人」。请只确认子弹能否发射、是否会一边弹跳一边前进。

不顺利时的检查清单

・子弹不出来。
请检查「发射子弹」动作中是否正确指定了子弹数据。
・子弹出来了,但之后就动不了了。
请检查回到待机的连接设置是否正确,以及地面射击状态是否正确设置了 shoot 动画。
・子弹出来了,但第二次之后就不出来了。
请检查子弹数据的基本设置中「无限制」是否正确打开。
・子弹出来了,但不会弹跳。
请检查移动状态中是否正确设置了模板移动:弹跳,
以及「接触碰撞体」中是否误将「下」方向启用了。

Part3-3:让子弹能够打倒敌人

到这个阶段,即使设置正确,子弹碰到敌人后会消失,实际上伤害也确实造成了、HP 也变成了 0,但敌人却不会做出受伤动作。
原因在于,转到「受伤」状态的条件只设置了与「player」组的接触,而没有设置与玩家子弹所属的「player_bullet」的接触。我们马上来修正设置。

  1. 回到对象视图,打开「敌人」,点击「编辑可视化脚本」。复制并粘贴受伤状态。

  2. 会生成一个叫「受伤(1)」的状态,把标题改为「火焰弹受伤」,并删除其中设置的「设置对象速度」。(设置速度是把玩家弹起的动作,这里不希望子弹造成弹起。)

  3. 复制 walk→受伤的连接,粘贴为 walk→火焰弹受伤的连接。

  4. 展开检查器中的「接触攻击判定」,把目标对象组改为「Player_Bullet」。

  5. 接着同样复制 受伤→Dead 的条件,粘贴为 火焰弹受伤→Dead 的连接。

  6. 这样准备就完成了。被玩家的子弹击中后会转到火焰弹受伤,HP 变为 0 后应该会一路连到 Dead。我们来测试游玩试试。

不顺利时的检查清单

・子弹不会在敌人处停下
请检查火焰弹对象的「接触受击判定」条件。
・子弹消失了但敌人不消失。
请检查敌人的 walk→火焰弹受伤连接,以及 火焰弹受伤→Dead 连接的条件。

下一篇教程请从目录进入

进阶课题

到这里,你应该已经理解了子弹的发射方法和动画的设置方法,作为教程就到此为止……不过从游戏的角度来看,应该还有几处让人在意的地方。这里只写出解决方法,有兴趣的话请挑战一下。

空中无法发射子弹。

直接复制地面射击就行,创建一个「空中射击」状态,从「跳跃」状态和「下落」状态拉出连接。
从「空中射击」状态则只连接到「下落」状态。
所有设置都和地面射击相同即可。

・为什么不回到「跳跃」?
因为回到跳跃的话会再次跳起来。

・为什么要区分「地面射击」和「空中射击」?
是为了区分返回的目标。如果从空中射击回到「待机」,空中射击后就能在空中跳跃了。

增加敌人的 HP 后,敌人的动作会变得奇怪。

目前的做法在受到伤害后无法回到 walk 状态。(因为它是以 HP 只有 1 为前提做的。)
请准备从「受伤」「火焰弹受伤」回到 walk 的连接。
在这些连接上,把其他条件设为「开关/变量的值比较」HP>0,这样就能做到:HP 大于 0 时回到 walk,HP 为 0 时转到 dead。

另外,既然特意分出了状态,就可以读入新的官方粒子(例如 explode),在火焰弹受伤状态中使用「显示粒子」,这样只有被火焰弹击中时才会出现不同的粒子。