第一次接触Scratch编程时,我就被它简单直观的积木式编程方式吸引了。记得当时做的第一个完整项目就是飞机大战,那种看着自己亲手编写的代码让飞机动起来、子弹发射的感觉特别有成就感。今天我就带大家完整走一遍这个经典游戏的开发过程,保证即使你是零基础也能轻松上手。
飞机大战的核心玩法其实很简单:玩家控制一架飞机在屏幕下方移动,自动发射子弹攻击从上方不断下落的敌机。但要把这个看似简单的游戏实现出来,需要掌握几个关键编程概念。首先是角色控制,我们需要让飞机跟随鼠标移动;其次是克隆技术,用来生成源源不断的子弹和敌机;最后是碰撞检测,处理子弹击中敌机、敌机撞到玩家等交互逻辑。
在开始编程前,我们需要准备好游戏素材。Scratch自带的素材库可能没有我们想要的飞机造型,这时候可以点击"上传角色"按钮,从本地导入下载好的飞机图片。建议准备三种素材:玩家飞机(建议用蓝色或绿色区分)、敌机(红色比较醒目)、子弹(简单的黄色小方块即可)。图片大小最好控制在100x100像素以内,这样在游戏运行时不会显得突兀。
打开Scratch后,第一件事就是设置游戏舞台。我习惯把背景设为深色(比如深蓝色),这样能更好地突出飞机和子弹。点击"背景"选项卡,选择一个纯色背景或者星空背景都可以。然后删除默认的小猫角色,开始导入我们准备好的飞机素材。
导入角色后,建议立即给角色重命名,比如"player"、"enemy"、"bullet"。这个好习惯能让后续编程时更容易区分各个角色。接着设置角色的初始位置:玩家飞机放在舞台底部中央(坐标0,-120),敌机暂时放在舞台外(比如0,180),子弹则可以先放在玩家飞机位置。
scratch复制当绿旗被点击
player移到x:(0) y:(-120)
enemy移到x:(0) y:(180)
bullet移到x:(0) y:(-120)
bullet隐藏
游戏需要记录分数和生命值,这就需要创建变量。点击"变量"分类,新建两个变量:"score"(分数)和"lives"(生命)。在游戏开始时,我们需要初始化这些变量:
scratch复制当绿旗被点击
将[score v]设为(0)
将[lives v]设为(3)
我建议把分数显示在左上角,生命值显示在右上角,这样玩家可以一目了然地看到游戏状态。在变量旁边的复选框中勾选"显示",变量就会显示在舞台上,你可以拖动它们到合适的位置。
让飞机跟随鼠标移动是最基础的控制方式。这里我们需要使用"重复执行"积木和"移到鼠标指针"积木。但直接这样实现会有一个问题:飞机移动速度太快,显得不自然。我建议加入"平滑移动"效果,让飞机移动更流畅:
scratch复制当绿旗被点击
重复执行
在(0.1)秒内滑行到x:(鼠标x) y:(-120)
end
这里我把y坐标固定为-120,这样飞机就只能在屏幕底部水平移动,符合传统飞机大战的玩法。如果你想让飞机能在整个屏幕自由移动,可以去掉y坐标的限制。
子弹发射是游戏的核心机制之一。我们需要解决两个问题:如何持续生成子弹,以及如何管理大量子弹。Scratch的克隆功能完美解决了这个问题。下面是实现步骤:
scratch复制当绿旗被点击
bullet隐藏
重复执行
等待(0.1)秒
创建bullet的克隆体
end
当作为克隆体启动时
bullet显示
移到player
重复执行直到<touching [边缘 v]?>
将y坐标增加(10)
end
删除此克隆体
这里有个细节需要注意:克隆体的初始位置应该设为玩家飞机的当前位置,这样看起来子弹是从飞机发射出去的。我最初做这个游戏时就犯过错误,忘记设置克隆体的初始位置,结果子弹都从屏幕中央发射,看起来特别奇怪。
敌机的实现思路和子弹类似,也是通过克隆技术实现的。但有几个关键区别:
scratch复制当绿旗被点击
enemy隐藏
重复执行
等待(随机取数(0.5)到(1))秒
创建enemy的克隆体
end
当作为克隆体启动时
enemy显示
移到x:(随机取数(-200)到(200)) y:(180)
重复执行直到<touching [边缘 v]?>或<touching [bullet v]?>
将y坐标增加(-5)
end
如果<touching [bullet v]?>那么
将[score v]增加(10)
end
删除此克隆体
这里我使用了随机数让敌机出现的间隔和位置都不固定,增加了游戏的随机性和挑战性。你可以调整随机数的范围来改变游戏难度。
碰撞检测是游戏中最容易出错的部分。我们需要处理三种碰撞情况:
对于第一种情况,代码已经在上面敌机克隆体的脚本中实现了。第二种情况需要在玩家角色中添加检测:
scratch复制当绿旗被点击
重复执行
如果<touching [enemy v]?>那么
将[lives v]增加(-1)
广播[hit v]并等待
等待(1)秒 // 无敌时间
end
end
这里我加入了1秒的无敌时间,避免玩家被连续击中。你可以根据需要调整这个时间。
基础功能实现后,我们可以为游戏添加更多细节。首先是音效:当子弹击中敌机时播放爆炸音效,玩家被击中时播放受伤音效。Scratch内置了一些音效,你也可以上传自定义音效。
scratch复制当接收到[hit v]
播放声音[pop v]直到播放完毕
其次是视觉效果。可以为敌机被击中时添加爆炸动画:创建一个新的"explosion"角色,当敌机被击中时,在敌机位置显示爆炸动画然后隐藏。
为了让游戏更具挑战性,可以随着分数增加而提高难度。比如:
scratch复制当绿旗被点击
重复执行
如果<(score) > (100)>那么
将[敌机速度 v]设为(7)
end
如果<(score) > (300)>那么
将[敌机速度 v]设为(10)
end
end
然后在敌机移动的代码中使用这个变量代替固定的移动速度。
原始文章最后提出了一个有趣的挑战:改造成两人游戏。这个改造其实并不复杂,主要需要:
scratch复制当绿旗被点击
重复执行
如果<键[W v]被按下?>那么
将y坐标增加(5)
end
如果<键[S v]被按下?>那么
将y坐标增加(-5)
end
// 类似处理A和D键控制左右移动
end
多人游戏的关键是要确保两个玩家的控制不会互相干扰,并且游戏难度要适当提高以保持挑战性。