案例名称:空中格斗(飞机大战)
一、案例介绍
小朋友们在书上或者电视或者电影里面经常可以看到,为了维护国家和地区安全,为了抵挡外来入侵等等。战斗机与战斗机互相在空中格斗的这么一个场景。我们今天就是来模拟一个空中格斗的游戏。在本案例汇总,敌机会源源不断的从上方飞来,不同的敌机坚硬程度不一样,我们通过鼠标来控制我们战斗机的移动,瞄准敌机将其击毁,每击毁一架敌机,就可以获得相应的积分,越是坚硬的敌机得分就越高。千万不要让敌机撞到我们的战斗机,否则我们的战斗机就会被撞毁,游戏结束。
二、案例演示
我们先通过一段视频来看一下我们最终实现的一个游戏效果
【Scratch案例演示】Scratch空中格斗 Scratch星际大战
三、案例分析
3.1、角色分析
- 我方战斗机:通过鼠标控制移动(只能左右移动),不断发射子弹
- 敌机1:移动速度3,血量1,产生时间2秒,1发子弹就可击毁,击毁后得分加1分
- 敌机2:移动速度2.5,血量2,产生时间3秒,2发子弹就可击毁,击毁后得分加2分
- 敌机3:移动速度1.8,血量3,产生时间4秒,3发子弹就可击毁,击毁后得分加3分
- 敌机4:移动速度1,血量4,产生时间5秒,4发子弹就可击毁,击毁后得分加4分
- 子弹:我方战斗机的弹药,通过发射子弹消灭入侵的敌机,子弹数量源源不断
- 炸弹:这个是我们的超级武器,只要发射,屏幕上所有的敌机全部销毁,但这个炸弹是每间隔一段时间才会在舞台上出现,我方战斗机碰到之后才能拥有。
- 游戏结束:当我方战斗机被撞毁之后,游戏结束。
3.2、背景分析
- 背景:天空
四、角色和背景设置
4.1、角色设置
1、删除默认的小猫角色,然后从电脑上导入我们的战斗机角色,如下图所示:
2、采用同样的方式,将敌机角色、子弹和炸弹以及游戏结束角色依次导入进来,完成如下图所示:
4.2、背景设置
1、从电脑上导入我们蓝天背景,并删除默认的空白背景,如下图所示:
2、最后调整好每个角色的大小和位置,完成如下图所示:(除了我方战斗机,其它角色开是都是隐藏的)
五、流程分析
5.1、我方战斗机
我放战斗机将会有2条积木指令并行执行,具体分析如下:
1、程序启动的时候跟随鼠标来回移动,移动过程中是否碰到敌机;
2、当接收到游戏结束的时候,停止游戏
当接收到游戏结束→停止该角色的其它脚本→说我还会再来的
PS:【】代表循环结构,重复执行
<>代表条件判断结构,是否满足条件(下同)
5.2、敌机1
每种敌机将会有4条积木指令并行执行,具体分析如下:
1 程序启动的时候初始化,并实现自我克隆(不断产生新的敌机)
程序启动→隐藏→初始方向→初始大小→重复克隆自己【克隆自己→时间间隔】
2 作为克隆体启动的时候,实现从上往下飞,飞行途中碰到子弹会消失,碰到最底部边缘也会消失
3 当收到发射炸弹时,会消失
当收到发射炸弹→将得分增加1→删除克隆体
4 当收到游戏结束时,停止游戏
当接收到游戏结束→停止该角色的其它脚本
5.3、敌机2
敌机2同样有4条积木指令并行执行,具体分析如下:
1 程序启动的时候初始化,并实现自我克隆(不断产生新的敌机);跟敌机1不同的是,在初始化之后克隆之前会有一个等待时间,也就是出来的时间等待,比敌机1晚一点。
程序启动→隐藏→初始方向→初始大小→等待时间→重复克隆自己【克隆自己→时间间隔】
2 作为克隆体启动的时候,实现从上往下飞,飞行途中碰到子弹会消失,碰到最底部边缘也会消失
3 当收到发射炸弹时,会消失
当收到发射炸弹→将得分增加1→删除克隆体
4 当收到游戏结束时,停止游戏
当接收到游戏结束→停止该角色的其它脚本
5.4、其它敌机
其它敌机的程序流程可以参考敌机2 的流程,出来的时间比敌机2晚点,血量、移动速度、得分请参考前面的角色分析。
5.5、子弹
子弹将会有两条积木指令并行执行,具体分析如下:
1 程序启动时候,实现自我克隆(不断发射子弹)
程序启动→隐藏→初始方向→初始大小→重复克隆自己【克隆自己→时间间隔】
2 当作为克隆体启动时,实现子弹的发射
5.6、炸弹
炸弹我们这边设置了5条积木指令并行执行,具体分析如下:
1 自定义积木,由于多处用到炸弹的初始位置和出现时间间隔,所以设置成自定积木,简化积木的冗余
定义初始炸弹→隐藏→时间间隔(炸弹多久出现一次)→初始位置→显示
2 程序启动时,炸弹初始化以及下落的过程
3 程序启动时,实现我们炸弹一闪一闪若隐若现的效果
程序启动时→不断若隐若现【将虚像特效设为0→时间间隔→虚像特效设为100→时间间隔】
4 当按下空格键,发射炸弹
5 当接收到游戏结束,停止角色的脚本
当接收到游戏结束→停止改角色的其它脚本
5.7、游戏结束
游戏结束设置了2条积木指令并行执行,具体分析如下:
1 程序启动时,隐藏(开始的时候不显示)
程序启动→隐藏
2 接收到游戏结束时,显示
当接收到游戏结束→移到舞台中央→显示
5.8、背景
背景同样设置了2条积木指令并行执行,具体分析如下:
1 程序启动时,重复播放背景音乐
程序启动→【播放背景音乐】
2 接收到游戏结束时,停止其他脚本
当接收到游戏结束→停止该角色的其它积木指令
六、用到指令
6.1、运动模块
- :角色移动指定的步数,正数就是向前,负数就是向后
- :将角色移动到舞台中央指定的X/Y坐标位置,默认坐标(x:0,y:0)
- :将角色朝向指定的角度
- :将角色的Y坐标也就是纵向增加指定的值,正数朝上,负数朝下
- :角色碰到边缘后就会以垂直边缘为中线的对称角度进行反弹
- :旋转方式有三种模式,分别是:左右翻转(正常向左向右)、不可旋转(不能旋转)、任意旋转(朝任何角度旋转也是默认旋转方式)
- :获取当前角色X的坐标值
- :获取当前角色Y的坐标值
6.2 外观模块
- :说一句话,并在舞台上显示一定的时间
- :将角色的大小设定为指定的值,这里面的大小指的是百分比
- :这是设置角色的特效值,特效分别有颜色、鱼眼、旋涡、像素化、马赛克、亮度和虚像。我们这个案例中要用到的是虚像。
- :将角色显示在舞台上
- :将角色不显示在舞台上
6.3 声音模块
- :播放某个声音并等声音播放完成在执行后面的积木指令
6.4 事件模块
- :程序启动之后,点击小绿旗,执行后续的程序脚本
- :获取到键盘上指定的按键被按下的消息,默认的是空格键,下拉三角可选择字母a-z的26个键、数字0-9的10个键、上下左右方向键以及任意按键。
- :当接收到某个消息的时候,执行后续的积木指令
- :向所有的角色发送一个消息,同时执行后面的积木指令
6.5 控制模块
- :时间间隔,等待指定的时间后执行后面的指令
- :一直重复执行积木框里面的积木
- :条件判断,如果条件为真,那么执行积木框里面的积木,在执行后面的积木;条件为假,框里面的积木不执行,执行后面的积木
- :停止脚本执行,下拉可选项有停止全部脚本、这个脚本和该角色的其他脚本
6.6 侦测模块
- :是否碰到鼠标指针,下拉可选项还有舞台边缘和其它角色
- :获取鼠标的X坐标值
- :获取鼠标的Y坐标值
- :获取舞台的背景编号、背景名称、音量、变量名称;或者是角色的X坐标、Y坐标、方向、造型编号、造型名称、大小、音量和变量名称
6.7 运算模块
- :加法运算,两个参赛相加;参赛可以是具体的数值,也可以是其它变量或者系统变量,或者其它参数表达式
- :在某个区间中随机产生数值,可以是整数也可以是小数
- :逻辑判断模块,判断前面的值是否大于后面的值,大于返回逻辑值真,否则返回假
- :逻辑判断模块,判断前面的值是否等于后面的值,等于返回逻辑值真,否则返回假
6.8 变量模块
- :新建变量,弹出框中输入变量名称,可以选择适用所有角色和仅适用当前角色
- :将指定的变量设为指定的值
- :将制定的变量增加制定的值
- :获取变量的值,前面方框有打钩就会在舞台上显示,没有选中就不会显示在舞台上
6.9 自制积木模块
- :定义一个新的积木,弹出框中输入积木名称,还可以设置自定的积木是否需要带有输入项
- :自己定义的某个积木
七、程序指令编写
7.1、战斗机
- 点击小绿旗,程序启动执行后面的积木指令
- 战斗机的初始大小
- 设定战斗机的初始朝向
- 将旋转方式设置为左右翻转
- 初始化得分变量(得分是一个全局变量,所有角色都可用)
- 战斗机一直左右移动,重复执行第7-10个积木指令
- 将战斗机跟随鼠标移动,由于只能左右移动,所以只要设置X坐标跟随鼠标的X坐标即可
- 设置战斗机碰到边缘后反弹
- 判断战斗机是否碰到敌机,由于敌机有多种型号,所以需要通过逻辑或运算将每种敌机都列出来,如果碰到了则执行第10个积木指令
- 向所有角色广播一个游戏结束的消息。
- 当接收到游戏结束的消息,执行后续积木指令
- 停止改角色的其它脚本
- 说:我还会在回来的一句话,并显示3秒钟
- 停止案例的所有脚本
7.2、敌机1
- 程序启动后,执行后面的积木指令
- 将敌机本体隐藏
- 初始朝向
- 初始大小
- 不断克隆自己,产生新的敌机1(重复执行第6-7个积木指令)
- 克隆自己
- 时间间隔2秒钟后在克隆
- 当接收到游戏结束时,执行后面的积木指令
- 停止该角色的其它脚本
- 当接收到发射炸弹时,执行后面的积木指令
- 将得分变量增加1
- 删除当前克隆体
- 当作为克隆体启动时,执行后面的积木指令
- 初始化敌机的位置,在舞台的上方Y=150,横坐标采用随机数的方式
- 将敌机显示在舞台上
- 将敌机1的血量设为1
- 敌机朝战斗机飞来,重复执行第18-25个积木指令
- 敌机1飞行的速度,每次向下飞行3像素
- 判断飞行途中是否碰到舞台边缘,如果是执行第20个积木指令
- 删除当前克隆体
- 判断飞行途中是否碰到子弹,如果是执行第22个积木指令
- 将敌机的血量减少1
- 判断敌机的血量是否等于1,如果是执行第24-25个积木指令
- 将得分变量增加1
- 删除当前克隆体
7.3、其它敌机
- 其它敌机和敌机1的程序差不多,不同的地方在于上图标注的1-6
- 1是敌机1不存在的,后面的敌机都有一个出场的时间,敌机越厉害的会越晚出场,时间间隔相差一点
- 2是敌机每次出现的频率,同样越厉害的频率就会越小
- 3是击毁敌机得到的分数,越厉害的敌机击毁后得分越多
- 4是敌机的血量,越厉害的敌机血量越多
- 5是敌机飞行的速度,血量越多的敌机飞行的越慢
- 6和3是一样的
7.4、子弹
- 程序启动后,执行后面的积木指令
- 将子弹本体隐藏
- 初始朝向
- 初始大小
- 不断克隆自己,产生新的敌机1(重复执行第6-7个积木指令)
- 克隆自己
- 每间隔0.3秒钟就克隆一次
- 当作为克隆体启动时,执行后面的积木指令
- 由于子弹石油我们战斗机发射出去的,所以我们将子弹的X坐标设定为战斗机的X坐标,子弹的Y坐标设定为战斗机的Y坐标加上一个数值33,这样子弹出现的位置就在战斗机机头的位置,这样比较符合我们的案例
- 将子弹显示在舞台上
- 子弹向敌机飞去,重复执行第12-17个积木指令
- 子弹飞行的速度,每次向上飞行3像素
- 判断子弹飞行途中是否击中敌机,如果是执行第14-15个积木指令;由于敌机有多种型号,所以每个型号的敌机都通过逻辑或将他们列出来
- 非常短暂的间隔(删除之前,没有这个间隔,有可能在敌机的程序模块里面碰到子弹要扣血量时候有可能没有扣,因为如果角色删除了,与删除的角色有关的指令是不会执行的)
- 删除当前克隆体
- 判断子弹是否碰到舞台边缘,如果是执行第17个积木指令
- 删除当前克隆体
7.5、炸弹
- 程序启动后,执行后面的积木指令
- 炸弹掉落的同时若隐若现一闪一闪的效果实现,重复执行第3-6个积木指令
- 将虚像特效设为0
- 时间间隔0.1秒
- 将虚像特效设为100
- 时间间隔0.1秒
- 当按下空格键的时候,执行后续的积木指令
- 如果炸弹的数量大于0,执行第9-10个积木指令
- 将炸弹数量减少1
- 向所有的角色发送广播消息“发射炸弹”
- 自定义积木模块“初始炸弹”
- 将炸弹隐藏
- 炸弹出现的频率,每隔15秒出现一次
- 炸弹出现的初始位置,在舞台上方Y=160,横坐标随机
- 将炸弹显示在舞台上
- 程序启动后,执行后面的积木指令
- 初始炸弹(引用自定义积木,设置炸弹的初始信息)
- 炸弹的初始大小(当然我们也可以把这个初始大小写到自定义积木初始炸弹里面,只是我们炸弹的初始大小不需要每次都进行设置,后面还会多次用到初始炸弹这个自定义积木)
- 设置炸弹的初始数量0
- 炸弹从舞台上方往下落,重复执行第21-28个积木指令
- 炸弹下落的速度2像素
- 判断炸弹下落途中是否碰到舞台边缘,如果是执行第23个积木指令
- 初始炸弹(引用自定义积木,设置炸弹的初始信息)
- 判断炸弹下落途中是否碰到子弹,如果是执行第25-26个积木指令
- 将炸弹数量加1
- 初始炸弹(引用自定义积木,设置炸弹的初始信息)
- 当接收到游戏结束时候,执行后续的积木指令
- 停止当前角色的其它积木指令
7.6、游戏结束
- 程序启动后,执行后面的积木指令
- 将Game Over隐藏起来
- 当接收到游戏结束时,执行后续积木指令
- 将Game Over移到舞台中央
- 将Game Over显示在舞台上
7.7、背景
- 程序启动后,执行后面的积木指令
- 重复播放背景音乐,重复执行第3个积木指令
- 播放背景音乐,并等待音乐播完在执行后续积木指令
- 当接收到游戏结束时,执行后续积木指令
- 停止该角色的其它积木指令
八、知识点回顾
- 掌握坐标轴和坐标值的概念及使用
- 掌握条件判断语句的使用
- 掌握消息发送和消息处理机制
- 熟练掌握变量的定义和使用
- 学会使用自定义积木,实现减少代码冗余
- 熟练掌握碰撞检测机制,理解多角色之间是如何进行碰撞的
- 充分理解并掌握运算模块中随机数、逻辑判断及逻辑或的使用
- 学会将复杂的程序流程简单化,学会分析问题和解决问题
九、拓展思维
- 优化我们的游戏案例
- 添加子弹击中敌机音效
- 添加战斗机被撞毁的音效和视觉效果
- 添加炸弹爆炸的音效和视觉效果
- 添加游戏结束时的音效
- 思考如何实现敌机发射子弹
- 思考如何实现敌机左右随机移动
- 添加更厉害的敌机
- 达到一定分数得时候添加敌机BOSS,让游戏更加丰富
- 添加不同的子弹效果,实现更丰富的游戏体验