高级篇——菩提偈

【疑惑篇】

点击绿旗按钮,一边切换背景,一边逐字朗诵菩提偈。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

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

  1. 点击绿旗按钮,开始播放背景音乐。背景换成Tree,角色说“菩提偈”。
  2. 利用转场效果依次切换背景,角色逐字朗诵菩提偈中的句子。
  3. 利用转场效果切换为空杯背景,同时角色变小消失。

积木提示

当绿旗被点击

说(你好!)(2)秒

下一个背景

换成([背景1])背景

将大小增加(10)

将大小设为(100)

将[颜色]特效增加(25)

显示

隐藏

播放声音([喵])

当接收到[消息1]

广播[消息1]

广播[消息1]并等待

重复执行(10)次

连接(苹果 )和(香蕉)

(苹果)的第(1)个字符

(苹果)的字符数

建立一个变量

使用变量

将[我的变量]设为(0)

将[我的变量]增加(1)

建立一个列表

使用列表

[列表]的第(1)项

[列表]的项目数

【解决篇】

不知道你是否问过自己世界是什么?个人意识又是什么?当某人告诉你外界的事物独立于你客观存在时,为什么在不同人眼中,这个事物又会有不同的模样?反过来如果外界事物因你而生,你眼中的世界又是什么?

在这个案例中,我将带你使用一个卡通角色,朗诵一个我自己很喜欢的四句偈。

在整个动画中,最核心的是需要完成两件事情。一是利用转场效果切换舞台背景。二是让角色可以逐字说出一句话。所以这一次我们在开始动手之前,可以先来思考一下,如何实现这两个功能?

首先,我们来思考如何实现转场效果。

如果不需要转场效果,普通的切换背景相信你已经很熟悉了。只需要使用换成([背景1])背景积木或者下一个背景积木就可以切换舞台的背景。

现在我们可以观察一下演示视频,在切换背景的过程中发生了什么?你可以看见整个背景会先变模糊,然后在还原。在模糊和还原之间,背景发生了改变。整个过程就是,背景变模糊——>切换背景——>背景变清晰。

现在的问题就变成了,如何让背景从清晰变模糊,再由模糊变清晰?有没有想到将[颜色]特效增加(25)积木。

在这里你可以使用像素化特效,先不停的增加像素化特效值,让背景变的模糊。接着,使用下一个背景积木切换背景。最后,再使用将[像素化]特效增加(25)积木减少特效值,让背景恢复原状。

你可以为舞台任意添加几个背景进行测试,看看现在是否可以实现转场效果。

接下来,我们再来思考如何实现角色逐字说话。

假如说我想让角色逐字说出一句古诗“床前明月光”,最简单的方式可以这样来做。

这样来做主要有两个问题,一是使用了很多个说(你好!)(2)秒积木,二是你需要在积木参数中输入很多文字。

我们现在来思考一下有没有什么方法可以将它简化一下?

注意观察,这几个说(你好!)(2)秒积木中的参数文字,其实就是把诗句的文字按照顺序一个一个取出来拼接在一起。类似于猜数字1中所做的操作,你只要利用重复执行(10)次(苹果)的第(1)个字符积木将文字按顺序取出,再利用连接(苹果 )和(香蕉)积木将它们拼接好设置到一个变量中,最后将该变作为说(你好!)(2)秒积木的参数即可。

我们先建立两个变量,一个取名叫做“文字序号”,代表了从诗句中取出的文字顺序。另一个取名叫“说话文字”,用来存储说(你好!)(2)秒积木的参数内容。

先将文字序号设置为1,说话文字设置为空。接着开始重复执行,需要执行多少次呢?是不是诗句文字的字数。在重复执行(10)次积木中按照文字序号依次将文字取出来,然后与说话文字进行拼接。接着使用说(你好!)(2)秒积木将内容说出来。最后将文字序号递增,继续重复说下一个字。

这样一来,我们就实现了让角色逐字说话的功能。做完后,你可以将诗句替换成别的句子进行测试。

实现了动画中的两个核心功能,接下来我们就可以开始来制作这个动画。

第一步,同样还是依次将我们用到的背景添加进来。

Tree背景可以在Scratch中直接选择。Tree背景上的文字可以利用绘制工具画上去。你可能发现“菩提偈”这三个字有种立体效果,文字工具好像不能写出这种文字。这里有个小技巧,你只需要使用文字工具写出两个“菩提偈”文字,再将它们设置为不同的颜色,最后把它们重叠在一起就会出现你所看见的立体效果。

其他几个背景你可以在网上搜索自己喜欢的图片,或者加入我的知识星球获取素材上传至Scratch中。

第二步,添加角色。

与背景类似,你同样可以选择自己喜欢的人物角色,或者在知识星球中获取我使用的素材上传至Scratch中,再将角色拖动至舞台左下角即可。

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

1. 点击绿旗按钮,开始播放背景音乐。背景换成Tree,角色说“菩提偈”。

第一步很简单,你可以在舞台中,让舞台点击绿旗按钮后切换为Tree背景,接着播放背景音乐。

同时,让卡通角色点击绿旗后,说“菩提偈”2秒钟。

2. 利用转场效果依次切换背景,角色逐字朗诵菩提偈中的句子。

接下来,我们就要开始一边转场,一边让角色说话。转场效果我们已经在前面实现好,现在的问题是转场是当角色说完“菩提偈”后才开始进行,如何能让舞台知道角色是否说完话呢?有没有想到使用消息通知?

你可以试着让角色给舞台广播[转场]消息。

舞台当接收到[转场]消息后,就执行转场操作。

转场完成之后,就该角色朗诵偈句,同样使用之前做好的功能即可。

点击绿旗按钮进行测试,你会发现当角色广播转场消息之后,舞台的转场还没结束,角色就开始逐字朗诵偈句了。我们想要的效果是先完成转场,再朗诵偈句,应该如何处理?

或许你会想到在角色广播消息后不立即执行朗诵偈句,等待舞台转场效果完成后,反过来利用广播消息通知角色,角色接收到消息后再开始朗诵。类似下面这样。

点击绿旗按钮进行测试,貌似现在确实角色会先等待转场完成,然后才开始朗诵偈句。接着,角色朗诵完第一句后又要通知舞台转场。

你可能会想到在角色朗诵之后,再使用广播[转场]积木通知舞台。类似下面这样。

现在问题出现了,舞台接收到消息后又会重新执行转场操作,转场完成后又会广播[朗诵偈句]消息通知角色。此时角色接收到消息后,会重复朗诵之前的偈句。如何解决这个问题?

在这里有两种思路来解决。第一种,每次角色和舞台都广播不同的消息,例如转场1,转场2,朗诵偈句1,朗诵偈句2,这样角色和舞台就能根据不同的消息依次完成不同的任务。第二种,利用背景编号或者变量对角色需要朗诵的偈句进行区分。只需要角色在朗诵时,根据背景编号或者变量填入不同的偈句即可。

以上这两种办法实现起来都会比较麻烦,特别当需要你朗诵的句子很多时,代码量也会随之增长。回到我们最开始所遇到的问题,我们最开始遇到的问题是,当角色广播消息后,没有等待舞台转场完成就开始朗诵偈句。如果说某个积木可以让角色广播消息后先停下来,等待舞台接收到消息,执行完转场后,角色再继续往下执行,那我们的问题就解决了。

有没有这种积木呢?它就是控制分类中另外一个用来广播消息的积木,广播[消息1]并等待积木。

它的用法与广播[消息1]积木类似,一个角色可以利用广播[消息1]并等待积木通知其他角色开始执行任务。与之不同的是,广播[消息1]并等待积木将消息广播出去以后,会停止执行它后面的积木块,它会等待所有接收到该消息的指令串都执行完毕后,再继续向下执行。

回答案例中,我们只需要将原本使用的广播[转场]积木替换为广播[转场]并等待积木,接着将朗诵句子的指令串拼接在它后面。

此时,角色会先执行说(你好!)(2)秒广播[转场]并等待积木,广播完成后指令串会停止运行,等待所有接收到转场消息的指令串运行完毕,在这里就是舞台实现转场的指令串。当舞台的转场操作执行完成以后,角色结束等待,接着广播[转场]并等待后面的积木继续执行,开始朗诵偈句。角色和舞台的指令串就像是被合二为一,按照下图中①②③的顺序依次执行。

剩下的就很简单了,角色朗诵完偈句后继续广播[转场]并等待,接着朗诵第二句。再广播并等待,接着朗诵第三句。最后再广播并等待,接着朗诵第四句。

还记不记得在猜数字2中我说过,当我们通过多个积木块去完成一个功能时,可以将它们封装在自制积木中。

现在我们就可以将朗诵偈句那些积木块放入自制积木中。我们总共朗诵了4个偈句,将它们分别放入不同的自制积木。

例如像下面这样,建立4个自制积木,名称分别叫做朗诵偈句1,朗诵偈句2,朗诵偈句3,朗诵偈句4。然后将朗诵不同偈句的指令串分别放入各自的自制积木中。

注意观察这4个自制积木,它们使用的积木块和实现的功能很类似,都是在逐字朗诵一句话,唯一的区别是朗诵的内容不同。如果说我们将朗诵的内容使用变量代替,例如建立一个名叫“偈句”的变量,每次在使用自制积木之前,将“偈句”设置为不同的内容,是不是就可以将4个自制积木变成一个了。

不要停,继续思考。想一想我们平时使用的Scratch提供的积木块,例如说(你好!)(2)秒积木。这个积木的功能是让角色在舞台上显示一个说话气泡,在气泡中将我们在参数中输入的内容显示出来。同一个说(你好!)(2)秒积木,只是因为参数不同,就可以说出不同的内容。说(你好!)(2)秒积木中的参数是不是跟我们上面建立的“偈句”变量很类似?区别只是说(你好!)(2)秒积木的参数只能在使用积木时设置内容,而我们是建立的“偈句”变量可以在程序的任意位置设置它的变量值。

还记不记得我们在制作新的积木时,弹窗的中间部分可以用来设置参数。现在我们就可以来模仿说(你好!)(2)秒积木,将“偈句”变量修改为朗诵偈句积木的参数。

在弹窗的中间部分有三个选项。

最左边是椭圆形参数,也就是说(你好!)(2)秒积木中使用的参数,里面可以填入数字或文本,或者放入椭圆形积木

中间是菱形参数,也就是如果<>那么积木中使用的参数,里面只能放入返回布尔值的菱形积木

最右边是文字标签,也就是积木块上显示的文字。

你每点击一个选项,上方的积木块就会多出一个相应的内容。

回到案例中,我们可以点击一次椭圆形参数,这样上方的积木中会多出一个椭圆形输入框。同样的,根据积木的功能和参数的作用给他们取名字。

点击完成按钮以后,自制分类中新增的积木块就会多出一个椭圆形的参数输入框。

而定义积木上面会多出一个参数变量。

现在你就可以将之前定义的指令串复制到新的积木下面,将之前使用的“偈句”变量使用自制积木的参数代替。

之前我们需要先设置“偈句”变量值,再使用朗诵偈句。现在我们使用代参数的新积木将它们替换掉。

原本的“偈句”变量不再使用,可以删除掉。

以上就是使用自制积木的另外一个好处,通过为自制积木添加参数,让它可以利用相同的功能,获得不同的结果。这里的自制积木就像是数学课中函数或者公式,参数就是公式中需要带入的具体的数字。

3. 利用转场效果切换为空杯背景,角色变小消失。

首先还是广播[转场]消息,注意这一次角色和舞台是同时执行的,所以不需要使用广播[转场]并等待积木等待舞台先执行。最后,使用将[颜色]特效增加(25)将大小增加(10)隐藏积木让角色逐渐一边像素化一边缩小,最终消失。

点击绿旗按钮进行测试,角色已经可以正常朗诵菩提偈,然后缩小消失。可是当你重新点击绿旗按钮时,角色并没有在舞台上重新显示出来。所以你还需要在指令串的开头,点击绿旗后让角色恢复原始大小并显示出来。

现在案例的功能已经全部做好了,同样我们可以观察一下程序中使用的积木块,看看能不能将它们归类封装成不同的自制积木,例如像下图这样拆分。

建立3个自制积木,将它们各自放入对应的定义积木下。

点击绿旗按钮进行测试,这时候你可能会发现两个问题。第一个问题是指令执行到朗诵偈句积木时,画面会变的非常卡顿。第二个问题是指令执行到收尾积木时,角色不再会逐渐变小消失,而是没有变小的过程,直接从舞台上消失。为什么会出现这两个问题?

这里就涉及到我们在建立自制积木时,弹窗左下方的运行时不刷新屏幕选项。

这个选项有什么作用呢?

我们在定义自制积木的功能时,会使用很多的积木块。这时会有一个问题,我们是否需要在舞台上看见这些积木块执行的过程?

如果需要看见执行过程,就不勾选运行时不刷新屏幕选项;如果不需要看见执行过程,就勾选上运行时不刷新屏幕选项。

例如,在定义角色初始化积木时,我们会先将角色的大小设为100,再将角色显示出来。这个过程我们并不需要在舞台上看见,只用等积木执行完成后,将结果显示给我们看即可。所以建立这个自制积木时,我们可以勾选上运行时不刷新屏幕。这里比较特殊的是,说(你好!)(2)秒积木不会受到运行时不刷新屏幕选项的影响。

在定义朗诵偈句积木和收尾积木的指令串中,会涉及到舞台背景和角色的特效变化。我们需要在舞台上看见它们变化的执行过程,所以在建立这两个自制积木时,就不能勾选运行时不刷新屏幕选项。否则,就会出现前面提到的背景卡顿和角色直接消失的问题。

接下来,我们还可以继续思考另外一个问题。假如说我们想把朗诵菩提偈换成朗诵其他诗词或者文章,需要修改哪些东西?

是不是需要修改朗诵偈句积木里面的参数内容。如果新的诗词超过4句的话,还需要增加广播[转场]并等待和朗诵积木。有没有什么方式可以不用修改朗诵偈句下面的积木,就可以任意朗诵不同的内容?

方法其实很简单,我们在之前也已经使用了很多次,那就是将我们需要输入文字的地方,使用变量来替代。定义积木下面的是需要实现的功能,变量值是功能使用的数据。通过把功能和数据分区开,这样在修改功能时就不会影响数据,修改数据时也不会影响功能。

在这里我们朗诵的内容会有很多句话,因此我们可以使用列表来存储它们。建立一个列表,取名叫“朗诵内容”。再将需要朗诵的诗词加入列表中。

接着,我们就来尝试着重新定义朗诵偈句积木,将积木参数中的文字使用列表中的内容代替。具体如何实现呢?

观察一下定义朗诵偈句积木下面的指令串,它们在重复做两件事,先广播[转场]并等待,然后朗诵一句话。既然是重复的,自然又可以使用重复执行(10)次积木。

重复的次数是多少,是不是列表中内容数量?

重复执行(10)次积木中,先广播[转场]并等待,然后新建一个“编号”变量,将列表中的内容按照列表编号顺序依次取出来,作为朗诵积木的参数使用。具体的做法你已经在猜数字2中实现过。

你还可以把自制积木的名称修改一下,因为此时你朗诵的可能并不是偈句,可以将名字改为“朗诵”。

点击绿旗按钮进行测试,程序可以正常运行。现在当你把列表中原本的菩提偈换成静夜诗后,不需要修改任何积木块,角色就可以朗诵静夜诗。此时,你还可以将菩提偈使用的背景图片替换成与静夜诗相关的图片,效果会变得更好。

在这个案例中,我们对代码进行了多次优化。你在第一遍操作时,可能会出现很多问题,这都是正常的现象。碰到问题,思考并解决问题,本身就是帮助你快速成长的必要条件。

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

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

Last Updated:
Contributors: lanheixingkong