中级篇——企鹅下楼梯1

疑惑篇

点击绿旗按钮开始游戏,企鹅会从舞台上方自动下落,使用左右按键控制企鹅移动。企鹅碰到天花板或掉落舞台底部游戏结束。

视频演示open in new window

亲自操作open in new window

【线索篇】

案例分析

它们发生的场景是什么?

每个场景中有哪些角色?

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

  1. 点击绿旗按钮,循环播放背景音乐。
  2. 踏板从游戏区域底部向上移动,碰到游戏区域顶部自动消失。
  3. 企鹅从游戏区域上方向下降落,使用左右按键控制企鹅左右移动。
  4. 企鹅降落踏板上,播放音效,企鹅同时随踏板向上移动。
  5. 企鹅碰到游戏区域顶部和底部,游戏结束。播放结束音效,显示GAME OVER文字提示。
  6. 舞台顶部显示下落楼层数,该数字随时间自动增加。

积木提示

当绿旗被点击

移到([随机位置])

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

面向(90)方向

将x坐标增加(10)

将y坐标增加(10)

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

y坐标

换成([造型1])造型

显示

隐藏

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

播放声音([喵])

当接收到[消息1]

广播[消息1]

等待(1)秒

重复执行(10)次

重复执行

如果<>那么

如果<>那么否则

重复执行直到<>

停止[全部脚本]

当作为克隆体启动时

克隆[自己]

删除此克隆体

碰到颜色(颜色)?

颜色(颜色)碰到(颜色)?

按下([空格])键?

减法

乘法

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

大于

小于

等于

建立一个变量

使用变量

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

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

注意事项

  1. 只有当企鹅的脚与踏板接触时,才会随踏板向上移动。
  2. 企鹅站立、下落和左右移动时,使用不同的造型。

【解决篇】

企鹅下楼梯是我在蝙蝠躲避球1中提到的另外一个模仿《是男人系列》的小游戏。

游戏的玩法很简单,点击绿旗开始游戏后,企鹅会自动向下降落,当它降落到向上移动的踏板时,可以随着踏板上升。玩家通过按键控制企鹅左右移动,降落到不同的踏板上,避免企鹅触碰游戏区域的顶部和底部。每隔一秒楼层数会增加1,看看最终谁坚持的楼层数最多。

第一步,我们需要利用绘图工具,画出游戏背景。

使用文字工具在舞台顶部写上“地下”和“层”三个字,在它们中间留出显示楼层数变量的位置。文字下方使用矩形工具画出游戏区域。

第二步,添加角色。

先使用矩形工具画出踏板。

使用文字工具写出GAME OVER。

从角色库中选中企鹅。

企鹅默认有四个造型,将它们分别作为站立、下落和走路时使用。

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

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

第一步很简单了,上传一个自己喜欢的背景音乐,当绿旗被点击后,循环播放它。

2. 踏板从游戏区域底部向上移动,碰到游戏区域顶部自动消失。

我们的角色只有一个踏板,游戏中却有很多踏板向上移动,很明显会用到克隆体。

当绿旗被点击后,先将原本的角色隐藏起来,接着使用重复执行积木和克隆[自己]积木不停的克隆出踏板。为了控制踏板的数量,避免两个踏板之间出现的太快,每次克隆后可以等待(0.5)秒

接下来,考虑一下当作为克隆体启动时需要做些什么?

首先,它们会移动到游戏区域底部,显示出来。具体它会在底部的哪个位置出现,可以由在(1)和(10)之间取随机数积木决定,你只需要将踏板拖动到舞台的左右两侧,找出x坐标的随机范围即可。

接着,踏板会不停地向上移动。相信现在的你已经可以想出很多让踏板向上移动的方法。例如,使用移动(10)步或是将y坐标增加(10)积木。

踏板并不是会一直移动,当它碰到游戏区域顶部时就会消失。怎么知道它到了游戏区域顶部?你可以通过踏板的y坐标值进行判断,或是使用碰到颜色(颜色)?积木进行判断。

别忘了选择颜色时,要使用滴管工具,避免颜色值不同导致判断出错。

最后如何让踏板消失?在这里不能使用隐藏积木。此时的踏板时克隆体,当游戏中不再需要它们时,必须使用删除此克隆体积木将它删除。

点击绿旗按钮进行测试,踏板已经可以正常从游戏区域底部随机出现,上升到游戏区域顶部消失。

在这里你还可以再做一件事。通过之前的案例学习,你已经知道了变量可以用来代表可能会发生改变的数据。在这个游戏中,踏板上升的速度可能会作为游戏的难度设置发生改变,因此你可以建立一个变量“踏板上升速度”,在游戏开始时设置它的初始速度值,再将它作为移动积木的参数使用。该变量也会在之后的步骤中发挥作用。

3. 企鹅从游戏区域上方向下降落,使用左右按键控制企鹅左右移动。

轮到企鹅了,当绿旗被点击后,先将它移到游戏区域上方。接着与踏板类似,使用重复执行积木和将y坐标增加(10)积木让它下落。这里企鹅的下落速度依然可以建立一个变量来代替。

接着,与Pong中通过键盘控制球拍上下移动类似,在这里变成通过按键控制企鹅左右移动。移动的速度依然可以建立一个变量来代替。

你可以将下落和左右移动放在同一个重复执行积木中执行。

或者把它们放在不同指令串中并行执行

点击绿旗按钮进行测试,企鹅已经可以正常下落,通过按键控制它左右移动。

4. 企鹅降落踏板上,播放音效,企鹅同时随踏板向上移动。

接下来,企鹅落在踏板上时会随着踏板向上移动,如何实现?

你需要先判断企鹅是否落在踏板上,如果在踏板上,那么企鹅就不再下落,而是跟随踏板向上升高;否则企鹅继续下落。

也许你马上就能想到使用碰到([踏板])?积木进行判断,当它碰到踏板时,说明他降落在踏板上。

下降操作刚刚已经完成,如何上升呢?是不是和踏板上升的操作一样。在这里,刚刚建立的变量“踏板上升速度”就发挥了作用,使用它作为参数,就能让企鹅和踏板上升的速度保持一致。

点击绿旗按钮进行测试,现在企鹅碰到踏板时已经可以正常跟随踏板上升。可是当你不小心让企鹅的身体左右两边碰到踏板时,它就像是被挂在踏板边上,双脚悬空,跟随踏板上升。这是为什么?

这是因为当你使用碰到([踏板])?积木进行判断时,无论企鹅角色的哪个部分碰到踏板角色,判断都会成立,从而执行那么后面的指令。在游戏中,我们希望的是只有当企鹅的脚碰到踏板时,才让企鹅随着踏板向上移动。应该如何解决这个问题?

在这里需要用到一个游戏开发中的小技巧,在游戏中添加一个隐藏的侦测角色,它就像是原本角色的隐藏部分,专门用来代替角色进行碰撞侦测。具体如何做呢?

首先,添加一个碰撞侦测角色,利用绘制工具在坐标点画一根红线。这根红线有什么用处呢,它就代表了企鹅的双脚。

接着,去调整企鹅的造型,让企鹅的双脚处在坐标点的上方。

当企鹅与红线移动到相同位置时,仿佛企鹅站在红线之上。

接下来,我们需要让碰撞侦测角色代替企鹅移动,以及做碰撞侦测。而企鹅只需要跟随红线移动即可。

拖拽企鹅的指令串,复制给碰撞侦测角色。

再将企鹅原本的指令串删除,修改为当绿旗被点击后,让企鹅不停移到([碰撞侦测角色])的位置。

此时,在舞台中实际下落、被键盘控制左右移动、以及不停判断自己是否碰撞踏板的角色,变成了新增的碰撞侦测角色。企鹅只是像一个傀儡一样,不停的跟随碰撞侦测角色移动。这时候当企鹅的身体碰撞到踏板时,不会再像之前一样被挂在踏板两边。

现在还有一个问题,红线如果一直显示出来会不太美观,所以我们可以使用隐藏积木或者直接修改角色的隐藏属性,将它隐藏起来。

重新点击绿旗按钮进行测试,企鹅可以正常下落,使用按键也可以让企鹅左右移动,可是当企鹅碰到踏板时,它并不会跟随踏板向上移动,而是一直往下掉落。这是为什么?

因为当红线使用碰到([踏板])?积木进行判断时,如果红线被隐藏起来,该积木就会失效。这时候我们需要将它替换成颜色(颜色)碰到(颜色)?积木。

该积木有两个颜色参数。第一个颜色参数代表使用该积木的角色身上的颜色,例如碰撞侦测角色使用的红色。第二个颜色参数是角色是否碰到的颜色,例如踏板的颜色。使用该积木时,那怕使用该积木的角色已经被隐藏,它也可以正常执行。

重新点击绿旗按钮进行测试,现在就算碰撞侦测角色被隐藏起来,企鹅也可以正常跟随踏板向上移动。

企鹅除了可以跟随踏板移动之外,每当降落在踏板上时,都会播放一个音效。是当红线与踏板碰撞时直接播放音效吗?如果企鹅站立在踏板上,就会重复不停的一直播放该音效,我们希望的是碰撞到踏板之后只播放一次。如何处理?

我们可以建立一个变量叫做“声音状态”,它有两种状态值“未播放”和“已播放”,当然你同样可以使用0和1,或者其他任何你喜欢的文字来代替这两种状态。

现在当红线与踏板碰撞时,我们会对该变量值进行判断,如果声音状态=未播放,说明还未播放过音效,那么使用播放声音([喵])积木播放音效,同时将声音状态设置为已播放。当企鹅继续站在踏板上,循环重新执行到该判断时,因为现在的声音状态≠未播放,所以不会再重复播放音效。

那什么时候应该将声音状态还原为未播放呢?当红线离开踏板时,我们就要将声音状态重新设置为未播放,这样一来红线下一次碰撞到踏板时,又会播放一次音效。

5. 企鹅碰到游戏区域顶部和底部,游戏结束。播放结束音效,显示GAME OVER文字提示。

现在要判断什么时候游戏结束了。这一步很简单,你只需要不停对红线的y坐标值进行判断,当它超过游戏区域的顶部和底部坐标时,代表游戏结束,它就可以发送一条消息通知所有角色,各自完成结束工作。

红线自己接收到消息时,可以停止[该角色的其他脚本]

企鹅接收到消息时,可以停止[该角色的其他脚本],还可以播放一个结束音效,再切换为下落的造型。

文字角色默认是隐藏起来的,接收到消息时,切换成gameover造型,显示在舞台的最前面。

舞台接收到消息后,可以逐渐减少背景音乐的音量,最后停止[全部脚本]

游戏结束后重新点击绿旗按钮开始游戏,你会发现背景音乐没有了。因为上一次结束时音量被调低,所以在游戏最开始当绿旗被点击后,舞台需要将音量还原为默认值100%。

6. 舞台顶部显示下落楼层数,该数字随时间自动增加。

最后还剩下舞台顶部的楼层数。又要新建一个变量叫做“地下层数”,使用大字显示将它放在舞台背景文字的中间。

程序开始后先将它设置为0,之后每等待(1)秒,变量值就增加1。

点击绿旗进行测试,游戏的功能已经全部完成,但是我们还差一个东西没有做。添加角色时我们说过,企鹅默认有四个造型。当企鹅站立、下落和左右移动时,我们使用不同的造型来代表它的状态。

动手之前我们可以先想一想企鹅不同的状态分别对应哪些条件?

根据上面的条件,我们就可以在程序中进行判断,从而让企鹅切换到对应的造型。

上面的判断是由碰撞侦测角色执行的,它又该如何通知企鹅角色切换到对应的造型呢?

一种方式是发送消息,企鹅接收到消息后换成对应的造型。

另一种方式是通过变量。建立一个变量叫做“企鹅造型”,碰撞侦测角色做判断后将变量值设置为对应的造型名称。

这样企鹅就可以利用换成([造型1])造型积木和“企鹅造型”变量不停的切换造型。

这里比较特殊的是走路造型,它有两个造型需要不停切换,同时还需要根据按键的不同,修改企鹅的方向值。当然别忘了将企鹅的旋转方式设置为左右翻转,否则企鹅向左走时,就会变成倒立前行了。

现在游戏已经完成了,在这个案例中我们使用的变量比较多,所以你还可以做一个优化,将所有变量初始化(设置变量的初始值)统一集中由舞台来完成,这样一来需要修改某个变量时,就不用一个角色一个角色的去找它在哪里。

对变量进行统一初始化后,为了避免初始化的指令还未结束,其他角色的指令串就提前运行,我们可以在变量初始化完成后发送一条“开始游戏”的消息,其他角色就不再当绿旗被点击后开始游戏,而是改为当接收到[开始游戏]消息时启动。

在这个案例中,我们完成了企鹅下楼梯的基础玩法。在下一个案例中,我们将会增加更多的踏板类型,让游戏变的更有趣。

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

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

Last Updated:
Contributors: lanheixingkong