Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • CreatiCode
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo

CreatiCode Scratch Forum

  1. CreatiCode Forum
  2. 知识库
  3. 小教程
  4. 三维 - 穿越障碍游戏(难度:5级)

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

Scheduled Pinned Locked Moved 小教程
1 Posts 1 Posters 985 Views
  • 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 Offline
    C Offline
    creaticodeteacher2-mail
    wrote on last edited by admin
    #1

     

    用到的相关知识

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

     
     

    介绍

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

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/36e9b37d-055e-4938-8a15-5f609abeab7d.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     
     

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

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

     
     

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

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

     
     

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

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

    1.png

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

    2.png

     
     

    第4步 - 用网格做位置标记

    我们要指定把游戏道具放在哪里。尽管我们可以把道具放在任意位置,但如果我们把桥的甲板作为网格,就会简单得多,只需要把道具放在每个网格的中心。

    例如,我们可以把甲板分成三列。甲板宽度为300,那么每一列的宽度就为100。这三列的中心分别为x = -100、x = 0、x = 100。

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/55e0173f-8968-4f3a-943a-a336d854f084.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     
    同样,我们可以把甲板分成很多行,每一行的宽度为100。行的中心为y = 100、y = 200……以此类推

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/555d85a4-6aee-4501-9b58-21352e11abf5.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     
    分好行和列之后,就能指定把道具放在哪里。比如,如果我们想在第2行第3列放一个蘑菇,那么蘑菇的位置为x = 100,y = 200。

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/1c228a37-a69b-4936-9dae-8947ff7b69cd.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     

     
    再举个例子,如果我们想在第3行第1列放一块石头,那么石头的位置为x = -100,y = 300。

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/03ffda79-a738-458f-8b2f-c47a7f24cbdf.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     
     

    第5步 - 添加一个表格“道具”

    为了存放游戏道具的位置,我们使用一个表格。请进入“变量”类别,新建一个表格“道具”。

    因为我们把甲板分成3列,我们就在表格中新建3列,分别命名为1、2、3。尽管大家可以进行手动更改,但是用下方这4个积木会更快:

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d377ccc1-6930-4ec1-b055-13f7a529b120.png" width="900" style="border-radius: 5px; border: 1px solid #29622d;">

     
    我们还要为表格添加60个空行,这样的话,我们就可以把游戏道具放在y坐标为100至6000的位置。可以用如下重复执行循环来添加空行:

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/85bbc0c3-7e6d-41e7-8c3c-1e77b6cc28ca.png" width="900" style="border-radius: 5px; border: 1px solid #29622d;">

     
     

    第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-fluid img-markdown" />

     
     

    第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行有两个。

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b5855b04-2669-4f42-9685-bb35d955d58d.png" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     
     

    第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

     

    结果如下所示:
    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ef43aac0-3dad-4e54-a53c-b409129b4b71.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     
     

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

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

    22.png

     
     

    第21步 - 添加初始金币

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

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

    23.png

     
     

    第22步 - 复制金币

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

    24.png

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

    https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/04d715bc-2a3f-4176-b372-f1da20ad59fd.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">

     
     

    第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
    0

    Hello! It looks like you're interested in this conversation, but you don't have an account yet.

    Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

    With your input, this post could be even better 💗

    Register Login
    Reply
    • Reply as topic
    Log in to reply
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes


    • Login

    • Don't have an account? Register

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • CreatiCode