友情提示:380元/半年,儿童学编程,就上码丁实验室。
第一讲 小鱼的战斗(一)
本课程为Scratch的进阶课程,最终实现一个有故事情节的游戏,游戏展示请看视频。
一、游戏剧本介绍
游戏描述的是一个小鱼的成长故事。
第一幕是大鱼吃小鱼游戏,作为主角的小鱼通过不断吃掉海洋中的其他小鱼来长大,最终战胜鲨鱼进入下一关。
初始时,小鱼的生命值为10,分数为0。
任何情况下,小鱼的生命值降为0则游戏结束。
我们假设第一幕中存在两种小鱼,每种小鱼都是随着时间的推移而不断增加,主角开始只能吃掉小鱼1,每吃掉一个小鱼1,可以获得1分。
当分数达到10分时,主角身体长大一点,可以开始吃小鱼2。在分数达到10之前,小鱼如果碰到小鱼2,则生命值减少1。当分数达到10,每吃掉一个小鱼2,分数增加2分。
第二幕为射击游戏,长大的小鱼将与章鱼怪进行作战。
二、导入游戏素材
新建程序,如图所示,导入背景“underwater2”,在角色列表中,删除小猫角色,导入“fish1”、“fish2”、“fish3”。调整三个小鱼的大小,fish1大小为20,fish2大小为25,fish3大小为30。
将fish2命名为主角,将fish1命名为小鱼1,fish3命名为小鱼2,将三个角色的旋转模式全部选择为左右旋转。
命名后的角色列表如下
选中主角,为主角创建2个变量,分别为生命和分数,并在脚本区初始化这两个变量,当开始时,让生命值为10,分数为0。
三、让三条小鱼都动起来
1、让主角移动起来
让主角移动起来,我们这里首先采取键盘控制的方式。
在主角的脚本区,编辑左右键按下的代码如图所示。
注意这里在移动前首先改变主角的朝向。
那么上下键如何操作呢?是否应该是如下这样的代码呢?
大家可以先尝试一下这个代码控制的上键操作情况,有没有发现什么问题?
我们发现,当小鱼面向右面的时候,响应是正常的,但是当小鱼面向左面的时候,按向上按钮,小鱼是先转到面向右面再向上移动。这与小鱼的旋转模式是左右旋转有关,当面向0度方向是,在左右旋转模式下,小鱼是面向右面的。因此我们需要对代码做简单的改变来解决这个问题。
我们知道,按上下键时,小鱼的横坐标不变,而纵坐标分别增加减少,因此这里可以采用如下代码。
再次试试四个方向键,已经可以达到预期的动作了。
2、让小鱼1和小鱼2动起来
这里重点学习一组新的指令。
在入门阶段的课程中我们简单讲解过,这组克隆指令是复制一个当前角色的副本,副本继承了角色的全部信息和指令,可以作为一个个体单独存在和运行。
那么为什么要使用副本而不是直接定义多个角色呢?
我们希望小鱼1和小鱼2随着时间的推移,不断的在屏幕中出现,但是因为不知道游戏要持续多久,也不知道究竟需要生成多少个小鱼角色,因此这给定义多个角色带来了困难。其次,小鱼角色的行为类似,因此可以考虑克隆这组指令来完成小鱼的控制。
在角色指令中,每当执行一次“克隆”指令,则屏幕中生成一个与角色完全相同的角色副本,副本继承角色的全部指令动作。
克隆体生成后,需要为克隆体编写相应的指令,为克隆体编写的指令起点为“当作为克隆体启动时”这条指令,终点是“删除本克隆体”。
请注意,对于创建的克隆体。当不在使用时,最后一定要执行“删除本克隆体”指令,因为每一个克隆体都需要占用一部分计算机资源,如果不能在最后执行回收资源的操作删除掉克隆体,计算机会因为被占用的资源过多而死机,这点必须注意!
回到小鱼1和小鱼2,我们希望两种小鱼只是简单的在屏幕中来回游动。首先看小鱼1,编写如下代码
这段代码的目的是每隔2-5秒,在屏幕中的随机区域,克隆一个小鱼1的副本,这里我们使用了显示克隆体,隐藏本体的技巧,这样做的目的是为了保证,在游戏过程中被主角吃掉的都是克隆体的小鱼,因为本体小鱼始终处于隐身状态,可以用来持续操作产生新的小鱼。大家现在可以点击开始运行一下,会发现每个一段时间,屏幕中出现一条小鱼,小鱼出现的位置是随机的。
继续编辑下列代码
当小鱼克隆体启动时,让小鱼重复移动,这里我们让小鱼的移动方式相对简单一些,只重复的绕圈,移动的步数和右转角度上使用了随机数,让小鱼移动的规律略微有点变化。
下面我们增加小鱼1被吃掉的代码:
我们在小鱼1的克隆体启动后,使用一个循环持续的侦测小鱼1是否碰到主角,如果碰到则删除克隆体表示小鱼1被吃,在删除克隆体前,让分数加1。
同样的方式我们也可以定义编写小鱼2的代码如下:
与小鱼1相比,小鱼2出现的间隔时间,和旋转的角度略有不同。
小鱼2与小鱼1代码的最大差别在最后这段,当碰到主角时,小鱼1直接被吃掉,而小鱼2需要做个判断,当分数没有达到10分时,主角假设打不过小鱼2,生命值被减1,而当分数达到10分时,主角吃掉小鱼2分数加2。
现在点击开始,运行一下程序,看看有没有什么问题?
我们发现主角可以很成功的吃掉小鱼1,但是当主角分数不够10分时,一旦碰到小鱼2,生命值会瞬间下降非常多,可能一下就出现了负数,这是为什么呢?
查看我们代码的最后一段,这段的逻辑是,一旦主角碰到小鱼2的克隆体,如果分数不足10分,则生命值将会下降,但是此时小鱼2并没有被吃掉,还是存在的,因此他会持续的碰到主角,分数也就会持续的下降。
我们希望在这种情况下,没当分数较少1分时,可以给主角一个逃离的时间,因此最后一段代码修改如下
现在试着再次运行,效果已经好一些了。
下面我们回到主角的脚本区,编写如下代码
这部分代码的主要目的,在开始和中途分数到10的时候各说一句话,提醒游戏者哪种鱼可以吃,同时在分数到10的时候,让小鱼的身体变大一点。第一幕的场景已经可以简单的玩起来了。
下一讲我们将继续编写游戏的第一幕,让大鱼吃小鱼的游戏效果更加丰富。
始发于微信公众号:
一人耕者