中级篇——消灭虫子2
疑惑篇
点击绿旗按钮进入游戏界面,点击“开始游戏”按钮开始游戏,移动鼠标控制炮筒方向,点击舞台发射炮弹。
【线索篇】
案例分析
它们发生的场景是什么?
每个场景中有哪些角色?
每个场景中的每个角色在做什么?
在消灭虫子1基础上改动:
- 增加虫子数量
- 炮弹可以连续发射
- 炮弹有数量限制
- 消灭全部虫子或用完所有炮弹时,游戏结束
积木提示
注意事项
- 角色和它的所有克隆体,会同时启动事件积木。
- 如何判断游戏是否结束?
【解决篇】
在消灭虫子1中,我们已经可以发射炮弹消灭虫子。但是在游戏中每次只能发射一枚炮弹,墙上也只有一只虫子。在这个案例中,我们就来增加虫子的数量,同时让炮弹可以连续发射。
这个案例用到的背景和角色都没有变化。首先,我们就来考虑如何增加虫子的数量?
学习完之前的案例后,我猜你立马就能想到使用克隆来完成它。修改很简单,当背景换成[Wall1]时,使用重复执行(10)次积木和克隆[自己]积木克隆虫子,重复执行(10)次积木填入的参数就是虫子的数量。再将原本由角色完成的操作,改为由当作为克隆体启动时积木启动,交由克隆体来执行。
此外,在之前的程序中,当虫子被打中后会直接切换为Night City背景。现在虫子变多了,不能直接切换背景。你一定能想到,将原来的停止[该角色的其他脚本]积木和换成([Night City])背景积木删掉,改为使用删除此克隆体积木,删除被打中的虫子克隆体即可。
修改完成,点击绿旗按钮进行测试,进入游戏菜单界面,点击“开始游戏”按钮进入游戏界面,现在已经有很多虫子开始在墙上到处乱爬。接着,控制鼠标发射炮弹,意外发生了,当你的炮弹击中虫子时,不只是被击中的那只虫子被删除,而是所有的虫子都消失了。为什么会这样?
在我们的程序中,当炮弹击中虫子后,是由炮弹广播了一条“打中了”的消息通知虫子。因为是广播消息,因此所有的角色,包括所有的克隆体都会接收到这条消息。这样一来,所有的虫子克隆体都会执行上面修改过的指令串,删除自己。
知道了原因,应该如何修复它?
还记不记得之前为什么我们会使用广播消息的方式来通知虫子?当炮弹和虫子同时去侦测是否碰到对方时,一个会先执行,另一个会后执行。例如,当炮弹先侦测是否碰到虫子,返回的结果为true,接着它立即将自己隐藏起来。此时,虫子再去侦测是否碰到炮弹,返回的结果就会永远为false。
为了解决这个问题,我们使用了两种不同的方法。第一种,侦测到碰撞后,增加一个很小的等待时间,使得对方也可以侦测到自己。第二种,就是上面的利用广播消息通知对方。
现在广播消息不能使用了,我们就换成第一种方法。删除掉广播和接收消息积木,换成当炮弹和虫子移动后,侦测是否碰到对方,如果碰到了,先等待很短的时间,再执行各自的任务。
重新点击绿旗按钮进行测试,现在炮弹已经能够正常的消灭碰到的虫子。不过新的问题也出现了,当你把所有虫子都消灭以后,游戏并不会结束。因为之前我们已经把换成([Night City])背景积木删掉,现在我们需要在虫子被全部消灭后重新使用它。问题来了,你怎么知道虫子是否被全部消灭了?
每个虫子克隆体被炮弹击中后会删除自己,可是它并不知道其他的克隆体是否还在。你会不会想到,如果舞台上能有一个人可以帮忙数一数还剩多少虫子就好了。有什么东西可以代替这个人的工作呢?有没有想到使用变量?
我们可以建立一个变量叫做“虫子数量”,将它作为一个计数器。
每当背景换成[Wall1]时,将它设置为游戏中需要的虫子数量,然后把它作为重复执行(10)次积木的参数,此时就会生成对应数量的虫子克隆体。
接着,每当一个虫子被消灭时,就要将虫子的数量减1,这样一来虫子的数量就会慢慢减少。
一旦虫子的数量变为0,游戏就会结束,使用换成([Night City])背景积木跳转到游戏结束背景。那应该如何判断数量变为0,并切换背景呢?
你可以在虫子克隆完自己后,使用重复执行积木不停的判断虫子数量是否等于0,如果虫子数量=0,那么就换成Night City背景。接着,当背景换成[Night City]时,停止[该角色的其他脚本]。
此外,你还可以使用等待<>积木。
该积木与等待(1)秒积木类似,当执行到它时,指令都会停止往下执行。。不同的是,等待(1)秒积木是在等待参数设置的时间后,继续往下执行。等待<>积木是在满足参数设置的判断条件后,继续往下执行。
回到案例中,在虫子克隆完自己之后,你就可以使用等待<>积木,判断条件设置为虫子数量=0,之后再使用换成([Night City])背景积木。
此时,如果虫子数量不等于0,程序会一直停止在等待<>积木位置,直到虫子数量减少为0时,程序才会继续执行换成([Night City])背景。
现在虫子被全部消灭后,已经可以正常结束游戏。我额外再留给你一个问题,如果将等待<>积木换成重复执行直到<>积木,效果是否一样?
接下来,我们开始来考虑如何让炮弹可以连续发射?
既然想要连续发射炮弹,你可以先思考一下为什么之前每次只能发射一枚炮弹?
其实很简单,因为我们只有一个炮弹角色,每次点击舞台发射炮弹时,无论炮弹飞到了什么地方,都会让它重新回到炮筒位置,再发射出去。如果要连续发射的话,只要有多个炮弹各自飞行就可以了。
是不是和虫子类似,也给炮弹使用克隆积木。每当接收到“发射炮弹”的消息时,就克隆自己。在将原本角色的操作改为当作为克隆体启动时执行。
点击绿旗按钮进行测试,似乎已经能正常连续发射炮弹消灭虫子了。
接下来,我们继续考虑如何设置炮弹的数量,玩家必须在炮弹用完之前消灭虫子才算获胜。
既然要控制炮弹的数量,是不是和前面的虫子一样,建立一个变量“炮弹数量”来为炮弹计数。
接着,当背景换成[Wall 1]时,将炮弹数量设置为初始数量,例如100枚。每当发射炮弹时,将炮弹数量减1。
点击绿旗按钮进行测试,进入游戏后连续点击舞台发射炮弹,此时请你注意观察舞台上炮弹数量的变量值变化。自己明明并没有发射几枚炮弹,可是变量值很快就从100减为0,甚至是负数。这是为什么?
还记不记得刚刚用炮弹射击虫子时,为什么明明炮弹只打中了一枚虫子,可是所有虫子都消失了?现在炮弹数量的变化也是一样的道理。
当你连续点击舞台广播“发射炮弹”消息时,在舞台上还未被删除的克隆体全部都会接收到该消息,接着所有克隆体都会执行将炮弹数量减1,然后克隆自己。也就是说,炮弹数量并没有按照我们所想的一个一个的减少,当舞台有10克隆体时,炮弹数量就会减少11(原来的角色+10个克隆体),接着如果原本的10个克隆体和新增的11个克隆体都还在舞台时,继续发射炮弹,炮弹数量就会减少22,以此类推。
分析完了原因,应该如何解决该问题?当所有炮弹接收到消息,我们需要对它们进行区分,只让原本的角色可以减少炮弹数量,并克隆自己。其他克隆体不会执行该操作。如何区分?想办法找出角色与克隆体之间的区别。
一种简单的方式,当背景换成[Wall 1]时,先将原本的角色移到舞台底部(x:0,y:-180),其他炮弹发射出去后y坐标值肯定会大于-180。这时当接收到“发射炮弹”的消息时,增加一个判断,只有y坐标=-180的角色才能将炮弹数量减1,并克隆自己。如此一来,就能区分原始角色和克隆体了。
点击绿旗按钮进行测试,现在炮弹数量已经可以正常的一个一个减少了。
接下来,既然要限制炮弹数量,那在炮弹发射时我们还需要再增加一个判断,如果炮弹数量>0,那么可以正常发射,否则说明炮弹已经用完,游戏结束,需要将背景切换到Night City。
点击绿旗按钮进行测试,炮弹用完,背景正常切换到Night City,可是没有被消灭的虫子还会在舞台中乱爬。你需要回到虫子的脚本区,当背景换成[Night City]时,使用删除此克隆体将剩下的虫子全部消灭。
除此之外,当你是因为炮弹用完结束游戏时,说明你的游戏失败了,所以还要为文字角色增加一个游戏失败的造型。
当文字角色换成Night City背景时,需要增加一个判断。如果虫子的数量=0,说明游戏成功,换成胜利的造型,说出游戏用时。否则就换成失败的造型。
以上,消灭虫子的游戏就修改完成了。接下来,你可以模仿蝙蝠躲避球2为游戏设置不同的难度。或者你还可以把炮台改为坦克,让它可以通过按键移到起来,这样就变成了一个坦克大战的游戏。试着不断发挥自己的想象力,去创造属于自己的作品。
想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window。
想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店。