中级篇——企鹅下楼梯2
疑惑篇
点击绿旗按钮开始游戏,企鹅会从舞台上方自动下落,使用左右按键控制企鹅移动。企鹅血量归零或掉落舞台底部,游戏结束。
【线索篇】
案例分析
它们发生的场景是什么?
每个场景中有哪些角色?
每个场景中的每个角色在做什么?
在企鹅下楼梯1基础上改动:
- 增加血量,在舞台顶部显示,血量可以减少或增加。
- 游戏区域顶部增加尖刺,企鹅碰到尖刺,血量减1,企鹅会下降一段距离。
- 企鹅降落普通踏板,血量加1。
- 增加空心踏板,企鹅站在上面0.5秒后,会自动掉落。
- 增加左右传输带踏板,企鹅站在上面会自动朝着传送带方向左右移动。
- 增加尖刺踏板,企鹅站上尖刺踏板血量减1,同时身体变为受伤状态。
- 企鹅碰到游戏区域底部或血量为0时,游戏结束。
积木提示
注意事项
- 多个条件判断如何嵌套执行
- 多个指令串并行执行对程序的影响
【解决篇】
上篇文章中我们已经实现了游戏的基础的功能,这次我们就在之前的基础上,增加更多的游戏元素。
1. 增加血量,在舞台顶部显示,血量可以减少或增加。
在之前的游戏中,企鹅只要一碰到游戏区顶部和底部游戏就结束了,现在我们可以尝试着给企鹅增加血量属性,让它做某些事情后,只是掉血,游戏不会立即结束。
先在背景上增加文字“血量”。
你可以添加一个血量角色,利用矩形工具画出几个方格代表血量。每种血量状态使用一个造型,对角色增加或者减少后只需要切换不同的造型即可。
最后,再把血量角色拖动到“血量”文字后面。
使用这种方式显示血量会有一个问题,画出的总血量是固定的。如果要改变总血量,就必须修改造型。如果你学完了高级篇,可以尝试利用克隆来动态生成血量。
接下来需要考虑如果控制掉血和加血?
注意我们的造型顺序是按照满血到空血排列的,所以第一种你可能想到的方式,使用下一个造型积木就可以掉血。
如何加血呢?如果有上一个造型积木是不是就可以加血了。Scratch中只提供了上一个背景积木,却没有上一个造型积木,想一想能不能自己造一个?
下一个造型积木切换时是把造型编号递增,反过只要将造型编号递减就是上一个造型积木了。如何将造型编号递减?很简单,获取到当前的造型编号减1即可。
除了这种方式之外,还有没有别的方式可以掉血和加血?
你可以想一想,我们的血量是不是像是一个数字。没血时,血量=0;1滴血时,血量=1;2滴血时,血量=2,以此类推。血量等于会变的数字,想到了什么?
没错,你可以建立一个变量叫做“血量”,变量值的数字就是血量值。接着,如何利用变量切换对应的造型呢?
你可以将每个造型的名字按照“血量”+数字的规则命名。例如,空血就是“血量0”,1滴血就是“血量1”。
现在使用连接(苹果 )和(香蕉)积木和“血量”变量就可以连接出每个造型的名称,再将它作为换成([造型1])造型积木的参数,就可以切换到对应的血量造型。
现在要掉血和减血时,应该怎么做?很简单,在初始化变量的地方将血量值设置为满血值,在这个案例中就是5。
接着,血量角色当接收到[开始游戏]消息时,不停的利用上面说的方式切换造型。
最后,只需要在掉血和加血的地方使用将[血量]增加(1)积木增减血量变量值即可。
现在你可以动手将上面两种方法都试一试,看看舞台上的血量能否正常的变化了。
2. 游戏区域顶部增加尖刺,企鹅碰到尖刺,血量减1,企鹅会下降一段距离。
接下来开始增加游戏道具。首先,将顶部增加一排尖刺,企鹅在碰到顶部时不再直接游戏结束,改为血量减1。
尖刺可以直接在背景上画出来,或者单独添加一个角色画出来。先用矩形工具画一个长方形,接着使用直线工具画出一个三角形,然后不断复制三角形,将它们拖上去把长方形填满。
如何判断企鹅是否碰到尖刺呢?有很多不同的方法。因为顶部尖刺的坐标是固定的,你可以利用企鹅的y坐标值进行判断。
除了使用坐标判断,你还可以使用碰到颜色(颜色)?积木判断。同样,拾取颜色时记得使用滴管工具。
如果你是使用角色作为尖刺,那还可以使用碰到([鼠标指针])?积木判断。
接着,当企鹅碰到尖刺时需要它做些什么?首先血量要减1。你可以播放一个被刺的音效。然后让企鹅变红闪烁一下,像是受伤了。如何闪烁,这里最好使用将[颜色]特效设定为(0)积木,而不是单独制作受伤的造型,进行造型切换。你可以想一想为什么?(提示:企鹅站立或走路是否都会受伤)
最后,企鹅不能穿过尖刺,所以还要让它下降一段距离。这里需要注意,别忘了我们实际移动的是碰撞侦测角色,企鹅只是在跟随碰撞侦测角色移动。让企鹅给碰撞侦测角色发条消息,碰撞侦测角色收到消息后向下移动一段距离。
3. 企鹅降落普通踏板,血量加1。
既然企鹅的血量会减少,你也可以考虑让它能够回血。例如,当他降落到踏板上时,血量加1。
在这里有两个问题。第一个问题和之前降落到踏板播放音效一样,每个踏板血量只能加1次。所以,加血的操作应该和播放音效放在一起。
第二个问题要请你自己先测试一下。点击绿旗开始游戏,开始你操作的很顺利,来回在不同的踏板上移动。这时你不小心碰到了顶部的尖刺,可是血量却没有减少?这是为什么?
你可以勾选上血量旁边的复选框,查看一下此时的血量是多少。
因为在增加血量时,对血量值的范围没有做限制,所以血量会一直增加,超过了游戏设定的最大血量。此时血量角色的换成([造型1])造型积木找不到对应名称的造型,一直停留在满血状态。
如何处理这个bug?只需要在加血的地方增加一个判断,如果血量<5才将血量加1。这样一来,当血量恢复满血时就不会在进行增长。
当然你还可以将数字5使用一个变量代替,例如叫“总血量”,这样当需要修改总血量时,只用修改该变量即可。
4. 增加空心踏板,企鹅站在上面0.5秒后,会自动掉落。
接下来,我们开始增加不同的踏板类型。首先制作一个空心踏板,它的作用是企鹅只能在上面停留很短的时间。超过设定时间,踏板就像是会自动消失一样让企鹅掉落下去。
在踏板角色中复制原有的造型,然后更改踏板的颜色。当然你也可以考虑将空心踏板作为新角色添加,这样一来它就需要复制很多原有踏板的操作。
造型添加完成,如何让它出现在舞台上?
当踏板被克隆之前或是当作为克隆体启动时,我们为它随机选择一个造型。
点击绿旗按钮测试一下,现在已经可以出现新的踏板了。可是企鹅并不会在踏板上停留,应该如何处理?
企鹅之所以能够在原有踏板上停留,是因为我们在碰撞侦测角色中增加了判断,当它碰到踏板颜色时,那么就让它跟随踏板的速度向上移动。现在只需要将原有判断增加一个条件,如果碰撞侦测角色碰到了普通踏板或者碰到了空心踏板,它都会向上移动。这里的碰撞侦测依然使用颜色(颜色)碰到(颜色)?积木进行。
点击绿旗按钮测试一下,企鹅已经能够在两种踏板上停留。
接下来,如何让企鹅只能在空心踏板上停留很短的时间?
你可以这样去考虑,我们现在是通过颜色判断两个角色是否发生碰撞,如果企鹅站上空心踏板时,我们修改一下踏板的颜色或亮度,之前的判断就不会再成立,企鹅就会掉下去。
给踏板角色使用一个新的当作为克隆体启动时积木,利用踏板的造型名称或编号判断一下当前的踏板类型,如果它是空心踏板,就不停侦测它是否碰撞到企鹅,如果碰到了,那么在很短时间后调整踏板的亮度,企鹅下落后再重新恢复原样。(这里会有一个小bug,有时企鹅和踏板之间会有很小一段距离,导致踏板侦测不到企鹅)
重新点击绿旗按钮进行测试,现在企鹅在空心踏板上停留0.5秒后就会自动掉落下去。
现在还有一个问题,之前我们碰到踏板时,企鹅的血量会加1。现在有了两种踏板,我只希望它碰到普通踏板时才会加血,碰到空心踏板时不会加血,应该怎么办?
是不是需要给加血的判断再增加一个条件,如果碰到的是普通踏板,并且血量小于5,那么血量加1。
5. 增加左右传输带踏板,企鹅站在上面会自动朝着传送带方向左右移动。
现在,再来增加两个类似传送带,可以让企鹅在上面滑动的踏板。同样的,再复制两个踏板造型,将它们换成不同的颜色。然后使用直线和圆工具在踏板上画出左右滚动的效果。
接着,需要做什么事情?和空心踏板一样,我们先要让他们显示出来。很简单,修改一下踏板角色切换造型的随机数范围,现在有4个造型,随机数的取值范围改成1~4。
点击绿旗按钮进行测试,两种传送带已经可以正常的出现在舞台上,但是企鹅碰到它们时不会站立。同样的,还是在碰撞侦测角色判断颜色的地方,增加这两种踏板的颜色。只要碰撞侦测角色碰到这四种踏板的任意一种颜色,就会跟随踏板向上移动。注意这里使用的是或积木进行逻辑判断,想一想为什么?
接着,传送带不止要让企鹅跟随它向上移动,它们还会让企鹅朝着传送带的方向左右移动。如何实现?只需要让碰撞侦测角色判断一下现在是否站在传送带上,如果是,就增减它的x坐标值,让它左右移动。具体移动的速度是多少呢?传送带的速度应该要比企鹅左右移动的速度慢一些,这样它才能对抗传送带,向相反的方向走。
因为这个速度在游戏中也可能会发生改变,你同样可以建立一个变量叫做“传送带速度”来使用它。
6. 增加尖刺踏板,企鹅站上尖刺踏板血量减1,同时身体变为受伤状态。
最后,我们再来增加一种带尖刺的踏板。前面的步骤还是一样,复制一个造型,修改它的颜色,再和顶部尖刺一样,利用直线和复制粘贴工具画出踏板上的尖刺。
接着,还是修改踏板角色切换造型的随机数范围,然后给碰撞侦测角色的判断再增加尖刺踏板的颜色,让企鹅碰到尖刺踏板后可以往上升。
接着,和企鹅碰到顶部尖刺一样。当企鹅落在尖刺踏板时,我们让它播放一个音效,注意这个音效和落到其他踏板的音效不同,所以在播放声音的地方需要增加一个判断。如果碰到的是尖刺踏板,就播放受伤的音效;否则播放原有音效。此外,别忘了血量也要减1,并且每个尖刺踏板只会减少一次。
在碰到顶部尖刺时,我们做了一个颜色闪烁的特效。在这里企鹅可能会一直站在尖刺踏板上,我们可以将特效修改一下,企鹅站在尖刺踏板的时间内,就会一直不停的闪烁。如何实现?你可能会想到让企鹅判断它是否碰到尖刺踏板上,如果碰到了就闪烁。
用这种方法实现时会有一个问题,当企鹅并没有站在尖刺踏板上,只是身体碰到它,也会不停的闪烁。
所以是否碰到尖刺的判断还是需要交由碰撞侦测角色来完成。如果碰撞侦测角色碰到尖刺踏板,就通知企鹅不停闪烁。如何通知呢?在这里不能使用消息通知,例如像下面这样做。
你可以点击绿旗测试一下。现在企鹅站在尖刺踏板上时,因为碰撞侦测角色会不停地给企鹅发送消息,展示出来的效果就是企鹅的身体会一直变红,不会闪烁。应该怎么处理?
既然不能发送消息,那就只能使用变量的状态值来判断,例如建立一个变量叫做“受伤状态”。当企鹅站在尖刺踏板上时,把变量值设置为“受伤”;离开尖刺踏板后把变量值设置为“未受伤”。当然你同样可以利用数字或其他文字来表示这两种状态。
企鹅只需要不停的判断该变量的状态,如果受伤状态=受伤,那么就闪烁。
7. 企鹅碰到游戏区域底部或血量为0时,游戏结束。
最后,就是修改我们游戏的结束条件。之前我们是碰到游戏区域的顶部和底部时游戏就结束。现在条件变为碰到游戏区域底部或血量为0时,游戏结束。
很简单了,将原来游戏结束的判断条件修改一下就可以了。
这样一来,企鹅下楼梯的游戏就做完了。
我相信你就算是跟着上面的教程一步一步做,在整个过程中还是会碰到很多未知的问题。这里面主要会涉及多个嵌套条件判断和指令串并行执行造成的问题。这时候就需要你在完成每个小步骤后都要进行测试,发现问题就去分析一下自己所写的代码,找到问题的原因,然后再去想出解决方案。
如果你能很轻松的实现上面的操作,那还可以发挥自己的想象力,继续往里面增加其他游戏元素,让游戏变的更加有趣。
想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window。
想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店。