高级篇——时光倒流

【疑惑篇】

点击绿旗按钮开始游戏。

随着音乐拖动小螃蟹在舞台中任意移动,舞台中将留下小螃蟹移动过的痕迹。

音乐停止后,松开小螃蟹,随着音乐的反转,小螃蟹将自动沿着来时的路线时光倒流。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

每个场景中的每个角色在做什么?

  1. 点击绿旗按钮,开始播放背景音乐,玩家拖动螃蟹在舞台上移动,舞台上画出螃蟹的移动轨迹。

  2. 背景音乐停止,玩家停止拖动螃蟹,螃蟹说出“时光倒流”。

  3. 反向加速播放背景音乐,螃蟹沿着拖动轨迹反向移动,舞台上的移动轨迹随着螃蟹的移动消失。

积木提示

当绿旗被点击

移到x:(0) y:(0)

移到([随机位置])

x坐标

y坐标

说(你好!)(2)秒

隐藏

播放声音([喵])等待播完

播放声音([喵])

当接收到[消息1]

广播[消息1]

重复执行(10)次

重复执行

如果<>那么

重复执行直到<>

停止[全部脚本]

将拖动模式设为[可拖动]

等于

不成立

变量

自制积木

画笔

解决篇

2000年千禧之际,一个头戴鸭舌帽的腼腆男孩发行了自己的第一张个人专辑《Jay》,一段属于他的华语音乐时代就此开始。这张专辑中有一首我很喜欢的歌《反方向的钟》,歌曲的MV拍的很特别。镜头里,所有事物像是处在一个与现实世界运行方向相反的时空,街上的行人和车都在倒退着前行。20年后一位喜欢研究时间的导演克里斯托弗·诺兰将这种时空扩大,拍出了一部电影《信条(Tenet)》。

这一次,我们就来利用Scratch制作一个属于自己的时光倒流小游戏。

第一步,先添加我们时光倒流的场景,Underwater1。

第二步,添加发生时光倒流的角色。

你可能在案例分析中发现,除了螃蟹之外,我还保留了默认的小猫角色,你也可以将它保留下来,之后我们实现程序时,你就会看见它的作用是什么。

第三步,使用指令积木实现程序。

这个小游戏的运行过程看上去很简单,但是制作时会有两个难点。第一个难点是,如何在舞台上画出螃蟹的拖行轨迹?第二个难点是,如何制造时光倒流的效果?

1. 点击绿旗按钮,开始播放背景音乐,玩家拖动螃蟹在舞台上移动,舞台上画出螃蟹的移动轨迹。

首先,点击绿旗按钮后,开始播放背景音乐。这一次的音乐是螃蟹开始时光倒流的信号,只用播放一次。音乐播放时,玩家可以自由拖动螃蟹在舞台上移动。音乐停止时,就将发生时光倒流。

你同样可以使用舞台来播放背景音乐,只是你需要思考一个问题,当舞台播放音乐时,螃蟹如何才能知道音乐是否播放结束?

你可以从Scratch中选择或者上传一首自己喜欢的音乐,时间不用太长。当绿旗被点击后让舞台播放音乐。想一想应该使用哪个播放声音的积木?为什么?

螃蟹当绿旗被点击后,可以将它移动到舞台中央,等待玩家拖动。

不知道在之前的学习过程中你有没有发现,当你让舞台进入全屏模式时,默认情况下你是无法拖动角色的。

在侦测分类中有一个将拖动模式设为[可拖动]积木,积木参数有两个选项,可拖动不可拖动

如果你将参数选为可拖动,并对某个角色使用该积木后,你就可以在全屏模式下用鼠标拖动它。如果参数选择了不可拖动,角色就会变回默认状态,不能在使用鼠标拖动。

现在你就可以让螃蟹将拖动模式设为[可拖动]

进入全屏模式下点击绿旗按钮进行测试,现在音乐响起的同时,你可以拖拽着螃蟹在舞台上到处乱动了。

接下来,还剩下一个问题,螃蟹在舞台被拖动的同时,如何留下它的足迹?

我相信你肯定能想到使用画笔来画出它的足迹,具体应该如何画呢?

你先将舞台全部擦除干净。接着使用将笔的颜色设为(颜色)积木,选择一种自己喜欢的颜色。最后,使用落笔积木开始画画。

点击绿旗按钮进行测试,你会发现当你拖动螃蟹时,舞台上并没有画出任何东西。这是因为使用画笔分类中的落笔积木后,只有当角色使用运动分类中的积木在舞台上移动时,才会留下它移动的痕迹。

问题来了,既然螃蟹现在是被鼠标拖着走,那怎么可能同时又让它被移动积木移动呢?

有没有想到我们之前所保留的另外一个小猫角色。它的作用就是在舞台上画出移动痕迹。需要注意的是,小猫留下的痕迹需要和螃蟹保持一致,这样当你把小猫隐藏起来时,玩家所看见的就像是拖动螃蟹后留下的痕迹。

接下来你需要解决的问题是,如何让小猫跟随螃蟹移动?我相信你一定可以想出很多不同的方法。

例如,使用移到([随机位置])积木,或者使用移到x:(0) y:(0)积木配合([舞台])的[背景编号]积木。或者能不能考虑自己定义两个变量,让螃蟹将自己的坐标设置给小猫使用。

点击绿旗按钮进行测试,当你拖动螃蟹后,舞台上就会留下它被拖动的足迹。测试时你必须进入全屏模式,否则在舞台上留下的就会是一条一条直线所拼接的足迹。

2. 背景音乐停止,玩家停止拖动螃蟹,螃蟹说出“时光倒流”。

音乐停止,马上就要发生时光倒流了,玩家不能在继续拖动螃蟹,你要使用将拖动模式设为[不可拖动]积木让螃蟹重新变为不可拖动状态。可是,螃蟹如何知道音乐停止了呢?

还记不记得在第一步中我们使用了播放声音([喵])等待播完积木来播放背景音乐,目的就是为了在音乐播完后可以通知螃蟹开始时光倒流。

螃蟹在接收到时光倒流的通知后,你可以将拖动模式设为[不可拖动],然后说出“时光倒流”。

3. 反向加速播放背景音乐,螃蟹沿着拖动轨迹反向移动,舞台上的移动轨迹随着螃蟹的移动消失。

终于到了最后一步,螃蟹要开始时光倒流了。为了能表现出时光倒流的效果,你可以将之前的音乐倒着播放一遍。如何操作呢?

先将原本的音乐复制一份。

接着选中复制的音乐,点击右边的反转工具,此时被选择的音乐就会反转播放。

被反转的音乐默认会和原本的音乐时长一致。为了表现出一种时光正在加速倒流的感觉,你还可以使用快一点工具,将音乐的时长缩小,它听上去就会变得更急促。

最后使用播放声音([喵])积木将我们修改好的音乐播放出来即可。

现在只剩下最后一步了,螃蟹沿着之前的轨迹反向移动,同时舞台上的足迹也会随着螃蟹的移动逐渐消失。

此时你会遇到一个问题,之前螃蟹移动时,你是使用鼠标随机拖动螃蟹在舞台上移动,你要如何让它自己反向走回去呢?

要解决这个问题,你需要知道螃蟹之前走过了哪些地方?

想象一下,当你从家里出门准备去一个陌生的地方办事时,你会怎么做?你是不是会先提前找到去那个地方的路线,并将路线记在脑子里,或者利用纸笔、手机记录下来。在你办完事想要回家时,只需要沿着记录的路线反向走回去即可。你所记录的路线对应到螃蟹身上时,就是它被拖动过程中的坐标值。

想一想,你只要将螃蟹被拖动过程中的坐标都记录下来,时光倒流开始后,你是不是就可以按照记录的坐标反向移动回去了?

现在你要完成的第一件事,就是记录下螃蟹被拖动过程中的坐标值。

螃蟹在被拖动的过程中,x坐标和y坐标都会不停的发生变化,所以你需要将它们记录在列表中。还记不记得在单位换算中,你已经学会了使用多个列表来记录一组相关联的数据。这一次同样可以建立两个列表,分别存储螃蟹移动过程中的x坐标和y坐标。当时光倒流开始时,只需要通过相同的编号将它们一组一组的取出来使用即可。

在哪记录螃蟹的x坐标和y坐标?只需要当绿旗被点击后不停地向列表中加入螃蟹的坐标即可。当然别忘了每次游戏开始时,先将两个列表全部清空。

点击绿旗按钮测试一下,你会发现列表中会有很多重复的坐标值。

这些重复的坐标是因为螃蟹停在原地造成的。

一个列表中最多只能保持200000个东西。假如说你选择的音乐很长,如果有很多重复的东西占用列表的话,列表会很快被占满。在时光倒流时,这些重复的坐标也会让螃蟹停在原地不动,减慢时光倒流的速度。因此,你可以想个办法去掉重复的坐标值。

具体怎么做呢?

实际上很简单,你只需要每次在向列表中添加坐标前,判断一下螃蟹当前的x坐标和y坐标,是否和上一次的x坐标和y坐标值一样?如果x和y坐标都一样,说明螃蟹停在了原地没动,就不需要将它们加入列表。如果x坐标或y坐标中有任意一个和上一次不一样,说明螃蟹的位置发生了改变,需要将它们加入列表中。

在这里你可以建立两个变量用来存储螃蟹上一次的x和y坐标。

螃蟹的初始位置是舞台中央,所以也将x坐标和y坐标的变量值初始设为0。接着,在重复执行积木中使用运动分类的x坐标积木和y坐标积木与两个变量进行判断,如果有任意一个坐标值不相等,那么说明螃蟹位置发生了改变,将当前的坐标值加入列表中,再将当前的坐标值设为x坐标和y坐标的变量值,用作下一次的判断使用。

重新点击绿旗按钮进行测试,当螃蟹停止移动时,就不会再有重复的坐标值被加入列表中了。

现在已经有了螃蟹走过的坐标值,接下来就可以在时光倒流时,将它们依次取出来,让螃蟹反向移动了。具体如何做呢?

首先,开始时光倒流时,需要先使用停止[该角色的其他脚本]积木,让螃蟹停止往列表中增加新的坐标值。

接着,你需要从列表的最后,倒着取出每一个坐标值,让螃蟹按照取出的坐标进行移动。

如何倒着取呢?

很简单,与之前从1个开始,按顺序依次取出列表中的每一个值类似。先建立一个索引变量i,之前是把索引变量先设为1,然后依次递增。现在要从最后倒着取,就要把索引先设为列表的最后一个编号值,也就是列表的项目数,通过[列表]的项目数积木获取。然后编号需要依次递减,使用将[我的变量]增加(-1)来完成。

点击绿旗按钮测试一下,现在时光倒流时,螃蟹已经可以沿着轨迹反向移动。

还剩下最后一个问题,舞台上的轨迹如何随着螃蟹的移动逐渐消失呢?

想要清除舞台上的轨迹,只有使用全部擦除积木这一种方式。可是这个积木并不会顺着螃蟹倒退的轨迹一点一点的清除舞台上的足迹,而是会一次性将它们全部擦除掉。

应该如何解决这个问题?

想要解决这个问题,你可以换一个角度来进行思考。

你在舞台上所看见的轨迹,实际上是与列表中所有坐标值移动后所画出来的轨迹一模一样。

时光倒流之前,列表中的坐标值在不断增加,舞台上的轨迹也在不断变长。如果列表中的坐标值逐渐减少,那舞台上所画出来的轨迹也会逐渐变短。

所以想要让舞台上的轨迹随着螃蟹的移动逐渐消失,需要分两步来完成。

第一步,螃蟹倒退时,删除列表中已经退回的坐标值。第二步,让小猫不停的先清除舞台上的痕迹,再重新画出列表中所有剩余坐标的移动轨迹。

具体怎么实现呢?在这里有两种做法。

第一种,螃蟹保持现在的指令不变。此时,它所用的索引变量i,也就代表了剩余轨迹的最后一个坐标值。小猫只需要在接收到时光倒流后,重复执行全部擦除和画线操作即可。具体画线的操作,就是让小猫从列表的第1项坐标开始移动,一直移动到第i项。

点击绿旗按钮进行测试,你会发现有两个问题。

第一个问题是,音乐停止螃蟹说话时,舞台上的轨迹会消失不见。这是因为小猫是以i的变量值作为轨迹的最后一个移动坐标,在螃蟹的指令串中,i的初始值设置被放在说话积木之后。要修改这个bug,只需要将i变量的初始值设置放在说话之前即可。

第二个问题,舞台上的轨迹并没有按照我们所设想的慢慢减少。要解决这个问题,就需要你对自制积木中运行时不刷新屏幕选项和画笔的使用很熟悉。具体的使用方法,可以参考我在少儿编程Scratch3.0教程——扩展篇(画笔)中的讲解。

当你使用之前的指令串,让小猫获取列表中的坐标值,画出螃蟹的移动轨迹时,舞台上会将小猫移动的过程全部展示出来。但是我们现在想要看到的,并不是画线的过程,而是已经完整画好的线。

为了实现这个目标,你需要新建一个自制积木,可以取名叫“画轨迹”,勾选上运行时不刷新屏幕选项

接着,将小猫按照列表中的坐标移动画线的指令串移入该自制积木中。

重新点击绿旗按钮重新测试,这一次你会看到舞台上的轨迹会随着螃蟹的移动逐渐消失。

这是因为使用自制积木后,小猫在每一次重复执行画轨迹时,都会一次性将完整的轨迹画出来。而螃蟹反向移动的过程中,i变量所代表的坐标编号会逐渐减小,也就是说每一次画出的完整轨迹会逐渐减少。

以上就是第一种,通过变量i代表轨迹最后的坐标位置,从而实现轨迹逐渐消失的方式。接下来,看看第二种。

既然螃蟹反向移动时,就是在减少列表中坐标值的过程,那现在你可以做一件事。每次让螃蟹先移动到列表中最后一个坐标位置,接着再将最后一个坐标值从列表中删除。

这样一来,列表中剩下的就总是螃蟹还未倒退的坐标。小猫每次只需要将列表中的完整轨迹画出来即可。

最后,当螃蟹删除完列表中所有坐标值,回到舞台中央时,可以使用停止[全部脚本]积木,停止所有指令,结束游戏。

如果你观察一下小猫两个指令串的作用,你会发现它们的作用都是在让小猫画轨迹,因此可以将它们合并为一个指令串使用。

以上,你就完成了时光倒流的小游戏。

想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window

想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店

Last Updated:
Contributors: lanheixingkong