3.2 背景和BGM
与3.1相同,背景和BGM的切换也由状态机控制。
考虑到实际使用时背景和BGM大概率不会和剧情一一对应,我们额外创建一个新变量e.bac来控制背景与BGM的状态。
背景
来到舞台背景区。 在开始编程前,分别绘制一个黑色背景black和一个白色背景white,便于测试程序。
编写代码,让背景在名称≠e.bac时先变黑,切换为e.bac中的背景名称,再恢复亮度。
不出意外,运行作品,你的背景已经开始抽搐了。
显然,变量e.bac保持着原本创建时的默认值0,而作品中并不存在名为“0”的背景,所以程序会一直切换背景。
初始化e.bac,这样程序只会切换一次背景。
点击绿旗,如果你看到画面由black切换为white,且并无闪烁,则程序正常运行。
BGM
新建一个线程,让它在e.bac处于不同状态时,播放不同BGM。
如果你想要测试效果,可以导入2个不同的BGM。
在3.1中,我曾提到:
如果可以,尽量让你的程序在一旦改变状态时,就能立即执行新的程序,而不是卡在旧的程序中无法退出
显然,播放( )声音,直到播放完毕 并不是一旦改变状态就能立即结束运行的指令。
为了解决这个问题,我们需要编写代码,在切换状态时停止播放。
回到之前的线程,在e.bac发生改变后停止声音播放。
✨✨✨完成!!✨✨✨
拓展知识:停止特定的声音
在Scratch中,想要停止一段声音,只能使用“停止所有声音”来完成。如果此时还有其他声音正在播放,并且我们不想让它们一起停止播放,应该怎么办呢?
我们知道,改变音量和音效只对当前角色/克隆体有效,而改变音效中音调的同时会加速声音播放。只要让音调足够高,就可以在很短的时间内,甚至一瞬间将声音播放完毕。
在高音调播放声音的时候将音量设为0,看起来就像把声音停止了一样!
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=Oscar-novel/Oscar/lec03b&type=comment"
title="{Oscar的文字互动小说 03b}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>