Scratch 教程 -- 逐字化输出

        首先我们来探讨一下对于一个逐字化模块(自定义积木),有哪些需要设置的参数(请注意,在这里我会先提出一种常规且简便的写法,再进一步讲述其它的优化版本)

1.内容:对于一个文本,其内容是一定需要的(不然你还用啥逐字化啊对吧)。这里,内容也就是逐字化结束后所呈现出来的所有文字,换句话说就是你最终所要说出的完整的一句话。内容的介入形式很多样,可以通过列表、变量、乃至于直接输入的形式呈现出来,这里我们用三个积木进行举例:

        而在我们一会要讲到的逐字化中,逐字化模块的脚本会被放置在一个含有“内容”这一关键字(参数)自定义积木中,在调用模块时,按照你自己需要的方式将列表、变量或者是直接输入的文本放入对应的参数栏即可。

2.显示时长:任何不需要通过被其它代码打断的说话语句都会有一个说话时长,使其显示指定的一段时间。但是在设定不同角色或不同状态时,说话时长的值可以有所调整。因此这个参数值在很多时候还是有其设立的必要性的。所以自定义积木中也需要有“显示时长”这一参数

        以上两者是我认为使用自定义积木的方式所必要携带的两个参数值。其中"内容"更是重中之重(甚至当你不需要速度变化时,可以不用加入说话时长参数,只携带"内容"一个参数即可。这里考虑到普遍应用性,直接选择了双参数作为最底层的算法)。因此,自定义积木就可以华丽登场啦

逐字化自定义积木较为简单的写法(双参)

        接下来,我们开始探讨逐字化所需要的变量。这就要究逐字化本身的运行逻辑。一个理想的逐字化输出,是在开始时显示输出文本的第一个字符,在运行过程中不断以上一次显示出的文本为基础,跟进新的字符在整个文本中的位置,将其加入此次要显示的文本,从而最终显示所有字符。那么,显而易见,设置变量的关键就在于“显示的文本”“位置”

(先声明一下,这里的变量其实有更优解,只设“显示的文本”一者即可,参见文章后面的优化版本。在此处使用两个变量相当于拆解步骤,有助于萌新理解)

1.显示的文本:也就是逐字化每一步中实际显示出的话。举个通俗易懂的例子:在“Hello CCW!”这样一段文本中,逐字化模块第一次调用会显示出“H”,第二次则是“He”……每一次单独显示出来的文本,都由这个变量来进行传输。

2.逐字序号:其实就是上文提到的“位置”,只不过用了在sc中更容易理解的思维方式。它决定了每一次单独显示一段文本后,将要加入新的字符是什么。还是以刚才的“Hello CCW!”为例。显示“H”后,逐字序号升为2,下一步会用逐字序号调出“Hello CCW!”的第2个字符(即字母“e”)加入到要显示的文本中,从而显示出“He”。

        那么可以看到,逐字化的核心过程无非就是显示的文本逐字序号两个变量的循环运转。因此,我们可以通过如下代码实现刚才提到的效果:

逐字化变量变化的核心过程

        然后,直接衔接输出语句的代码,也就是“说___()秒”的脚本——

衔接输出语句

        这样,整个逐字化的效果已经可以直观呈现了。现在我们加上重复执行,让它运转起来。但是要注意,重复执行的次数一定是内容的字符数,这样才不会引发一些因循环次数导致的不必要的bug

重复执行,运转逐字化

        做到这里,心急的小伙伴可能直接就将上述代码接到自定义积木下面了。但是不要着急,别忘了关键的初始化:

添加初始化,现在整个模块趋近于完整了

        现在,用按下绿旗等各种事件调用逐字化模块,并在内容显示时长的两个空白处添加你预设的文本数值就可以啦。以下是非常简单的双参逐字化的完整写法:

两个参数,两个变量,实现效果

        版本优化:你还可以引入下列参数去完善你要实现的功能,如:每一次输出的等待时长,完成逐字化后的等待时长等

        当然,你也可以尝试使用速度(speed)等待时间等其它变量来实现同样,或更优的效果。这里我搜集了三位社区里其他出过逐字化教程同学的写法,这些写法各有利弊,大家可以酌情自取:

        这段代码在变量和一些参数命名使用途径上与我们的双参写法从物理意义上是等效的。但是在他的这一版本写法中引入了等待时长(n)和单次输出字数(a)这两个新的参数。前者可以用于每次输出文本之间的时长间距,后者可以限定每一次更新文本加入的字符数。相较于双参写法,难度稍有上升,但是实现出来的效果还是非常理想的,有利于剧情推进时视觉上的表现力

        最重要的是,他将我们的“逐字序号”“当前输出的话”两个变量合为一者,直接使用“要说的话的字符数+a(在我们的脚本中a=1)”实现了这一功能。

        我在网上搜集的写法相比而言就更加贴近我们的写法了,也是使用了同样的双参和双变量,难度偏低,唯一区别在于代码的最后,他加上了一个额外的等待时间参数,防止玩家未看清文本内容就隐藏的情况发生。

        我又改为一种常用编程思想——递归。这种写法的效率我并没有进行实测(感觉会高一些),但是能够肯定的是,这里的递归算法运用得非常恰当。而且还是建议大家效仿一下这位同学,用英语命名变量和参数吧(至少看起来专业一些?哈哈哈,虽然我也习惯用中文)


最后,还记得在文章前面我提到过,我们的写法精简后,只用一个变量就可以实现等效功能。在这里我用两张图简述一下原理以及精简后的成品效果——

等效代码,可以减少一个变量

成品效果

如果你对两者等效的原因能够理解的话,更建议你直接用一个变量实现功能。


补充:所以我又重新写了一个新的版本:

这样效果就非常出色了


        好啦,那么我的文章就到这里了,欢迎大家在评论区积极留言提出自己的见解或对这篇教程的评价。喜欢的话记得收藏~谢谢大家啦~

猜你喜欢

转载自blog.csdn.net/leyang0910/article/details/131947357