中级篇——电子闹钟P2
【疑惑篇】
点击绿旗按钮进入电子闹钟界面,点击左右箭头,切换小时制。
设置闹钟时间和闹铃声,开启闹钟开关,到时间后自动启动闹铃。点击小鸡,关闭闹铃。
【线索篇】
案例分析
它们发生的场景是什么?
默认背景
每个场景中有哪些角色?
每个场景中的每个角色在做什么?
- 点击绿旗按钮,舞台中显示当前的日期、时间和星期,点击左右箭头,可以切换小时制。
- 点击设置闹钟,可以设置闹钟时间和闹钟铃声。
- 点击闹钟开关,可以打开或关闭闹钟。
- 打开闹钟开关后,到达闹钟设定时间,出现摇摆的小鸡,播放设置的闹铃声。
- 点击小鸡或闹铃声结束后,关闭闹钟。
积木提示
注意事项
- 切换小时制是时间显示有何变化?
- 设置闹钟需要保存哪些数据?
- 如何启动和停止闹钟?
【解决篇】
在上篇文章中,我们已经实现了不同小时制的切换。接下来,我们开始思考如何增加闹钟功能?
在案例中,闹钟分为定时闹钟和番茄时钟,我们先只考虑定时闹钟的情况。
首先把需要的角色添加进来。
一个开启/关闭闹钟设置的按钮,可以通过不同造型(不同的颜色和文字)区分按钮的状态。
一个打开/关闭闹钟的开关,同样有开和关两种造型。
一只闹钟响时,不停摇动的小鸡。
此外,你还需要给小鸡角色上传你自己喜欢的闹铃声。
接下来,我们开始考虑如何设置闹钟?
既然要设置闹钟,你首先需要思考的是需要设置哪些东西?
在这个案例中我们可以设置闹钟的时、分、秒和闹钟音效,将它们分别建立变量,用来储存设置值。除此之外,在舞台的顶部还需要一个“闹钟”变量,用来显示所设置的闹钟时间。
注意它们各自在舞台中的位置和显示模式。闹钟变量使用正常显示,放在舞台顶部用来展示时间。时、分、秒、闹钟音效四个变量使用滑杆显示,方便用户拖动滑杆调整变量值。变量为滑杆显示时,你还可以通过右键菜单,设置变量值的范围。
例如,时变量的范围是0~23,分和秒变量的范围是0~59,闹钟音效的范围是你提供的闹铃声数量,我使用了5种不同的闹铃声,范围就是1~5。
接下来,就要通过设置闹钟按钮角色来控制变量的隐藏和显示。
点击绿旗后,将设置闹钟按钮默认换成“设置闹钟”造型。
闹钟变量会一直显示在舞台上,可以勾选变量积木旁边的复选框,或者使用显示变量[我的变量]积木将它显示出来。同样的,这里可以交由任意一个角色或舞台来执行指令。
时、分、秒、闹钟音效变量默认隐藏,使用隐藏变量[我的变量]积木将它们隐藏起来。
接下来,如何设置闹钟?
当你点击设置闹钟按钮角色后,该角色会换成“关闭设置”造型。原本在舞台上的日期和时间角色全部隐藏起来。时、分、秒、闹钟音效变量出现在舞台上,你可以拖动滑杆改变变量值。再次点击设置闹钟按钮,该角色会换会“设置闹钟”造型。时、分、秒、闹钟音效变量全部隐藏,日期和时间角色重新出现。如何实现?
点击设置闹钟按钮角色,切换造型,是不是可以使用当角色被点击积木和下一个造型积木。每次点击它,角色就会在两种造型间切换。
其他角色怎么知道按钮被点击了呢?有没有想到发送消息?你只需要在按钮被点击时,给其他角色发送一条“设置闹钟”和“关闭设置”消息就可以了。
此时你会遇到一个问题,按钮角色每次被点击时都会启动当角色被点击事件,你不能同时发送“设置闹钟”和“关闭设置”两条消息,必须对每次点击要完成的任务做区分。
例如,第一次点击发送“设置闹钟”消息,第二次点击发送“关闭设置”消息,第三次点击又发送“设置闹钟”消息,以此类推。应该如何实现?
第一种最简单的方式,还是利用设置闹钟按钮角色的造型进行判断。如果它当前的造型是“设置闹钟”,那就广播“设置闹钟”消息,否则广播“关闭设置”消息。这样其他角色在接收到不同消息时,就可以完成各自的任务。
在这里有一个需要特别注意的地方,就是下一个造型积木放置的位置。当它分别放在如果<>那么否则积木前面和后面时,如果<>那么否则积木中的判断条件一样吗?
请你自己动手尝试一下它们的区别,想一想为什么如果<>那么否则积木中的判断条件会不同?
除此之外,如果将下一个造型积木换成换成([造型1])造型积木,又应该如何实现?
消息发送出来了,每个角色就需要在接收到消息后完成各自的任务。
原本显示在舞台上日期和时间角色,接收到“设置闹钟”时,使用隐藏积木隐藏起来。接收到“关闭设置”时,使用显示积木重新显示。
时、分、秒变量接收到“设置闹钟”时,显示变量。接收到“关闭设置”时,隐藏变量。这里需要注意的是,闹钟变量所显示的时间是由时、分、秒变量组合而成,所以每次关闭设置时,需要将它重新设置为最新的时间。
第二种方式,记不记得在上篇文章中,我们是如何通过变量来切换不同小时制的时间显示?现在的问题是不是也能利用变量解决?
我们可以增加一个变量叫做“设置状态”。每次点击设置闹钟按钮角色时,就要像设置“小时制状态”变量一样,去设置“设置状态”的变量值。你同样可以将变量值用中文表示,例如“设置中”和“未设置”两种状态值。此外,你也可以用数字或奇偶数表示,例如1表示正在设置,2表示没有设置。
接下来,几个闹钟时间变量就可以像判断“小时制状态”那样,根据“设置状态”值进行判断,如果“设置状态”=设置中,它们就显示出来,否则就隐藏起来。
其他的日期和时间角色也一样,增加一个如果<>那么否则积木来判断“设置状态”值,如果“设置状态”=设置中,它们就需要隐藏起来,否则就显示出来。
点击绿旗按钮进行测试,你会发现有一个角色的显示和隐藏会出现问题,那就是表示上下午的时段角色。
时段角色原本就需要根据小时制状态值来判断是否隐藏,如果它像其他角色一样在小时制状态判断的前面增加一个设置状态的判断,点击设置闹钟按钮后,程序会先判断设置状态=设置中,将它隐藏起来。接着继续向下执行,如果小时制状态=12小时制(或奇数),就会重新将它显示出来。
如何解决这个bug?
一种方法,将小时制状态判断放入设置状态判断的否则后面,这样如果设置状态=设置中,就不会再去判断小时制状态,直接隐藏。否则继续判断小时制状态,如果小时制状态=24小时制(或偶数),直接隐藏;否则才显示出来。
另一种方法,你可以将两个判断合并起来。如果小时制状态=24小时制(或偶数),或者设置状态=设置中,直接隐藏;否则显示出来。
希望你可以将两种方式都尝试一下,想一想其中的逻辑关系,为什么可以这样做,除此之外还有没有其他的修改方法?
点击绿旗按钮测试一下,现在程序已经能够正常的显示日期和时间,点击设置闹钟按钮日期和时间就会隐藏,并且设置闹钟的几个变量会显示出来,通过滑杆可以改变闹钟时间。再点击一下关闭设置按钮,变量消失,日期和时间重新出现,顶部的闹钟变量值变为了刚刚设置的时间。
现在闹钟时间已经设置好了,接下来就来考虑一下,到达设置的时间时,如何启动闹钟?
如何知道是否到达了设置的时间?你需要重复不停的获取当前的时间,然后与闹钟设置的时分秒做对比,如果全部相同,闹钟就该响了。你可以把这个任务交由代表闹钟的小鸡角色来执行,让它先隐藏起来,然后不停的获取当前时间进行判断。
到时间后,小鸡需要做什么?小鸡会显示出来不停的摇摆,同时还会播放设置的闹铃声。闹铃声结束后,重新隐藏。
这里会遇到一个问题,在闹铃响的过程中小鸡会不停的摇摆,而要让小鸡不停的摇摆需要使用重复执行积木,可是应该重复执行多少次才能和闹钟声时保持一致呢?假设第一个闹铃响的时长,正好需要小鸡重复摇摆100次,你的程序可能会变成这样。
实际开发中,你使用的铃声长短不同,并且你也很难测试出每种铃声需要重复的次数。为了解决这个问题,你需要改变一下思路,思考一下能不能不用考虑重复的次数?
对闹钟的使用者来说,他只有在闹钟响时,才会看见小鸡在舞台上摇摆。闹钟没有响时,小鸡并不会出现在舞台上,此时就算它一直在摇摆也不会有人知道。在这里我们可以使用并行执行,单独使用一个指令串让小鸡重复不停的摇摆,刚刚的如果<>那么积木中只需要控制小鸡何时显示,何时隐藏即可。
闹铃声除了正常结束之外,还可以点击一下小鸡,提前让它关闭,如何实现?很简单,当角色被点击时,停止正在播放的闹铃声,之后你可以播放一个关闭闹钟的音效,最后将小鸡隐藏起来即可。
点击绿旗按钮进行测试,将闹钟时间设置成马上要到的时间,小鸡现在已经可以正常的出现和消失。
接下来,还差最后一步,像手机闹钟一样,为我们的闹钟也增加一个开关。只有当开关打开时,到达设置的时间,闹钟才会启动。
先让开关角色当绿旗被点击时,默认将它设置为关闭的造型。与设置闹钟按钮类似,每当角色被点击时,就让它在开和关两种造型间不停的切换。
现在小鸡是否出现的判断也要发生改变。除了判断当前时间是否与设置时分秒相同之外,还要增加一个如果<>那么积木,通过闹钟开关的造型,判断开关是打开还是关闭的。如果开关的造型是打开的,才会显示小鸡,播放闹铃声。
通常情况下,闹钟响之后,开关就会自动关闭。所以,当小鸡出现时,还需要发送一条消息通知开关角色,告诉它可以关闭了。
当闹钟开关接收到消息时,就自动换成关闭的造型。
想一想,闹钟开关的这些操作,如果不利用闹钟开关的造型进行判断,也不发消息的话,是否同样可以使用一个变量来完成它?这里就留给你自己去试着完成它。
在这个案例中,除了通过上面的方式实现定制闹钟功能之外,还另外增加了一个番茄时钟的功能。
当点击番茄时钟开关时,就会通过变量显示一个25分钟的番茄倒计时。倒计时的时间可以利用计时器进行计算。
当倒计时归零,小鸡同样会显示出来播放闹铃声,并且发送消息通知番茄开关自动关闭。
番茄开关接收到消息后,会换成关闭造型,并将倒计时恢复为25分钟。
如果你对番茄时钟的功能感兴趣,可以参考上图中的指令,自己动手完成它。
好了,以上我们就完成了电子闹钟的制作。
不知道你有没有发现,学习了消息和变量之后,想要实现一个功能,多了很多不同的实现方式。这些不同的方式之间并不存在标准答案,只是通往相同目的地的不同道路。
如果你在案例制作过程中没有任何的思路,可以按照我的方式实现一遍。但是千万别让自己局限在一种实现方式上,要想办法去探索出更多的道路,对比它们各自有什么不同之处。
在探索的过程中,你肯定会不断出错。记住,千万不要将出错当做一件坏事而去害怕它。你只有在不停出错,再不停反思如何修正错误的过程中,才能不停地成长。
想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window。
想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店。