Navigation

    CreatiCode Scratch Forum

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • CreatiCode

    三维 - 穿越障碍游戏(难度:5级)

    小教程
    1
    1
    221
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      creaticodeteacher2-mail last edited by admin

       

      用到的相关知识

      • 社区模型
      • 三维文字
      • 读取表格
      • 复制物体
      • 三维物体的速度
      • 化身动画

       
       

      介绍

      在之前的一篇教程,大家制作了人物在桥上跑步的项目。在这篇教程,我们将在那个项目的基础上制作一个穿越障碍游戏。玩家控制跑步者,收集越多金币越好,但不能撞到路途中的障碍物。

       
       

      第1步 - 将之前那个项目保存一份副本

      请打开之前那个教程的项目,保存一份副本。然后取一个描述性的名称,如“穿越障碍游戏”。

       
       

      第2步 - 角色“游戏道具”

      现在添加一个空角色,命名为“游戏道具”。我们将在这个角色中添加和管理所有的游戏道具,比如路障和金币。

       
       

      第3步 - 广播和接收消息“添加游戏道具”

      和其他角色一样,我们要在“主角”角色中广播一条消息“添加游戏道具”:

      1.png

       
      然后在角色“游戏道具”中处理这一消息:

      2.png

       
       

      第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列放置一个路障,我们就可以在表格中写上“障”,如下所示:

      Animation1.gif

       
      现在我们添加更多路障。比如,在第7行的第1列和第3列添加两个路障:

      5.png

       
      大家可以随意添加更多数据,但这些已经足够我们开始编程了。

       
       

      第7步 - 添加第1个路障

      因为我们将要在场景中使用好多个路障,我们可以先添加一个,剩下那些就复制产生。

      因为创益编程平台上没有路障模型,所以我们无法使用积木“添加模型”。但我们可以在第三方网站上找一个路障模型,第三方网站如Sketchfab.com。搜索“路障(road block)”会出现很多模型,我们就用下图中标出来的这个模型:

      c8eaac64-5fb9-4118-b760-36f75a76a177-image.png

       
      大家可以把模型下载为GLB格式,然后上传为社区模型。如果你想用同样的模型,就无需做这一步。

      当添加这个社区模型时,请把高度设置为50,从而不会太大。另外,将其命名为“障”,与表格中表示路障的名称相同。

      6.png

       
      现在与跑步者相同的位置就会出现一个路障:

      Animation2.gif

       
       

      第8步 - 将第1个路障隐藏到桥下方

      我们要复制第1个路障并放置在甲板上。我们并不需要显示第1个路障本身。因此,我们可以把第1个路障下移,隐藏在桥下面。

      7.png

       
      可能有人就好奇了,如果你把跟踪摄像机设置为“自由”模式,仍然能看到桥下面的路障:

      Animation3.gif" class=" img-responsive img-markdown" width="606" height="452" />

       
       

      第9步 - 遍历表格“道具”的行和列

      现在我们就要遍历表格“道具”的每一个单元格,并读取其中的内容。我们需要用2个遍历循环,为这2个遍历循环新建2个变量“行”、“列”。因为表格“道具”中有60行,所以变量“行”应当从1走到60。表格“道具”中有3列,所以变量“列”应当从1走到3。

      8.png

       
       

      第10步 - 读取表格“道具”中单元格的值

      如果给出任意单元格的行号和列号,我们就能读出该单元格的值并存入一个新变量“道具类型”。

      9.png

       
       

      第11步 - 复制路障

      当我们检查表格中的每一个单元格,变量“道具类型”的值为“”或者“障”,如果为“障”,就表示我们要在该行该列放置一个路障。

      为了复制副本,我们要选择添加的第一个路障,然后使用积木“复制物体”。

      10.png

       
       

      第12步 - 移动副本

      复制副本以后,我们还要将其移动到甲板上的目标行和列。我们需要用行号和列号计算x坐标和y坐标:

      • x坐标:如果列号为1,那么x就等于-100;如果列号为2,那么x就等于0;如果列号为3,那么x就等于100。尽管我们可以用三个积木“如果”,但用这些积木计算x坐标会更简单:11.png

      • y坐标:第1列的y坐标为100,第2列的y坐标为200,所以我们只需把行号乘以100即可得到y坐标:12.png

       
      把上述积木结合起来,我们就可以这样移动复制的物体:

      13.png

       
      现在就出现了3个路障,分别与表格中的3个“障”字对应。第3行有一个,第7行有两个。

       
       

      第13步 - 使程序加速

      如果我们要复制很多个副本,上述代码会比较慢。为了提高速度,我们可以新建一个积木“添加道具”,并将其设置为“运行时不刷新屏幕”。

      15.png

       
      然后,把添加路障的所有积木都移到这个新积木的定义中:
      Animation4.gif

       
      之后当我们添加更多道具时,这一改动会让程序运行更快。

       
       

      第14步 - 为跑步者设置关卡

      开始编写“跑步者”角色中的代码。

      当跑步者在甲板上跑动时,我们要检查跑步者是否被路障挡住。因为我们能通过“道具”表格知道所有路障的位置,所以我们只需要找出跑步者的当前位置,然后在表格里面查找。

      注意,只有当跑步者进入新的一行时我们才需要检查。例如,第1行的y坐标为100,只有当跑步者到达y坐标为100时我们才检查是否有路障。之后,等到跑步者到达y坐标为200时再进行检查。

      我们在“跑步者”角色中用如下这些积木实现这个思路。用一个新变量“新行”来表示要检查跑步者的下一行,初始值为1。当跑步者的y坐标大于100(1个100),我们在一个对话泡泡中显示其y坐标,然后把“新行”增加到2。之后,当跑步者跑过y坐标为200(2个100),我们再次显示y坐标并把“新行”增加到3,以此类推。

      16.png

       
      现在,当跑步者在甲板上跑过每一行时我们就会看到其y坐标:

      Animation5.gif

       
       

      第15步 - 计算跑步者所在列

      现在我们知道了跑步者所在的行,还要知道所在的列。甲板上只有三列。中间一列(第2列)的x坐标介于-50和50之间。因此,如果跑步者的x坐标小于-50,那就位于第1列;如果x坐标大于50,那就位于第3列。

      17.png

       
      现在就可以看到打印出的列号:

      Animation6.gif

       
       

      第16步 - 检查跑步者所在位置的道具类型

      假如我们知道了跑步者所在的行号和列号,就可以读取“道具”表格以找出该位置的道具类型。如果为“障”字,那么跑步者就碰到了一个路障,我们就应当立即停止无限循环,然后广播一条消息“游戏结束”。

      18.png

       
       

      第17步 - 使跑步者和摄像机停止

      当“跑步者”角色收到消息“游戏结束”,就应当使跑步者和转换器物体“摄像机”(控制跟踪摄像机)停止。

      19.png

       
      如下所示,如果跑步者碰到路障就会停止:

      Animation7.gif

       
       

      第18步 - 动画“打败”

      为了让游戏更有趣,我们让跑步者转过身来面向摄像机,然后展示动画“打败”:

      20.png

       
      如下所示:

      Animation8.gif

       
       

      第19步 - 游戏结束消息

      除了显示失败泄气的动画,我们还要显示一个大标题消息“游戏结束”,用一个标签控件或者是对话气泡很容易实现。下面是用对话气泡实现:

      21.png

       

      结果如下所示:

       
       

      第20步 - 在“道具”表格中添加金币

      除了路障,我们还要在桥上放置一些金币。首先,我们在表格中选择一些单元格并添加文字“币”。例如,在第3、5、7行有3个金币:

      22.png

       
       

      第21步 - 添加初始金币

      现在我们切换至“游戏道具”角色。

      与添加路障相同,我们先添加一个金币,然后复制很多副本。如下所示,

      23.png

       
       

      第22步 - 复制金币

      我们使用复制路障的相同代码来复制金币。另外,我们可以让金币绕z轴旋转。

      24.png

       
      在甲板上添加的金币如下图所示:

       
       

      第23步 - 收集金币

      现在进入“跑步者”角色编辑。

      我们可以检测跑步者是否碰到金币,与检查路障相同。我们需要创建一个新变量“得分”,用以记录跑步者收集了多少金币。当游戏开始时该变量设为零。

      25.png

       
      每当跑步者碰到一个金币,得分就加1:

      26.png

       
      现在我们就能看到,每当跑步者碰到金币,得分就会增加:

      Animation10.gif

       
       

      第24步 - 为金币命名

      跑步者碰到金币之后,就应当把金币从场景中删除。要做到这一点,我们首先要进入“游戏道具”角色,为每一枚金币命名一个不同的名称。比如,我们可以把金币的行号和列号拼接起来组成一个名称:

      27.png

       
       

      第25步 - 移除金币

      在“游戏道具”角色中,我们要响应新消息“移除道具”,这条消息会把要被移除的金币的名称作为参数。大家要新建一个变量“道具名称”,

      28.png

       
       

      第26步 - 发送消息“移除道具”。

      现在我们返回“跑步者”角色,当我们知道要移除金币时就广播消息“移除道具”。我们可以把行号和列号拼接起来作为名称,当广播消息时把该名称作为参数:

      29.png

       
      当跑步者收集金币后,金币就会立即消失:

      Animation11.gif

       
       

      第27步 - 宣布成功

      如果跑步者能够通过全部60行,游戏就算成功完成。我们现在只是为了简单演示,让跑步者通过10行就宣布玩家成功,可以在跑步者角色中广播一条新消息“成功”来实现:

      30.png

       
       

      第28步 - 处理消息“成功”

      处理消息“成功”的代码类似于处理消息“游戏结束”的代码,只需修改动画和在界面上打印的文字:

      31.png

       
      演示效果如下:

      Animation12.gif

       
       

      创意扩展

      现在大家制作好了游戏的全部组件,现在该做成一个完整的游戏了。一些思路示例如下:

      • 道具地图:显然,大家应该在表格“道具”中添加更多数据,用于添加更多的路障和金币。
      • 显示得分:大家可以用一个标签来显示得分。此外,每当玩家收集一枚金币,大家可以在后面用一个对话泡泡显示“+1”。
      • 其他道具:除了路障和金币,大家还可添加其他道具,例如植物、路标、财宝箱等等。
      • 使控制更简单:现在玩家控制跑步者在x坐标的范围太广。为了让游戏更简单,大家可以让跑步者的x坐标限制为-100、0和100。例如,如果玩家按下向右键,就让跑步者一直向右跑到x坐标为100。
      • 蹦跳和滑步:大家可以让跑步者跳过路障、在障碍物下面滑过去。提示,大家可以检查跑步者的z坐标来判断是否跳过路障。
      • 声效:大家可以在游戏过程中播放声音,比如当跑步者收集一枚硬币、当游戏结束时等等。
      1 Reply Last reply Reply Quote 0
      • First post
        Last post