通过永恒之河,天色转暗,一轮明月冉冉升起。卡卡慢慢走进了密林深处。
月光下的一切很安静,只有卡卡自己的脚步声,以及远处不时传来的不知名动物的叫声。四周隐藏着一种莫名的危险气息。
卡卡的夜视能力不错。他瞪大眼睛,小心翼翼地向前走,想尽快走出这个令人不安的地方。
“哗啦啦……”前面忽然传来一阵异响。卡卡敏捷地向后跳了一步,抬头看去——不好!一大群黑色的蝙蝠象乌云一样飞快地向自己扑过来!
AI助手适时传来了提示——请使用飞镖消灭来袭的吸血蝙蝠。
卡卡发现手里出现了飞镖,他急忙甩了出去。
“嗖”!“嗖嗖!”
锋利的飞镖呼啸而去,被击中的蝙蝠纷纷惨叫着化为黑烟消失。
卡卡正想松口气,更多的蝙蝠黑压压地飞了过来……
本节学习目标
- 练习使用绘图编辑器画造型,进一步掌握绘图方法;
- 使用随机指令产生指定范围任意数字的方法;
- 用鼠标或其它角色作为目标,改变当前角色方向的方法;
- 使用侦测类指令,判断角色与其它角色或舞台的碰撞情况;
- 学会使用克隆指令快速创建同一个角色的副本。
编程实战
本节我们要开发的是一个射击小游戏,在这个游戏中你要用鼠标引导方向,空格键发射飞镖,击落飞来的蝙蝠。
第一步:建立游戏场景
新建 Scratch 项目后,保留小猫角色,添加一个角色库中的Bat(蝙蝠),并将背景设置为 Scratch 背景库中的 Wood(树林)。你可能觉得蝙蝠有点大,没关系,待会我们把程序写好后再调整大小,现在这样有利于查看动画效果。
小猫、蝙蝠都有了,还差什么?小猫扔出的飞镖啊!使用“绘制”角色功能,打开绘图编辑器,自己画一支飞镖吧。
先用画方形工具画一个长方形,然后选中图中所示的变换工具:
这个变换工具的神奇之处在于,你可以用它任意修改形状!比如,你可以用它在长方形左侧这条边中间位置点一下,这个位置就多出了一个节点,然后用鼠标拖动这个节点向左,这个长方形就会变成图中的样式:
然后选中长方形右上方的节点,点击功能菜单区的“删除”,删除这个节点:
节点消失后,用变换工具拖动最右侧的节点移动到垂直居中的位置,形状调整成这样:
再画一个长方形的手柄,选中这个长方形后点击功能菜单区的“放最后面”:
最后再画一个红色轮廓,无填充色的圆形到尾部。这个简易飞镖就完成了。尽管你可能觉得这个飞镖角色不是那么完美,但相信通过这几个简单的步骤,你能理解绘图中图形变换的方法。
在飞镖角色的属性区把大小改成15或20,然后放到小猫前面。现在你的舞台区应该是这样:
第二步:为蝙蝠编写代码
运用前几节课掌握的知识,我们用重复执行指令,加上切换造型,让蝙蝠“动”起来。
运行起来,这只蝙蝠就会开始不断地扇动翅膀。与此同时,我们还希望蝙蝠从右上角出现,然后向小猫逼近——这里面有一个问题,我们不希望它每次出现的位置都是固定的,而是在舞台右上角的一个区域范围内出现。从上一节的内容我们得知,可以用X、Y坐标确定角色位置,现在的问题是怎么让每次程序运行的时候,获得一个不一样的坐标呢?这要用到随机运算指令。你可以在“运算”类指令中找到它:
这条指令每次运行时,就能生成一个在指定范围内的数字,称为“随机数”,就像我们在买彩票的时候“机选”一样,由计算机选择的一个数。只要把X、Y坐标设置为随机数,就能控制蝙蝠出现的位置了。
掌握了随机指令,我们就可以编写另一段代码了,注意这段代码也使用绿旗启动。这里有一个重要的概念,即同一个事件会触发多段代码执行,它们是“同时”执行的,这在计算机编程中被称为“并行”。也就是说,蝙蝠在扇动翅膀的同时会执行这段代码,飞向小猫:
新增的代码中我们用到了随机指令确定蝙蝠的坐标位置,然后用“面向”指令(这也是一条运动类指令,它可以让角色移动的方向朝向某一个角色或者鼠标指针)调整它的飞行方向,并调整旋转方式为左右旋转,接着我们使用了一条“重复执行直到”指令,这和以前我们使用的重复指令不同,它带有一个“结束条件”,当这个条件满足的时候就不再执行自己包含的代码,而是继续向下执行后续指令。
那么这个“结束条件”是什么呢?这是一条“侦测”类条件判断指令(湖蓝色),执行指令的时候如果当前角色碰到了指定的对象(可以是其它角色、舞台边缘或鼠标指针),条件就成立(判断结果为“真”),重复执行结束。对这段代码来说,就是蝙蝠不再移动,而是说“哈哈,你失败了”,中止全部脚本(中止全部脚本意味着所有角色的代码都会停止执行)。
第三步:创建一群蝙蝠
现在你执行程序,会看到蝙蝠直接飞向小猫。但故事中说的是一大群蝙蝠,怎么让创造出“一群”蝙蝠呢?你可以用鼠标右键点击蝙蝠,复制角色,复制出来的蝙蝠和原来的蝙蝠一样都具有同样的代码,你执行程序的时候,这两只蝙蝠都会飞向小猫:
那么是不是用这种方法就可以了呢?理论上是可行的,但是首先这种方法很麻烦,有多少只蝙蝠你就要复制多少次,还不能控制这些蝙蝠出现的时间,不过更致命的问题是——如果复制完发现程序有点问题,要调整蝙蝠的代码怎么办——你就需要把所有蝙蝠的代码全部给改一遍!是不是很痛苦!
还好,单调重复的事情应该由电脑而不是程序员去做。所以 Scratch 为我们提供了强大的“克隆”功能来应对这种场景。克隆这个词现在已经不新鲜了,就是以一个对象为“本体”复制出一个完全一模一样的“克隆体”来,它们具有一样的外观和执行逻辑——你一定对《西游记》中孙大圣拔下毫毛变成许多个一模一样的大圣这个情节记忆犹新吧?克隆就让Scratch中的角色具备了这种复制自己的能力,复制出来的角色和本体一模一样,而且受统一的指令控制!很强大吧?
Scratch 提供了三条克隆相关的指令来帮助我们进行克隆操作:
“当作为克隆体启动时” 是一个触发指令,和绿旗一样,意味着你每克隆出一个角色,就会触发后面的代码执行。它一般由下面“克隆”指令触发。“删除此克隆体”则是让克隆出来的角色把自己删除,比如克隆出来的蝙蝠如果被击中了,它就要被删除。让我们用这三条指令修改一下蝙蝠的代码。
首先,我们把蝙蝠的大小设置为30,拖动到右下角隐藏起来。然后添加下面的代码,让蝙蝠每一秒克隆一个自己。
接着,把原来的两段绿旗触发的指令改为由克隆体执行的,因为本体被我们隐藏了,复制出来的本体也是不可见的,我们还需要添加一个“外观”类的“显示”指令把这个克隆体显示出来,现在蝙蝠的代码变成了这样:
现在点击绿旗,是不是从舞台右上角不断地冒出蝙蝠飞向小猫?现在你已经知道,那些其实是“克隆体”——也就是大圣身上的毫毛,真正的本体还在舞台右下角隐藏着睡大觉呢!
第四步:为飞镖编写代码
你可能已经迫不及待想赶紧写程序让小猫具备攻击能力了。不过我们不需要为小猫编写代码,而是直接为飞镖写代码。我们需要先把飞镖隐藏起来,然后拖动下列指令:
其实飞镖代码与蝙蝠的代码很相似,它们都会先克隆自己(这里有一个新的触发方式,按键触发。当按下键盘上指定键的时候后面的代码会执行),当作为克隆体启动时显示出来,移动到小猫身前位置,面向鼠标指标(你需要用鼠标移动来为飞镖引导方向)飞出去,直到——这里你注意到有什么不一样了吗?这个条件是由“碰到舞台边缘”和“碰到Bat”两个条件组成的,它们之间是“或”的关系,只要有一个条件成立,循环就会终止,去删除自己——所以我们使用了“运算”类指令(绿色)的“或”运算把这两个条件组合到了一起,你可以体会一下这个指令的用法。
第五步:完善蝙蝠代码
启动程序,按空格键并用鼠标移动来引导飞镖方向,你会看到一支又一支飞镖飞向了蝙蝠,碰到蝙蝠或者舞台边缘就消失了——且慢,这些蝙蝠怎么没事呢?明明被击中了啊——这是因为我们还没有编写代码让蝙蝠处理被击中的事件呢。切换到蝙蝠角色,在蝙蝠重复执行内部的移动2步指令后加一个“如果…那么”指令,我们加了一个侦测条件,如果碰到飞镖,这个克隆体就被删除。
蝙蝠完整的指令如下图:
至此,你的第一个小游戏开发完成,你可以扮演卡卡,来一场痛快的“小猫大战吸血蝙蝠”了!
指令小贴示
- 在【数值】和【数值】之间取随机数:获得一个在两个数值范围之内的任意数值,这个指令往往用在需要感觉更“自然”的场合,比如游戏中敌人出现的位置,最好不是固定的,就用这个指令来生成坐标值;
- 面向【角色或鼠标】:利用这个指令可以立即调整角色面对的方向;
- 重复执行直到:它包括的代码会执行直到指定的条件成立,这实际上是重复执行指令和如果…那么指令的综合;
- 碰到【对象名称】:这个指令可以是侦测指令,如果碰到了指定的角色、舞台的边缘或者鼠标,这个指令就返回“真”,代表成立,也就可以作为如果…那么一类指令的条件。游戏中一般检测是否碰到子弹、敌人或超出舞台范围等;
- 当按下【按键】:用于用户和程序交互,按下键盘上指定的按键时,后面的代码会启动执行;
- 当作为克隆体启动时:这是和绿旗启动一类的指令,每一个克隆体产生后,会执行这个指令开头的代码;
- 克隆【对象】:在舞台上生成一个和指定的角色一模一样的对象,而且会执行“当作为克隆体启动时”指令的代码。在游戏中,屏幕上出现的敌人往往都是克隆体,便于创建和删除;
- 删除此克隆体:如果克隆体不再有效(比如被杀死的敌人),那就使用这条指令删除它。在Scratch中,同时存在的克隆体有300多个,一旦超过就不再执行克隆指令,所以用完的克隆体要及时删除而不是隐藏它。
课后思考
本节牵涉的内容牵涉随机指令、克隆指令、侦测指令、组合条件判断等,请你结合实际场景体会一下这些指令的用法。在编写游戏类程序的过程中,这些指令的运用是必不可少的。
本节我们还学习了新的触发程序执行的方式,比如当按下按键时、当作为克隆体启动时,这类指令只能作为一段代码的开始,当特定的条件满足时启动代码。这类“特定”条件,我们称之为“事件”。实际上,在编写角色代码的时候,也就是为角色编写 “事件”处理程序的过程。
你平时玩的射击类小游戏,原理和本节程序是类似的,只要学会了本节内容,开发同类小游戏就容易多了。