三维 - 穿越障碍游戏(难度:5级)
-
用到的相关知识
介绍
在之前的一篇教程,大家制作了人物在桥上跑步的项目。在这篇教程,我们将在那个项目的基础上制作一个穿越障碍游戏。玩家控制跑步者,收集越多金币越好,但不能撞到路途中的障碍物。
第1步 - 将之前那个项目保存一份副本
请打开之前那个教程的项目,保存一份副本。然后取一个描述性的名称,如“穿越障碍游戏”。
第2步 - 角色“游戏道具”
现在添加一个空角色,命名为“游戏道具”。我们将在这个角色中添加和管理所有的游戏道具,比如路障和金币。
第3步 - 广播和接收消息“添加游戏道具”
和其他角色一样,我们要在“主角”角色中广播一条消息“添加游戏道具”:
然后在角色“游戏道具”中处理这一消息:
第4步 - 用网格做位置标记
我们要指定把游戏道具放在哪里。尽管我们可以把道具放在任意位置,但如果我们把桥的甲板作为网格,就会简单得多,只需要把道具放在每个网格的中心。
例如,我们可以把甲板分成三列。甲板宽度为300,那么每一列的宽度就为100。这三列的中心分别为x = -100、x = 0、x = 100。
同样,我们可以把甲板分成很多行,每一行的宽度为100。行的中心为y = 100、y = 200……以此类推
分好行和列之后,就能指定把道具放在哪里。比如,如果我们想在第2行第3列放一个蘑菇,那么蘑菇的位置为x = 100,y = 200。
再举个例子,如果我们想在第3行第1列放一块石头,那么石头的位置为x = -100,y = 300。
第5步 - 添加一个表格“道具”
为了存放游戏道具的位置,我们使用一个表格。请进入“变量”类别,新建一个表格“道具”。
因为我们把甲板分成3列,我们就在表格中新建3列,分别命名为1、2、3。尽管大家可以进行手动更改,但是用下方这4个积木会更快:
我们还要为表格添加60个空行,这样的话,我们就可以把游戏道具放在y坐标为100至6000的位置。可以用如下重复执行循环来添加空行:
第6步 - 向“道具”表格添加数据
现在我们向表格中添加一些数据,用以指定我们在夹板上放置道具的位置。比方说,我们要在第3行第2列放置一个路障,我们就可以在表格中写上“障”,如下所示:
现在我们添加更多路障。比如,在第7行的第1列和第3列添加两个路障:
大家可以随意添加更多数据,但这些已经足够我们开始编程了。
第7步 - 添加第1个路障
因为我们将要在场景中使用好多个路障,我们可以先添加一个,剩下那些就复制产生。
因为创益编程平台上没有路障模型,所以我们无法使用积木“添加模型”。但我们可以在第三方网站上找一个路障模型,第三方网站如Sketchfab.com。搜索“路障(road block)”会出现很多模型,我们就用下图中标出来的这个模型:
大家可以把模型下载为GLB格式,然后上传为社区模型。如果你想用同样的模型,就无需做这一步。当添加这个社区模型时,请把高度设置为50,从而不会太大。另外,将其命名为“障”,与表格中表示路障的名称相同。
现在与跑步者相同的位置就会出现一个路障:
第8步 - 将第1个路障隐藏到桥下方
我们要复制第1个路障并放置在甲板上。我们并不需要显示第1个路障本身。因此,我们可以把第1个路障下移,隐藏在桥下面。
可能有人就好奇了,如果你把跟踪摄像机设置为“自由”模式,仍然能看到桥下面的路障:" class=" img-responsive img-markdown" width="606" height="452" />
第9步 - 遍历表格“道具”的行和列
现在我们就要遍历表格“道具”的每一个单元格,并读取其中的内容。我们需要用2个遍历循环,为这2个遍历循环新建2个变量“行”、“列”。因为表格“道具”中有60行,所以变量“行”应当从1走到60。表格“道具”中有3列,所以变量“列”应当从1走到3。
第10步 - 读取表格“道具”中单元格的值
如果给出任意单元格的行号和列号,我们就能读出该单元格的值并存入一个新变量“道具类型”。
第11步 - 复制路障
当我们检查表格中的每一个单元格,变量“道具类型”的值为“”或者“障”,如果为“障”,就表示我们要在该行该列放置一个路障。
为了复制副本,我们要选择添加的第一个路障,然后使用积木“复制物体”。
第12步 - 移动副本
复制副本以后,我们还要将其移动到甲板上的目标行和列。我们需要用行号和列号计算x坐标和y坐标:
-
x坐标:如果列号为1,那么x就等于-100;如果列号为2,那么x就等于0;如果列号为3,那么x就等于100。尽管我们可以用三个积木“如果”,但用这些积木计算x坐标会更简单:
-
y坐标:第1列的y坐标为100,第2列的y坐标为200,所以我们只需把行号乘以100即可得到y坐标:
把上述积木结合起来,我们就可以这样移动复制的物体:
现在就出现了3个路障,分别与表格中的3个“障”字对应。第3行有一个,第7行有两个。
第13步 - 使程序加速
如果我们要复制很多个副本,上述代码会比较慢。为了提高速度,我们可以新建一个积木“添加道具”,并将其设置为“运行时不刷新屏幕”。
然后,把添加路障的所有积木都移到这个新积木的定义中:
之后当我们添加更多道具时,这一改动会让程序运行更快。
第14步 - 为跑步者设置关卡
开始编写“跑步者”角色中的代码。
当跑步者在甲板上跑动时,我们要检查跑步者是否被路障挡住。因为我们能通过“道具”表格知道所有路障的位置,所以我们只需要找出跑步者的当前位置,然后在表格里面查找。
注意,只有当跑步者进入新的一行时我们才需要检查。例如,第1行的y坐标为100,只有当跑步者到达y坐标为100时我们才检查是否有路障。之后,等到跑步者到达y坐标为200时再进行检查。
我们在“跑步者”角色中用如下这些积木实现这个思路。用一个新变量“新行”来表示要检查跑步者的下一行,初始值为1。当跑步者的y坐标大于100(1个100),我们在一个对话泡泡中显示其y坐标,然后把“新行”增加到2。之后,当跑步者跑过y坐标为200(2个100),我们再次显示y坐标并把“新行”增加到3,以此类推。
现在,当跑步者在甲板上跑过每一行时我们就会看到其y坐标:
第15步 - 计算跑步者所在列
现在我们知道了跑步者所在的行,还要知道所在的列。甲板上只有三列。中间一列(第2列)的x坐标介于-50和50之间。因此,如果跑步者的x坐标小于-50,那就位于第1列;如果x坐标大于50,那就位于第3列。
现在就可以看到打印出的列号:
第16步 - 检查跑步者所在位置的道具类型
假如我们知道了跑步者所在的行号和列号,就可以读取“道具”表格以找出该位置的道具类型。如果为“障”字,那么跑步者就碰到了一个路障,我们就应当立即停止无限循环,然后广播一条消息“游戏结束”。
第17步 - 使跑步者和摄像机停止
当“跑步者”角色收到消息“游戏结束”,就应当使跑步者和转换器物体“摄像机”(控制跟踪摄像机)停止。
如下所示,如果跑步者碰到路障就会停止:
第18步 - 动画“打败”
为了让游戏更有趣,我们让跑步者转过身来面向摄像机,然后展示动画“打败”:
如下所示:
第19步 - 游戏结束消息
除了显示失败泄气的动画,我们还要显示一个大标题消息“游戏结束”,用一个标签控件或者是对话气泡很容易实现。下面是用对话气泡实现:
结果如下所示:
第20步 - 在“道具”表格中添加金币
除了路障,我们还要在桥上放置一些金币。首先,我们在表格中选择一些单元格并添加文字“币”。例如,在第3、5、7行有3个金币:
第21步 - 添加初始金币
现在我们切换至“游戏道具”角色。
与添加路障相同,我们先添加一个金币,然后复制很多副本。如下所示,
第22步 - 复制金币
我们使用复制路障的相同代码来复制金币。另外,我们可以让金币绕z轴旋转。
在甲板上添加的金币如下图所示:
第23步 - 收集金币
现在进入“跑步者”角色编辑。
我们可以检测跑步者是否碰到金币,与检查路障相同。我们需要创建一个新变量“得分”,用以记录跑步者收集了多少金币。当游戏开始时该变量设为零。
每当跑步者碰到一个金币,得分就加1:
现在我们就能看到,每当跑步者碰到金币,得分就会增加:
第24步 - 为金币命名
跑步者碰到金币之后,就应当把金币从场景中删除。要做到这一点,我们首先要进入“游戏道具”角色,为每一枚金币命名一个不同的名称。比如,我们可以把金币的行号和列号拼接起来组成一个名称:
第25步 - 移除金币
在“游戏道具”角色中,我们要响应新消息“移除道具”,这条消息会把要被移除的金币的名称作为参数。大家要新建一个变量“道具名称”,
第26步 - 发送消息“移除道具”。
现在我们返回“跑步者”角色,当我们知道要移除金币时就广播消息“移除道具”。我们可以把行号和列号拼接起来作为名称,当广播消息时把该名称作为参数:
当跑步者收集金币后,金币就会立即消失:
第27步 - 宣布成功
如果跑步者能够通过全部60行,游戏就算成功完成。我们现在只是为了简单演示,让跑步者通过10行就宣布玩家成功,可以在跑步者角色中广播一条新消息“成功”来实现:
第28步 - 处理消息“成功”
处理消息“成功”的代码类似于处理消息“游戏结束”的代码,只需修改动画和在界面上打印的文字:
演示效果如下:
创意扩展
现在大家制作好了游戏的全部组件,现在该做成一个完整的游戏了。一些思路示例如下:
- 道具地图:显然,大家应该在表格“道具”中添加更多数据,用于添加更多的路障和金币。
- 显示得分:大家可以用一个标签来显示得分。此外,每当玩家收集一枚金币,大家可以在后面用一个对话泡泡显示“+1”。
- 其他道具:除了路障和金币,大家还可添加其他道具,例如植物、路标、财宝箱等等。
- 使控制更简单:现在玩家控制跑步者在x坐标的范围太广。为了让游戏更简单,大家可以让跑步者的x坐标限制为-100、0和100。例如,如果玩家按下向右键,就让跑步者一直向右跑到x坐标为100。
- 蹦跳和滑步:大家可以让跑步者跳过路障、在障碍物下面滑过去。提示,大家可以检查跑步者的z坐标来判断是否跳过路障。
- 声效:大家可以在游戏过程中播放声音,比如当跑步者收集一枚硬币、当游戏结束时等等。
-