“小明的BMI指数是28.73,属于肥胖范围”卡卡自信地说。
Griffin也不废话,将钥匙交给卡卡就消失了,卡卡走进了古堡。
空荡荡的大厅里放着一扇闪闪发光的传送门。卡卡把钥匙插入门锁,门自动打开了。
一阵强光闪过,照得卡卡睁不开眼睛。等他适应了周围的光线时,发现自己进入了一个空旷的房间里。靠近墙的阴影中站着一个人,背对着卡卡。
“你好?”卡卡试探地打招呼。
这个人没有吭声,许久才转过身来——看到对方的面孔,卡卡吃惊地张大了嘴,半天都合不上——这怎么可能呢?
“是的,我就是你,卡卡。”
“要通过这最后的关卡,你必须打败我。”
学习目标
- 使用消息协调多个角色的动作;
- 在程序中使用声音的方法;
- 使用计时器相关指令实现计时。
编程实战
本节我们要实现的是一个过关游戏。BOSS会向小猫发射火球,并召唤从天而降的怪兽攻击小猫,而小猫不具备攻击能力,只能通过跳跃和移动躲避攻击。如果小猫在BOSS的攻击下能够坚持30秒,就可通关。
这是迄今为止最复杂的一个程序,有了前几节内容的基础,相信你完全可以一步一步地把它实现出来。我们先分析一下游戏中角色相关的逻辑。
- 小猫卡卡:程序开始后受键盘控制,左右键移动,空格键跳起,跳起后受到地球引力影响会慢慢落下。如果不小心碰到了BOSS发射的火球和怪物,会说“不好,被击中了”,游戏失败;如果到了30秒还没有被击中,会收到计时器发送的消息,说“我胜利啦”,结束程序;
- 怪物:程序开始后每2秒克隆一个自己,克隆体从舞台上边缘的随机位置落下来,碰到地面后消失;
- 火球:程序开始后,从BOSS身边每2秒向小猫卡卡发射一次,直到碰到舞台边缘消失;
- 小猫BOSS:不执行任何代码
- 背景:程序启动后开始计时,到30秒时发送游戏胜利的广播消息。
下面,让我们开始吧!
第一步:添加背景和角色
新建 Scratch 项目,将背景选择为内置的 “Castle 3”,添加内置的“Ladybug2”(虫子,用来充当怪物)和“Sun”(太阳,用作火球角色)到角色列表,然后用鼠标右键点击角色列表中的小猫,执行“复制”命令复制另一个小猫角色,并对角色做如下设置:
- 角色1(小猫卡卡):大小设置为70,方向90,放在舞台左下角;
- 角色2(小猫BOSS):大小70,方向-90,旋转方式为左右翻转,放在舞台右下角,与小猫面对面;
- Ladybug2:大小设置为50,位置随意,设置为隐藏状态;
- Sun:大小设置为30,放在角色2前面,设置为隐藏状态;
角色位置可参考下图:
第二步:编写Sun角色(火球)代码
Sun角色的代码我们都很熟悉,就是不断克隆自己,飞向角色1小猫,碰到边缘后删除克隆体。这里只有一条指令没有使用过,就是播放声音,这条声音类指令(紫罗兰色)非常简单,就是播放你选择的声音。你可以切换到项目编辑区的“声音”标签查看当前程序中包括的声音,对现有的声音进行编辑,或者导入电脑上的声音文件(比如Mp3文件)。如果你的电脑有麦克风设备(一般笔记本电脑都内置麦克风,台式机需要另外配置外接设备),也可以通过录音方式新建一个声音。对于本例来说,就是播放Scratch内置的“Pop”音效,这是一种类似于气泡破裂的声音——“笃”。
第三步: 编写Ladybug2角色代码
Ladybug2角色的代码与Sun角色是相似的,都是在程序启动时克隆自己。克隆体会先把自己移动到舞台上边缘的任意位置(X坐标是-240至240的一个随机数,Y坐标固定为158),然后重复执行Y坐标减少的代码直到碰到舞台下边缘(当然如果碰到了角色,游戏就结束了)。
第四步:编写角色1小猫代码
与其它角色相比,小猫的代码稍微复杂一点,但也很容易理解。左边第一段代码就是响应键盘操作的,在程序开始后先把自己显示出来(因为如果游戏失败这个角色会隐藏,所以再次游戏时应该先显示),然后就重复检测键盘输入,左右方向键的处理代码是增加或减少X坐标,而空格键则先判断如果Y坐标小于-10,就将Y坐标增加80,增加80就让小猫有了跳起的效果,而先判断Y坐标是不是小于-10,是为了避免你连续按空格键,小猫就跳到舞台上边缘去了。
在前面的分析中,我们要求小猫跳起后要能做“自由落体”运动,也就是慢慢落向地面。这个怎么实现呢?我们右边这段代码在程序启动后会一直检测小猫的位置(Y坐标),如果Y坐标大于-125,说明小猫不在地面上,这个时候我们就让它的Y坐标增加-2(即减少2),重复执行下来,它就慢慢落向地面了。下面这段检测代码则是检测小猫是否碰到了BOSS发出的火球或Ladybug2角色,如果碰到了其中一个(它们之间是“或”的关系),就会停止小猫的动作,说出“不好,被击中了……”后隐藏,并终止全部脚本。
第五步:编写计时器代码
角色的指令编写完,我们还要实现一个计时器,当程序启动后就会开始计时,到30秒时,给各个角色发一条消息。Scratch自带的计时器指令比较少,在侦测类指令中有一条“计时器归零”指令和一个内置的“计时器”变量。从你打开Scratch开始,这个计时器变量就在不断增加,你可以试着勾选这个“计时器”变量前面的对勾,它会在舞台上显示出秒数并不断增加。如果你这时把“计时器归零”拖到代码区执行一下,会发现它又从0开始重新计时了。
那么怎么在舞台上显示程序开始后的秒数呢?直接用系统内置的计时器变量行不行呢?不行,因为第一这个计时器显示的是带小数点的秒数,不太美观;第二是游戏结束的时候我们需要停止计时器,可是Scratch 并没有提供“停止计时器”的指令,只能重新开始计时!这怎么办呢?我们可以换个思路,自己新建一个“秒数”变量,在程序启动时,把它置为0,同时让计时器开始计时,我们用重复执行的代码,不断设置这个变量等于系统计时器的整数部分(也就是小数点前的数字)。一旦检测到这个“秒数”大于30,我们就不再让这个变量与系统内置的计时器同步,而是给其它角色发消息终止游戏了。
按照这个逻辑,我们可以写代码了。由于这段代码是公共的,不属于任何角色,我们最好把它写在“背景”对象的代码区域,只要先在角色列表区域选中背景,编写的代码就是背景的代码。注意在编写代码之前,先在指令区新建一个变量并命名为“秒数”:
这段代码的逻辑很简单,前面已经分析过,这里就不再赘述。
第六步:为各角色编写接收消息指令
我们通过上一步的代码广播了一条自建的“胜利”指令,其它角色收到这条消息后,需要终止自己的指令执行:
将上面的代码添加到小猫、Sun和Ladybug2三个角色中,其中小猫还要多加一条说话指令“我胜利了!”——程序就完成了。
本节内容完整的代码如下:
指令小贴示
- 播放声音【名称】:播放指定的声音,声音可以是内置的,也可以上传或录制。注意,本指令播放声音不会等声音播放完才继续执行下面的指令,而是启动声音播放后马上就继续执行后面的代码。如果你想实现的是播放完成后再执行,可以用另一条指令“播放声音【名称】等待播完”;
- 计时器归零:将 Scratch 内置的计时器变量归0。
课后思考
本节综合应用前面所学知识创作了一个完整的小游戏,角色较多,所以要理清头绪,弄清楚谁是“主角”,谁是“配角”,围绕主角要完成的工作,逐一梳理配角的行为,就会减少代码混乱的可能性。
本节作品中没有给小猫角色添加攻击BOSS的代码,也没有让BOSS移动位置,如果有兴趣的话,可以在本节内容的基础上,对各角色的代码进一步完善。