第三节 Boss战
下面,我们来制作教程中最有意思的关卡——BOSS战。
游戏中的 BOSS 是一个巨型机器人——无畏者机器人。当它出现时,屏幕上方会亮起血条。无畏者机器人有四种攻击方式:
- 靠近敌人,抡起拳头捶地;
- 向敌人高速冲撞;
- 跳到敌人头上,并在落地时释放粒子炮;
- 原地跳三次,并释放粒子炮;
关卡初始化
- 添加过场动画:
- 添加关卡初始化、流程控制代码:
- BOSS 战的刷兵代码比较简单,就是不停地放置一些小兵,干扰玩家:
无畏者机器人
导入素材
无畏者机器人使用了 Gandi 素材集市里的素材。可以在素材集市中找到并导入:
- 点击素材集市按钮,选择“角色”分类,搜索“robot”,将“Giant Robot”素材拖动到角色栏目使用。
- 导入角色后,会看到角色里有一些示例代码,可以直接全部删除。
角色有一个私有列表,存放着它的各个动作的造型名称、数量(例如 Idle:空闲动作,有 18 帧。Walking:行走动作,有 24 帧)。这个列表可以保留,重命名为“*动画信息”,用于之后播放动画时读取信息。
将角色重命名为“无畏者机器人”,并将其拖入“实体”文件夹。之后将为它单独编写代码。
注意:记得给角色添加碰撞箱造型,用于检测和地图的碰撞。
编写 BOSS 代码
为了使用克隆体引擎的功能,使用克隆体而不是主体来编写无畏者的代码。(而且,做成克隆体意味着“无畏者”可以不只有一个,你甚至可以放置多个“无畏者”。)
- 添加隐藏本体代码;添加死亡时,设置“人物存活”为 0 的代码。
- 添加实体的若干广播:
其中,下面的写法的作用是,在渲染时,上移角色,渲染完成后,再移回原来位置。
这么做是因为,无畏者的造型的锚点并不在角色底部,而是在大概下巴位置。因此需要在渲染时额外上移,以使底部位于角色的坐标位置(否则,锚点落在角色下巴,图层排序时看起来会不正常;当和其他角色位于同样的 y 坐标时,看起来也很奇怪,位置偏下)
- 通过下面的变量控制 BOSS 的碰撞伤害(玩家碰到 BOSS 时的帧伤)。当 BOSS 发起冲撞时,设置碰撞伤害,其他时候碰撞伤害为 0。
动画控制
- 新建两个私有变量:
- “当前动画信息索引”:记录当前动画的信息在列表的位置。(例如第一个动画的索引是 1,第二个动画的索引是 3(因为一个动画占列表两项,一项是名称,一项是帧数)以此类推)
- “造型编号”:记录当前动画帧的编号
- 可以使用下面的代码,逐帧播放动画(例如,播放 Idle【空闲】动画):
注意,造型的命名如下:动画名+“_”+编号(三位,左补0,且编号从000开始)
使用下面的代码,设置造型名称:(其中的补 0 积木可以在扩展里找到)
- 为了方便地播放动画,我们可以编写下面的自制积木:有两种播放方式,填 0 时是播放下一帧;
填 1 是播放完整的一次动画。
先编写播放完整动画的代码:(如果“死亡退出”填了 1,则当角色死亡时就打断动画)
接着,编写播放一帧的动作:
在逐帧播放 Running(奔跑)和Walking(行走)动画时,可以在脚落下的帧,产生一个震动效果,播放脚落地的音效。
主要代码
- 添加下面的代码:
- 初始化 BOSS 的各种信息;
- BOSS 每 1 秒查找一次最近敌人(这个代码可以从其他角色里拖过来);
- 没有敌人时,BOSS 播放空闲动画(Idle);
- 其他状态时,BOSS 根据状态进行不同攻击动作。
其中,使用下面的变量记录攻击状态。填空时则为空闲状态。
- 添加一个并行的代码,控制 BOSS 的攻击状态的切换(这个代码之后再回来介绍)
攻击动作
普通捶地攻击
在“普通”攻击状态下,机器人会追逐最近的玩家,当玩家进入攻击范围时,播放捶地动作。
冲撞攻击
- “冲撞”状态:
- 当速度<30,逐渐奔跑加速:
- 速度<5,加速的同时朝玩家转向,瞄准目标;
- 速度>5,不再调整方向,专注加速;
- 当速度>30,不再加速,匀速奔跑。
- 播放 Running(跑步)帧动画,并且帧间隔随着速度增大而逐渐减小。
- “结束冲撞”状态:
- 跑了一段时间后,进入该状态(状态的转移由另一段代码控制);
- 该状态播放 Idle(静止)动画,模拟站立滑行动作;
- 速度逐渐减少(每帧 * 0.8),模拟摩擦力;
- 当速度减为 0,进入“普通”状态(追逐玩家捶人的状态)。
影子
在添加跳跃攻击前,我们先来给 BOSS 添加“影子”,这样跳跃时,BOSS 的高度更容易看清楚:
- BOSS 生成后,给自己添加一个影子(影子看成一种特殊“子弹”):
- dx、dy 记录坐标偏移值。例如 dx 填 -4,表示影子位置往左偏移一点。
- 发射者填影子拥有者的 ID;
- 影子的 ID 设为 “影子拥有者ID+影子”
- 在“子弹”角色中,添加影子代码:
- 新建一个变量“跟随发射者”,设为 1 表示这个“子弹”渲染时,会跟着发射者移动。
- 额外上移值设为“-999”,表示影子的图层总是在其他实体底下。
- 当发射者死亡,影子就删除自己。
添加下面的代码,如果子弹会跟随发射者,就每帧将坐标设为发射者。
其中,“方向符号”记录方向的符号(朝右时为 1,朝左时为 -1)
这样,影子就完成了。
能量炮攻击
- 添加能量炮子弹的代码。能量炮可以和普通子弹共用代码,只有一小部分的区别。
- 给 BOSS 添加下面的代码,用于放置一圈的能量炮子弹:
- 编写能量炮攻击代码:(攻击几次由状态持续时间决定。状态时间由另一段代码控制)
跳跃攻击
跳跃攻击时,机器人会跳到玩家位置,并释放一次能量炮:
- 计算机器人跳跃时的水平速度 = 到玩家距离/循环次数(这样循环结束,就移动了这么多距离)
- 机器人将方向面向玩家。这样水平移动时就朝这个方向移动。
攻击状态控制代码
下面,添加攻击状态的控制:
- 5 秒的普通状态(追随玩家捶人);
- 等待靠近玩家后,进入跳跃攻击,或能量炮攻击状态;
- 落地后,2 秒硬直时间;
- 之后,开始冲撞攻击。冲撞前,显示一个感叹号作为预警。
- 冲撞后,进入下一个循环,进入普通攻击,捶人模式。
(注:感叹号是类似影子的一个跟随贴图)
BOSS 死亡动画
最后,添加 BOSS 的阵亡动作:
死亡后,放置大量掉落物:
这样,BOSS 机器人的代码就完成了!
BOSS 关流程控制
- 添加下面的代码:
- 放置 BOSS,镜头对准 BOSS,然后亮血条;
- 之后,镜头回到玩家,解锁玩家的输入,BOSS 战开始:
其中,BOSS血条可以专门创建一个角色显示。这里不再介绍具体代码,可参考本课最后源码。
- 当玩家击败 BOSS 后,生成一个全图范围的伤害,杀死所有敌人。然后相机对准 BOSS,观看死亡动画。最后游戏结束。
这样,完整的 BOSS 关就制作完毕了!
上一节:02 关卡3
下一节:04 排行榜、成就系统
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG303/Arkos/Lec7/04&type=comment"
title="{射击课高级篇-第七课-04}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>