中级篇——消灭虫子2

疑惑篇

点击绿旗按钮进入游戏界面,点击“开始游戏”按钮开始游戏,移动鼠标控制炮筒方向,点击舞台发射炮弹。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

每个场景中的每个角色在做什么?

消灭虫子1基础上改动:

  1. 增加虫子数量
  2. 炮弹可以连续发射
  3. 炮弹有数量限制
  4. 消灭全部虫子或用完所有炮弹时,游戏结束

积木提示

当绿旗被点击

当角色被点击

当舞台被点击

当背景换成[背景1]

移动(10)步

移到x:(0) y:(0)

移到([随机位置])

面向(90)方向

面向([鼠标指针])

碰到边缘就反弹

y坐标

方向

说(你好!)

换成([造型1])造型

下一个造型

换成([背景1])背景

下一个背景

将大小设为(100)

将[颜色]特效增加(25)

将[颜色]特效设定为(0)

清除图形特效

显示

隐藏

移到最[前面]

背景[编号]

播放声音([喵])等待播完

播放声音([喵])

当接收到[消息1]

广播[消息1]

等待(1)秒

重复执行(10)次

重复执行

如果<>那么

如果<>那么否则

等待<>

停止[全部脚本]

碰到([鼠标指针])?

计时器

计时器归零

([舞台])的[背景编号]

在(1)和(10)之间取随机数

大于

小于

等于

连接(苹果 )和(香蕉)

建立一个变量

使用变量

将[我的变量]设为(0)

将[我的变量]增加(1)

注意事项

  1. 角色和它的所有克隆体,会同时启动事件积木。
  2. 如何判断游戏是否结束?

【解决篇】

消灭虫子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

想要获取所有案例源码和素材,以及获得我对你在学习中所遇问题的一对一解答,欢迎加入石头解忧杂货店