中级篇——Pong2

【疑惑篇】

点击绿旗按钮开始游戏,选择单人游戏或双人游戏,通过“w”和“s”键控制红色球拍,通过“↑”和“↓”键控制蓝色球拍。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

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

Pong1基础上改动:

  1. 点击绿旗,进入游戏开始界面,显示按钮,隐藏其他角色,重复播放背景音乐。
  2. 点击“单人游戏”或“双人游戏”按钮,进入游戏界面,隐藏按钮。
  3. 选择单人游戏时,蓝球拍通过说话,提示玩家操作方法。选择双人游戏时,红球拍和蓝球拍同时说话,提示玩家操作方法。
  4. 倒计时结束,选择单人游戏时,玩家通过“↑”和“↓”键控制蓝球拍上下移动,红球拍自动上下移动。选择双人游戏时,玩家通过“w”和“s”键控制红球拍上下移动,通过“↑”和“↓”键控制蓝球拍上下移动。
  5. 小球从舞台中央随机向左右两边某个方向缓慢移动,碰到球拍后,恢复正常速度。

积木提示

当绿旗被点击

当背景换成[背景1]

当角色被点击

移动(10)步

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

面向(90)方向

将旋转方式设为[左右翻转]

碰到边缘就反弹

将x坐标设为(0)

将y坐标增加(10)

将y坐标设为(0)

x坐标

y坐标

方向

说(你好!)(2)秒

说(你好!)

换成([造型1])造型

下一个造型

换成([背景1])背景

下一个背景

显示

隐藏

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

播放声音([喵])

当接收到[消息1]

广播[消息1]

等待(1)秒

重复执行

如果<>那么

如果<>那么否则

重复执行直到<>

停止[全部脚本]

碰到([鼠标指针])?

碰到颜色(颜色)?

按下([空格])键?

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

加法

减法

乘法

除法

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

大于

小于

等于

注意事项

  1. 如何判断玩家选择了单人游戏或者双人游戏?
  2. 单人游戏时,另外一个球拍如何自动上下移动接球?
  3. 如何让小球先缓慢发球,碰到球拍后恢复正常速度?

【解决篇】

这一次我们在Pong1的基础上进一步修改它,让玩家可以自己选择进行单人游戏或者双人对战。

通常一个游戏会拥有多种不同的状态,例如游戏开始前,游戏进行中,游戏结束后。每种状态会有不同的背景进行不同的操作。在这个案例中,我们将游戏分为游戏开始菜单和游戏界面。在开始菜单中,玩家可以自行选择游戏类型(单人游戏或双人游戏),接着进入游戏界面,此时游戏中的角色会根据玩家选择的类型不同,做出相应的操作。

第一步,先添加一个BlueSky 2背景作为游戏界面使用,还可以将它的名称改为“游戏”,原有的BlueSky背景作为游戏开始菜单。

注意观察你会发现,在游戏开始菜单的上面有一行游戏名称“Pong”。在游戏界面的中间,有一条黄色的分割线。它们两在整个游戏的过程中没有任何的变化,所以你可以将它们作为背景的一部分,通过绘制工具画在背景上。当然也可以把它们作为角色,单独操作它们。

第二步,添加按钮角色,写上各自的游戏类型。再将它们拖动到各自需要显示的位置上。

第三步,修改程序。

1. 点击绿旗,进入游戏开始界面,显示按钮,隐藏其他角色,重复播放背景音乐。

Pong1中只有一个背景,不需要考虑背景的切换。现在多了一个背景,所以需要在点击绿旗按钮后,先将背景切换为BlueSky。这个操作可以交由舞台这个总导演管控,在当绿旗被点击事件后,使用换成([背景1])背景积木将背景改为BlueSky,接着循环播放背景音乐。

小球、球拍和数字角色点击绿旗按钮后隐藏起来。

两个按钮角色点击绿旗按钮后显示出来。

2. 点击“单人游戏”或“双人游戏”按钮,进入游戏界面,隐藏按钮。

鼠标点击其中一个按钮,进入游戏界面,这一步相信你一定知道怎么做。使用当角色被点击积木和换成([背景1])背景积木,就能在按钮被点击时,切换为游戏背景。

但是点击以后如何让按钮隐藏起来呢?直接在后面增加一个隐藏积木可以吗?

你可以自己动手试验一下,点击绿旗按钮开始游戏,然后点击其中一个游戏类型按钮。你会发现背景成功切换为游戏界面,但是只有被点击的按钮隐藏了起来,另一个按钮还会继续显示在舞台中。这个问题应该如何解决?

上个案例中你已经学习了消息积木,我相信你马上能想到,当其中一个按钮被点击时,可以发送消息通知另外一个按钮隐藏起来。

这是一种实现方式。此外,还有另一种更简单的实现方式。

在这个案例中,我们通过不同的背景将游戏状态进行了区分,所以可以当背景换成某一个时,让角色做出相应的操作。

为两个按钮角色添加当背景换成[背景1]积木和隐藏积木,当背景换成“游戏”时,两个按钮就会一起隐藏起来。

3. 选择单人游戏时,蓝球拍通过说话,提示玩家操作方法。选择双人游戏时,红球拍和蓝球拍同时说话,提示玩家操作方法。

对于蓝球拍和倒计时来说,这一步就和Pong1的操作基本一样。球拍先说话介绍操作方法,接着倒计时出现开始计时。

Pong1中是在当绿旗被点击事件后开始以上操作,在这个案例中变成了切换为游戏背景时。只需要将角色中的当绿旗被点击积木替换为当背景换成[背景1]积木即可。别忘了,在BlueSky背景中它们已经被隐藏起来,所以在这里需要将它们重新显示出来。

对于红球拍来说,当玩家选择不同游戏类型时,它会做出不同的操作,所以你需要思考第一个问题,如何判断玩家选择了单人游戏或者双人游戏?

玩家是在哪里选择的游戏类型?是不是在游戏开始菜单,通过点击游戏类型按钮选择的。红球拍知道哪个按钮被点击了吗?答案明显是不知道。所以在这里,为了让红球拍知道玩家选择了哪个按钮,就需要被点击的按钮发消息通知红球拍,当红球拍接收到它们发出的消息时,就可以做出不同的操作。

当单人游戏按钮被点击后,可以发送一条消息,内容为“单人游戏”。当双人游戏按钮被点击后,也发送一条消息,内容为“双人游戏”。

这样,当红球拍收到“单人游戏”消息时,就只用显示出来,不需要说话。当红球拍收到“双人游戏”消息时,既要显示出来,也要说话介绍操作方法。

4. 倒计时结束,选择单人游戏时,玩家通过“↑”和“↓”键控制蓝球拍上下移动,红球拍自动上下移动。选择双人游戏时,玩家通过“w”和“s”键控制红球拍上下移动,通过“↑”和“↓”键控制蓝球拍上下移动。

在这一步中,蓝球拍的操作和Pong1一样,没有变化。它只要在收到倒计时发出的“开始游戏”消息后,通过“↑↓”两个按键控制它在舞台内移动即可。

对于红球拍来说,玩家选择了不同的游戏类型,它的操作又会发生变化。

在这里有两个问题需要解决。第一个问题,红球拍如何知道玩家选择了哪种游戏类型?

在上一步中,我们是通过游戏类型按钮发送的消息来判断玩家选择了哪种游戏类型。或许你会想到,将控制红球拍移动的积木串拼接到上一步两个消息串后面使用。为了等待倒计时结束才能移动,需要在前面添加一个等待(1)秒积木,参数为倒计时积木所花费的时间。

这是一种实现方式,不过这样实现又会出现在Pong1中提到的问题,假如在倒计时之前,你还想增加其他的游戏功能介绍,这时候需要等待的时间就会发生改变,你就需要去不断修改等待(1)秒积木中的时间参数。

如果依然让红球拍保持原样,在接收到“开始游戏”消息后才能移动,还有什么方式可以让红球拍区分游戏的类型呢?

我们可以将游戏的类型想象成两个数字,例如数字1代表单人游戏,数字2代表双人游戏,只要我能想办法让红球拍记住玩家选择了哪个数字,当球拍移动时就可以通过这个数字反过来判断,玩家当时选择的是哪种游戏类型。

你可以想一想,在Scratch中哪些地方会有数字?有没有想到造型编号?角色的每个造型是不是会有一个造型编号,从1开始不断递增。现在你就需要想一想,如何利用造型编号来代表玩家选择的游戏类型?

原本的红球拍角色中只有一个造型,通过“复制”菜单可以为它复制一个一模一样的造型。

现在红球拍就拥有了两个造型,第一个造型的编号是1,第二个造型的编号是2。接下来,只需要在红球拍知道玩家的选择时,将玩家选择的答案通过造型编号记录下来。如何操作呢?

很简单,在红球拍收到“单人游戏”或“双人游戏”的消息时,分别切换到对应的造型就可以了。

这样一来,当红球拍接收到“开始游戏”消息时,就可以通过此时的造型编号来判断,应该自己移动还是通过按键控制它移动。

这个判断应该放在哪里呢?是不是要放在让球拍不停移动的重复执行积木中,每当红球拍移动之前都需要做一次判断,再执行对应的操作。

接下来,第二个问题,红球拍如何自动上下移动?

回答上面的问题之前,我们可以试着思考一下另一个问题,球拍移动的目的是什么?是不是为了接住小球。继续追问,球拍如何才能接住小球?是不是让球拍出现在和小球相同的位置。

所以,这一步实际上在做的事情是,如何让红球拍在垂直方向跟随小球移动?有没有马上想到小狗追星星2。唯一不同的是,这一次的红球拍需要固定x坐标上下移动。

请你继续想一想,移动(10)步积木中所填的数字,对游戏难度有什么影响?在你完成游戏后,尝试修改成不同的数字亲自测试一下。

5. 小球从舞台中央随机向左右两边某个方向缓慢移动,碰到球拍后,恢复正常速度。

到了最后一步修改,在Pong1中我们让小球固定都是从左边开始向右移动。

这一次为了让游戏保持公平并且更加有趣,小球发球时会从舞台中央随机向左右两边任意一个方向移动。

又因为从中间到两边的距离比较近,如果小球移动太快玩家可能会来不及反应,所以我们让小球刚开始向两边移动时速度慢一些,等到玩家第一次接住小球后,再恢复为跟Pong1一样的速度。

应该如何实现呢?

首先,小球的初始位置发生了变化,所以在接收到“开始游戏”消息时,先让它移到舞台中央显示出来。

接着,它要从左右两边随机选择一个方向移动。你可以想象玩抛硬币一样,硬币正面朝上就向右,硬币反面朝上就向左,它们各自出现的可能性都是50%。但是Scratch中没有硬币怎么办?你可以利用在(1)和(10)之间取随机数积木代替硬币,当你在1和2之间取随机数时,返回1就相当于硬币的正面,返回2就相当于硬币的反面。

朝右的角度范围可以和Pong1中一致,朝左的角度范围与朝右的数值相反即可。

选择好了方向,接下来就需要让小球先缓慢移动,再恢复原始速度。我们可以将它们分为两段路程分别来实现。

第一段路程,从初始位置移动到球拍。与Pong1一样,使用重复执行移动(10)步积木让小球缓慢移动。接着每次移动后,需要判断它是否碰到了球拍,如果碰到了球拍就要停止该循环,恢复成Pong1中的移动方式。如何恢复呢?很简单,发条消息通知自己,当自己收到消息时就恢复成Pong1的移动方式。

除此之外还有没有别的实现方式?

在第一段路程中,小球的移动并不会一直重复不停,而是满足某个条件后,重复执行就会停止。所以在这里更简单的方式是使用重复执行直到<>积木。

该积木也可以让程序重复执行,与重复执行积木的区别是,每重复执行一次后,该积木会去判断自己参数中的条件是否满足?如果不满足条件,继续重复执行。如果满足条件,停止重复,继续去执行该积木后面的其他指令。

回到案例中,我们只需要使用重复执行直到<>积木去判断小球是否碰到球拍?如果不满足条件,就是没有碰到球拍,小球继续缓慢移动。如果满足条件,也就是碰到了球拍,就结束循环,执行第二段路程。

实际上,这里还有一个问题。小球缓慢移动的过程中,除了会碰到球拍这种情况之外,还可能没有碰到球拍直接出界。所以在重复执行直到<>积木的条件判断中,除了需要判断小球是否碰到球拍,还要判断小球的x坐标是否超过了获胜的坐标线。

当这四种情况(碰到红球拍、碰到蓝球拍、超出红球拍、超出蓝球拍)满足其中任意一种时,小球就要停止该循环,所以需要使用运算将它们连接起来。

最后,将Pong1的移动方式拼接在该积木后面。这样一来,修改版的Pong2就完成了。

从中级篇开始,你会发现一个案例可以使用的制作方法会变得越来越多。

例如第4步中,我们利用了红球拍的造型编程来保存玩家选择的游戏类型。你还可以换成小球或是其他角色的造型编号,也能完成同样的操作。等你在之后的案例中学会使用变量后,还可以使用变量来完成它。

我所给出的解决方法不是考试中的标准答案,也不一定是最佳的实现方式。所以在练习的过程中,一定要保持自己动脑的习惯,尽可能多的想出不同的解决方法,再去对比一下各种方法之间有什么优缺点。

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

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

Last Updated:
Contributors: lanheixingkong