中级篇——消灭虫子1

【疑惑篇】

点击绿旗按钮进入游戏界面,点击“开始游戏”按钮开始游戏,使用鼠标控制炮筒,鼠标点击舞台发射炮弹。看谁能在最短时间内消灭虫子。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

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

BlueSky背景:

  1. 点击绿旗按钮,循环播放背景音乐。
  2. 游戏标题文字不停变换颜色。
  3. 鼠标划过“开始游戏”按钮出现颜色变换。
  4. 点击“开始游戏”按钮,进入Wall 1背景。

Wall 1背景:

  1. 虫子从顶部随机位置出现,在红墙范围内随机乱爬。
  2. 移动鼠标控制炮筒方向。
  3. 点击舞台发射炮弹,炮弹移出舞台后消失。
  4. 如果炮弹击中虫子,虫子被消灭,进入Night City背景。

Night City背景:

  1. 显示文字,说出玩家花费时间。
  2. 鼠标划过“返回”按钮出现颜色变换。
  3. 点击“返回”按钮,进入BlueSky背景。

积木提示

当绿旗被点击

当角色被点击

当舞台被点击

当背景换成[背景1]

移动(10)步

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

移到([随机位置])

面向(90)方向

面向([鼠标指针])

碰到边缘就反弹

y坐标

方向

说(你好!)

换成([造型1])造型

下一个造型

换成([背景1])背景

下一个背景

将大小设为(100)

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

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

清除图形特效

显示

隐藏

移到最[前面]

背景[编号]

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

播放声音([喵])

当接收到[消息1]

广播[消息1]

等待(1)秒

重复执行(10)次

重复执行

如果<>那么

如果<>那么否则

停止[全部脚本]

碰到([鼠标指针])?

计时器

计时器归零

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

大于

小于

等于

连接(苹果 )和(香蕉)

注意事项

  1. 鼠标划过时,如何切换按钮颜色?
  2. 如何让虫子在红墙范围内随机乱爬?
  3. 如何记录玩家花费的时间?

【解决篇】

在这个案例中,我们利用三个背景,将游戏切分为三个部分,游戏开始前,游戏中,游戏结束后。这样就可以通过区分舞台当前的背景,方便我们控制角色完成不同的任务。

第一步很简单,把三个用到的背景添加进来。注意观察这一次背景上的文字都会发生变化,所以不能在把它们写在背景中,需要作为角色单独添加。

第二步,添加角色,这一步中有几个需要思考的地方。

从角色库中选中虫子角色,你会发现它默认只有一个虫子的造型。在游戏中,虫子被炮弹击中后会有爆炸的效果,所以你需要额外给虫子增加一个爆炸的造型。你可以自己画,也可以从网上下载,或者加入我的知识星球获取所有的案例素材。

接着,使用绘制工具写出BlueSky和Night City背景中用到的文字。

接着,选择按钮角色,在上面添加需要的文字。当鼠标划过按钮时,按钮的颜色会发生变化,你可以提前思考一下,应该如何实现?

最后,还剩下大炮。在游戏中你可以观察到,炮台会固定在舞台下方不会改变。炮筒会随着鼠标移动改变方向,炮弹会从炮筒发射出去。为了方便控制,可以将它们分成三个独立的角色。同样,你可以自己画,也可以从网上下载,或者加入我的知识星球获取所有的案例素材。

第三步,使用指令积木实现程序。

BlueSky背景:

1. 点击绿旗按钮,循环播放背景音乐。

Pong2类似,在这个案例中,我们还是让舞台作为总导演,点击绿旗按钮后,将背景切换为BlueSky,接着循环播放背景音乐。

其他角色就只需要利用当背景换成[背景1]积木,当背景换成不同场景时,开始完成各自的任务。

首先是虫子、炮台、炮筒和炮弹,当背景换成BlueSky时,隐藏即可。

2. 游戏标题文字不停变换颜色。

接着是标题文字,当背景换成BlueSky时,需要将文字角色切换为“消灭虫子”的造型,移到舞台合适的位置显示出来。

除此之外,文字还需要不停的变换颜色。有没有想到飞翔的蝴蝶2中我们是如何改变天空的颜色?使用将[颜色]特效增加(25)积木不停的改变颜色特效值即可。为了颜色不会变换的太快,还需要使用等待(1)秒积木让变换慢一些。

3. 鼠标划过“开始游戏”按钮出现颜色变换。

接下来,还剩下“开始游戏”按钮。同样,当背景换成BlueSky时,它需要移到到合适的位置显示出来。

接下来,需要考虑的是如何实现鼠标划过按钮时,按钮的颜色会发生改变?

你怎么知道鼠标是否划过按钮?是不是可以使用侦测分类中的碰到([鼠标指针])?积木,当按钮碰到鼠标指针时,说明鼠标正划过按钮。

接着,你需要根据这个侦测积木返回的状态去切换按钮的颜色。如果按钮碰到鼠标指针,将它换成一种颜色,否则将它换成另外一种颜色。

怎么跟换按钮颜色?可以像标题文字一样,使用颜色特效积木进行设置。或者你还可以为按钮准备不同颜色的造型,对造型进行切换。

还有一个问题,你可以直接将如果<>那么否则积木拼接在之前的显示积木后面使用吗?你可以自己试一试。

你会发现当你把鼠标移到按钮时,按钮没有任何变化。因为当背景切换为BlueSky时,当背景换成[背景1]积木只会执行一遍,所以如果<>那么否则积木也只会执行一次,一瞬间指令串就运行完毕。

为了让指令串不会结束,可以一直不停的侦测鼠标是否碰到按钮,将如果<>那么否则积木放入重复执行积木中。

4. 点击“开始游戏”按钮,进入Wall 1背景。

最后一步,当你点击“开始游戏”按钮时,背景切换为“Wall 1”。

Wall 1背景:

切换到Wall 1背景后,需要做些什么。

首先文字和按钮角色是不是需要隐藏起来。你还可以使用停止[全部脚本]积木,停止按钮它们正在执行的重复执行指令串。

接下来是炮台角色。很简单,当背景换成Wall 1时,它只需要在合适的地方显示出来就可以了。

1. 虫子从顶部随机位置出现,在红墙范围内随机乱爬。

接下来,看看虫子角色做了什么。它会出现在舞台顶部的某个随机位置。使用在(1)和(10)之间取随机数积木和移到x:(0) y:(0)积木控制它出现的坐标范围(可以按照自己的想法修改)。再将它的造型换成beetle。因为角色默认比较大,使用将大小设为(100)积木将它缩小。最后让它显示出来。

虫子显示出来后,不会停在原地不动,它会在墙上到处乱爬。如何实现?

使用重复执行移动(10)步碰到边缘就反弹积木,是不是就可以让虫子在舞台上沿着直线不停的移动。

沿着直线,我们很容易就可以猜测出虫子的轨迹,为了游戏更好玩,我们需要让它到处乱窜。怎么做呢?你可以想一想,到处乱窜意味着什么?是不是你意味着你猜不出来它会向哪个方向移动?

所以我们可以通过在(1)和(10)之间取随机数积木和面向(90)方向积木让虫子不停的随机更改方向。

点击绿旗按钮测试一下,你会发现因为我们让虫子每走10步就更改方向,现在它看上去在不停地打转。如何处理?

想象一下我们想要的效果是什么样?是不是虫子可以正常移动一段距离,然后随机调整方向,接着再移动一段距离。

为了让虫子可以移动一段距离后再调转方向,我们可以再使用一个重复执行(10)次积木,将之前的移动(10)步碰到边缘就反弹积木放入其中。因为重复执行(10)次积木的次数有限,所以虫子只会移动一段距离。

将它拼接在之前的面向(90)方向积木后面,现在虫子就会随机修改方向后,移动一段距离,接着再重新修改方向。

为了让虫子每次移动的距离不同,你还可以随机设置它重复执行的次数。

点击绿旗按钮进行测试,现在虫子已经可以到处乱爬了。但是还会有一个问题,在游戏中虫子只能在红墙上爬,如何对它进行限制?

很简单,将墙壁最下方想象成Pong1中的获胜线,只要判断一下虫子是否越过该位置,越过了就调转虫子方向,让它向上爬。

2. 移动鼠标控制炮筒方向。

接下来,当背景换成Wall 1时,炮筒也需要显示出来。这里有个问题,炮筒的一部分应该在炮台后面,就像是小猫的降噪耳机中小猫和两辆汽车的前后位置关系,前面的东西会遮挡住后面的东西。所以需要使用移到最[前面]积木将炮筒移到炮台后面。

接着,炮筒如何跟随鼠标调整方向呢?有没有想到面向([鼠标指针])积木,只需要让炮筒不停的面向鼠标指针方向即可。

在这里会有两个问题。第一个问题,在Scratch中角色默认的方向值是90,面向右边。所以炮筒的造型需要默认朝向右边。与指南针类似,我们需要将旋转的中心点与炮筒尾部的中间重合。这样鼠标移动时,炮筒就会围绕着中心点旋转。

第二个问题,炮筒不能360度旋转,它的旋转范围应该是固定的。你可以像限制虫子的移动范围一样去限制炮筒的旋转范围。使用方向积木获取它的方向值,每当它超过你设置的方向值范围时,就将它的方向修正。

3. 点击舞台发射炮弹,炮弹移出舞台后消失。

终于可以发射炮弹了,在游戏中,每当你点击舞台时,就会有一颗炮弹发射出来。如何实现?

首先,你如何知道舞台被点击了?

当你选中舞台时,事件分类中会有一个当舞台被点击积木。它的作用和当角色被点击积木类似,每当舞台被点击,就会启动该事件积木。

现在舞台可以知道自己是否被点击,但它如何让炮弹也知道呢?有没有想到发送消息,通知它。消息内容可以设置为“发射炮弹”。

每当炮弹收到该消息时,它就会从炮筒中发射出去。具体如何实现?

首先炮弹是从炮筒中发射出去,所以它的初始位置应该和炮筒位置一致。它发射的方向呢?是不是也跟炮筒一致,也就是鼠标指针的方向。接着,炮弹在炮筒中时应该是被炮筒挡住的,所以要让它移到最后面。最后让他显示出来准备移动。

炮弹是如何移动的?它是不是一直沿着直线飞出去,直到碰到舞台边缘才消失。有没有想到Pong2中小球开始会缓慢移动,直到碰到球拍才变快。

这里类似,使用重复执行直到<>积木让炮弹重复移动,直到它碰到舞台边缘,再让它隐藏起来。

为了效果更逼真,你还可以在发射炮弹时播放一段发射炮弹的音效。

点击绿旗进行测试,你会发现一个问题,当你在BlueSky背景中点击舞台时,炮弹也会发射出来。正常情况,我们只想让它在Wall 1背景中被发射。如何处理?

你可以当舞台被点击,它要广播“发射炮弹”之前做一次检查,利用背景[编号]积木判断一下当前背景是不是Wall 1?如果是Wall 1,再广播消息。

4. 如果炮弹击中虫子,虫子被消灭,进入Night City背景。

炮弹在飞行的过程中,除了会飞出舞台,还可能会击中虫子。如何知道它是否击中虫子呢?是不是使用如果<>那么积木和碰到([鼠标指针])?积木不停的做判断,如果它击中虫子,就让它隐藏起来。

注意如果<>那么积木的位置,应该在炮弹每次移动后就侦测一次它是否碰到虫子。

另一边虫子被击中后是不是也会有反应。与炮弹类似,虫子每次移动后就要侦测它是否碰到炮弹。

如果碰到了虫子会做什么?将造型换成爆炸造型,然后可以播放一个爆炸的声音。虫子被消灭后游戏就结束了,所以还需要将舞台切换为Night City背景。

点击绿旗按钮进行测试,你会发现炮弹击中虫子后,并不会每次都游戏结束,为什么?

这是因为游戏运行时,炮弹和虫子两段指令串会同时执行,它们都在侦测自己是否碰到了对方。当炮弹击中虫子的瞬间,如果是炮弹先侦测到自己碰到了虫子,它就会将自己隐藏起来。这时虫子再去侦测自己是否碰到炮弹时,因为炮弹已经隐藏了,它就会认为自己没有碰到炮弹。知道了原因,应该如何解决这个问题?

这里可以有很多解决方式。

既然是因为炮弹隐藏太快,导致虫子侦测不到它,可以让炮弹隐藏之前等待很短的时间。因为程序的执行速度非常快,有了这点时间,虫子就可以正常的侦测到自己是否碰到了炮弹。

既然两边同时侦测时会有冲突,那你可以只让一边侦测,例如只让炮弹侦测是否碰到了虫子。当它碰到虫子时,除了让自己隐藏起来,再广播一条消息通知虫子,你被我打中了。

这时虫子就不再需要去侦测自己是否碰到炮弹,只要当它收到“打中了”的消息时,再去完成需要做的事情就可以了。

Night City背景:

最后当换成Night City背景时,虫子、炮台、炮筒和炮弹又要隐藏起来。

1. 显示文字,说出玩家花费时间。

文字角色和在BlueSky背景中类似,移动到合适的位置,换成需要的造型显示出来,别忘了将之前的图形特效清除。

接着,我们需要让它说出玩家消灭虫子总共花费了多少时间。这里需要用到侦测分类中的计时器积木。它默认会记录从Scratch被打开到现在为止花费的时间。可是,我们需要的是游戏开始到游戏结束花费的时间,所以还要使用和计时器积木相关的另一个积木,计时器归零积木。它可以将计时器的时间重置,也就是从0开始重新记录时间。什么时候使用它呢?是不是当游戏开始,也就是换成Wall 1背景时使用它。

这样一来,当游戏结束时,你就知道玩家花费了多少时间。利用说(你好!)积木和连接(苹果 )和(香蕉)积木将它说出来。

2. 鼠标划过“返回”按钮出现颜色变换。

这一步的操作和在BlueSky背景中的操作基本一致,当背景换成Night City时,将按钮显示出来。再重复不停的侦测它是否碰到鼠标指针,根据判断的结果切换造型或者使用颜色特效更换按钮颜色。

3. 点击“返回”按钮,进入BlueSky背景。

最后一步,点击“返回”按钮,返回BlueSky背景,重新开始游戏。是不是很简单,当角色被点击时,切换为BlueSky背景就可以了。

但是看一下代码,因为我们BlueSky和Night City中的按钮是同一个角色,之前已经使用过当角色被点击积木,此时如果点击“返回”按钮它会启动该事件积木,切换到Wall 1背景中。应该如何解决?

第一种方式,你可以把“开始游戏”按钮和“返回”按钮分成两个角色,让他们各自控制自己的操作。

第二种方式,还是使用一个按钮角色。当角色被点击时就像当舞台被点击时一样,通过当前的背景编号进行判断。如果当前背景是BlueSkye,就切换到Wall 1背景,否则就切换到BlueSky背景。

希望你能尽快熟悉这种,使用角色或舞台不同属性进行判断,再根据判断结果完成不同的操作。这在你开发游戏的过程中会经常使用。

点击绿旗按钮进行测试,你顺利的消灭了虫子,看见了自己的游戏时间。点击返回按钮,你顺利的返回了BlueSky背景,但是时间并没有消失。应该如何处理?

这里有个小技巧,想要让说(你好!)积木的说话气泡消失,需要再次用该积木,并将说话的内容变为空。所以你需要给文字角色换成BlueSky背景时,再使用一次没有内容的说(你好!)积木。

这样一来,消灭虫子的小游戏就完成了。目前的游戏趣味性还不够,例如虫子数量太少,每次只能发射一颗炮弹。我们会在后面继续对它升级,你也可以自己提前试一试。

想看更多学习案例,欢迎点击查看《Scratch 3学习手册》open in new window

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