用Scratch与Makey Makey制作体感Flappy Bird:编程与硬件的创意融合
1. 项目概述:当经典游戏遇上“水果控制器”
几年前,一款名为《Flappy Bird》的像素风小游戏风靡全球,其简单的玩法(点击屏幕让小鸟飞过管道)与极高的难度形成了奇妙的化学反应。今天,我们不只满足于在屏幕上戳戳点点,而是要把它变成一个能摸得着的创意项目:用Scratch图形化编程重现这款游戏,并借助一块神奇的电路板——Makey Makey,让你能用一根香蕉、一个苹果,甚至一块橡皮泥来操控小鸟的飞行。
这个项目完美融合了软件逻辑与硬件交互,它不仅仅是一个游戏复刻,更是一堂生动的STEAM(科学、技术、工程、艺术、数学)实践课。对于编程初学者,尤其是青少年和教育工作者而言,通过亲手搭建从代码到实物的完整链路,能直观理解“事件驱动”、“循环控制”、“碰撞检测”等核心编程概念,同时领略到物理电路与数字世界连接的魔法。你会发现,编程的乐趣不止于屏幕之内,更在于能用代码让身边寻常的物体“活”过来。
2. 核心工具与原理深度解析
2.1 Scratch:不只是积木的编程哲学
Scratch由MIT媒体实验室开发,其设计哲学是“低门槛,高上限”。它通过将复杂的编程语法(如条件判断、循环、变量)封装成色彩各异的积木块,用户像搭积木一样将它们拼接起来,形成可执行的程序脚本。
核心原理拆解:
- 事件驱动模型:这是Scratch(也是现代图形界面编程)的基石。程序并非从头到尾线性执行,而是等待“事件”发生,再触发相应的代码块。例如,“当绿旗被点击”是一个启动事件,“当按下空格键”是一个交互事件。在我们的游戏中,小鸟的跳跃、管道的移动,都是由特定事件触发的。
- 广播与接收机制:这是Scratch中实现不同角色(Sprite)间通信的精妙设计。一个角色可以“广播”一条消息(如“游戏结束”),其他角色可以“当接收到”这条消息时,执行相应的动作(如停止移动、显示“Game Over”)。这模拟了软件工程中的消息队列或事件监听模式,是解耦代码逻辑的关键。
- 坐标系与运动:Scratch舞台是一个480x360像素的坐标系,中心点为(0,0)。所有角色的移动、定位都基于此。理解“X坐标增加”、“Y坐标增加”以及“面向方向”等积木,是控制游戏元素运动的基础。
注意:许多初学者会混淆“移动10步”和“将X坐标增加10”。“移动10步”是沿着角色当前面向的方向前进,而“改变X坐标”是直接在水平轴上位移。在Flappy Bird这种垂直方向游戏中,通常直接操作Y坐标更为精准。
2.2 Makey Makey:打通物理与数字的“任意门”
Makey Makey本质上是一个高度简化的USB输入设备模拟器。你可以把它理解为一个超级创意的“键盘”或“鼠标”。
工作原理深度剖析:
- 电路闭合即按键:电脑将Makey Makey识别为一个标准键盘。Makey Makey板载了多个输入触点,分别映射到键盘的特定按键(如空格键、方向键、鼠标点击)。其核心原理是检测电路的闭合。当你用导线连接“地线”(Earth)和某个“按键触点”(如Space)时,就形成了一个完整的电路。Makey Makey检测到这个微小电流(人体本身就是一个导体,可以构成回路),便会向电脑发送一个对应的按键按下信号。
- 为什么需要“地线”:你必须同时接触“地线”和“信号线”,电流才能从信号线出发,经过你的身体,流回地线,形成回路。只接触信号线是无法触发的,因为电路是开路的。这就是为什么教程中强调“一定要同时握住地线”。
- 导电材料的选择:几乎任何能导电的物体都可以作为“按键”:水果(富含水分和电解质)、蔬菜、铅笔芯(石墨导电)、铝箔、甚至是一滩水。绝缘体则不行,比如塑料、干燥的木块。
实操心得:Makey Makey对导电性的要求并不苛刻,但接触面积和湿度会影响稳定性。如果发现用香蕉控制时反应不灵敏,可以尝试将鳄鱼夹夹在香蕉皮破损处(果肉更湿润),或者用舌头舔一下手指增加导电性(虽然听起来不雅,但实测有效)。对于更稳定的需求,可以在物体表面贴一小块导电铜箔胶带,再将夹子夹在胶带上。
3. Flappy Bird游戏逻辑设计与Scratch实现
3.1 游戏核心机制拆解
在动手编码前,我们必须将Flappy Bird的游戏体验抽象成可执行的逻辑模块:
- 角色控制:玩家触发“跳跃”指令,小鸟获得一个向上的速度,随后在重力作用下下落。
- 障碍物生成与移动:管道从屏幕右侧以恒定速度向左移动,当移出左边界后,重置到右侧随机高度位置,实现循环。
- 碰撞检测:持续检测小鸟是否触碰到了管道(障碍)或地面(失败)/天空(通常不设限)。一旦碰撞,游戏结束。
- 分数计算:每当小鸟成功穿过一对管道(即其X坐标经过管道中间点),分数增加1分。
- 游戏状态管理:管理游戏的开始、进行中、结束三种状态,控制各角色行为的启停。
3.2 角色创建与初始化设置
进入Scratch,首先进行视觉元素的准备。
1. 舞台背景:
- 操作:点击“选择一个背景”,从背景库中挑选一个简单的蓝色渐变背景,模拟天空。也可以自己绘制。背景颜色不宜太花哨,以免干扰角色辨识。
2. 小鸟角色:
- 设计:删除默认的小猫角色。点击“选择一个角色”,在角色库的“动物”分类中,可以找到一个简单的小鸟造型,或者自己用绘图工具画一个椭圆形的小鸟。体积不宜过大。
- 初始状态:在代码区,为小鸟添加初始化脚本:
当绿旗被点击 显示 大小设为 (50) % // 根据你的小鸟造型调整合适大小 移到 x: (-180) y: (0) // 初始位置固定在舞台左侧中部 - 关键变量创建:点击“变量”分类,创建两个适用于“所有角色”的变量:
重力:用于模拟小鸟下落的重力加速度。游戏进行中:这是一个“开关”,用于全局控制游戏状态。我们将其初始值设为1(表示进行中),游戏结束时设为0。
3. 管道角色:
- 设计:管道需要上下两根。一个高效的方法是只画一根向下的管道,然后通过编程复制一份并翻转,形成一对。在造型编辑器中,画一个绿色长方形作为管道主体,顶部加一个稍宽的绿色长方形作为管口。
- 技巧:将管道的造型中心点(那个十字准星)拖到它的顶部中央。这样,当我们用代码设置其Y坐标时,定位的是管道的顶部,便于计算上下管道之间的空隙位置。
4. 游戏结束提示角色:
- 设计:可以创建一个简单的文字角色,内容为“Game Over!”。或者从角色库找一个有趣的失败提示图。
- 初始状态:它的初始化脚本应该是
当绿旗被点击 -> 隐藏,只有在游戏结束时才显示。
3.3 小鸟飞行与重力模拟编码
这是游戏的核心物理引擎。我们通过变量来模拟一个简单的速度-位移模型。
完整小鸟控制脚本:
当绿旗被点击 将 [游戏进行中] 设为 [1] 将 [重力] 设为 [0] // 初始速度为零 显示 移到 x: (-180) y: (0) // 初始位置 重复执行 如果 <(游戏进行中) = [1]> 那么 将 [重力] 增加 [-0.5] // 每循环一次,重力值减小(即下落加速度) 将 y 坐标增加 (重力) // 应用速度改变位置 如果 <碰到颜色 [#000000] ?> 那么 // 检测是否碰到管道(黑色)或地面 广播 [游戏结束] // 发送结束消息 结束 end end 当 [空格] 键被按下 // 这是为键盘测试准备的 如果 <(游戏进行中) = [1]> 那么 将 [重力] 设为 [8] // 赋予一个向上的初速度,实现跳跃 结束 当接收到 [游戏结束] 将 [游戏进行中] 设为 [0] 隐藏原理解读与参数调优:
- 重力变量:这里
重力变量实际扮演了“垂直速度”的角色。每次循环增加-0.5,意味着速度不断减小(向下加速)。当你按下跳跃键,速度被设为一个正数(如8),小鸟就会向上运动。这个数值需要反复测试调整,以找到最舒适的手感。-0.5和8是经典参数,感觉太“飘”就减小跳跃力度,感觉太“沉”就增加力度或减小重力加速度。 - 碰撞检测:
碰到颜色是Scratch中常用的碰撞检测方法。你需要确保管道的颜色是纯色(比如绿色),并且在检测条件中精确选取管道颜色。更严谨的做法是给管道角色一个统一的造型,并用碰到[管道]?来检测,但用颜色检测对于此游戏足够简单有效。
3.4 管道障碍的自动生成与移动逻辑
管道需要成对出现,并不断从右向左移动。
完整管道控制脚本:
当绿旗被点击 隐藏 // 先隐藏本体 将 [游戏进行中] 设为 [1] 将 [score v] 设为 [0] // 创建并初始化分数变量,记得勾选“适用于所有角色”并显示 重复执行 如果 <(游戏进行中) = [1]> 那么 显示 移到 x: (240) y: (0) // 先移到舞台右侧边缘外 将 y 坐标设为 (在 (-100) 到 (100) 间随机选一个数) // 随机决定管道中心位置 创建管道副本 [ ] // 这是一个自定义积木,用于生成上方的管道 重复执行直到 <(x 坐标) < (-240)> // 当管道移出左边界时停止这个副本 将 x 坐标增加 (-5) // 向左移动的速度 如果 <<(x 坐标) = (-180)> 与 <(游戏进行中) = [1]>> 那么 // 小鸟的x坐标大约是-180 将 [score v] 增加 (1) 结束 end 删除此克隆体 end end 当接收到 [游戏结束] 隐藏 定义 创建管道副本 创建 [ ] 的克隆体 [自己 v] // 克隆自己,生成上方的管道 当作为克隆体启动时 移到 x: (x 坐标) y: (y 坐标 + 120) // 在原管道上方120像素处生成克隆体(即空隙位置) 面向 (0) 方向 将 [旋转方式 v] 设为 [左右翻转] 重复执行 将 x 坐标增加 (-5) // 与主体同步移动 end逻辑深度解析:
- 克隆技术:这是实现无限相同障碍物的关键。主体管道只负责生成随机位置和移动逻辑,并通过“克隆自己”来创建上方管道。克隆体继承主体生成时的所有属性(位置、造型等),然后我们将其上移并翻转,形成一对。
- 分数判定:判断
x坐标 = -180是一个简化的方法,即当管道中心移动到小鸟初始X坐标位置时,认为小鸟穿过。更精确的做法是记录管道对的唯一ID,当小鸟的X坐标大于管道对的X坐标且之前未计分时计分,但这需要更复杂的变量管理。当前简化版在游戏节奏稳定时是可行的。 - 空隙大小:
y坐标 + 120中的120决定了上下管道之间的空隙高度。这个值直接影响游戏难度。可以创建一个“难度”变量来动态调整它。
3.5 游戏结束与重启逻辑
游戏结束的触发由小鸟角色通过碰撞检测发起,通过“广播”消息通知所有角色。
游戏结束角色脚本:
当绿旗被点击 隐藏 移到最前面 // 确保显示在最上层 当接收到 [游戏结束] 显示 说 [游戏结束!最终得分:] (score) 持续 (5) 秒 停止 [全部 v] // 停止所有角色的脚本,游戏彻底停止关于“停止全部”的思考:使用停止全部是最干脆的结束方式。但如果你希望实现“按空格键重新开始”的功能,就不能用这个积木,因为它会停止所有脚本,包括等待重新开始的监听脚本。替代方案是:在接收到“游戏结束”时,所有角色都通过游戏进行中=0来停止自己的运动循环,同时游戏结束角色显示。然后单独写一个监听脚本:当绿旗被点击 或 当按下空格键 -> 广播[重新开始],并在所有角色中编写当接收到[重新开始]的初始化逻辑。这体现了更清晰的游戏状态机管理。
4. 连接Makey Makey:从香蕉到键盘信号
4.1 硬件连接步骤详解
确保你的电脑已经安装了Scratch离线编辑器或能正常访问在线版,并且有一个可用的USB端口。
- 连接Makey Makey到电脑:使用USB线将Makey Makey的微型USB口连接到电脑。此时,板子上的LED灯应该会亮起。
- 连接“地线”:取一根鳄鱼夹导线,一端夹在Makey Makey板子上标有“Earth”的金属孔(通常有多个,任选一个)。另一端……夹住你自己!是的,你需要用手捏住、或用金属夹子夹在戴有金属表带的手表上、或者赤脚踩在一块铝箔上。总之,让“地线”与你的身体形成物理连接。这是整个电路回路的关键一步。
- 连接“跳跃键”:再取一根导线,一端夹在标有“Space”或“点击”的金属孔上。另一端,夹住你的香蕉(或其他导电物体)。
- 形成回路:现在,用一只手捏住(或身体其他部位接触)地线,另一只手去触摸香蕉。当你触摸香蕉的瞬间,你就用身体连接了“Space”和“Earth”,Makey Makey会向电脑发送一个“空格键按下”的信号。
4.2 Scratch中的键位映射与调试
默认情况下,Scratch监听的是键盘的“空格键”。我们的Makey Makey正好模拟了空格键,所以无需在Scratch中做任何额外设置。
调试与故障排查:
- 问题:触摸香蕉,小鸟没反应。
- 排查步骤:
- 检查回路:确保你同时接触了地线和香蕉。可以尝试用左手捏住地线夹子,右手触摸香蕉。
- 检查导电性:香蕉是否太干?尝试用湿布擦拭香蕉表面,或者换一个更成熟、表皮有黑点的香蕉(导电性更好)。也可以换用苹果、橙子或一块湿海绵测试。
- 检查Scratch项目:在Scratch中,点击舞台上方的“编辑”菜单,选择“启用加速计和Makey Makey支持”(在线版可能需要先连接硬件)。有时需要刷新一下页面。
- 测试Makey Makey:打开电脑自带的记事本或任何文本编辑器,触摸香蕉,看是否会输入空格。如果记事本里出现了空格,说明Makey Makey工作正常,问题出在Scratch项目里的事件监听上。
- 检查代码:确认小鸟的脚本里是
当按下空格键,而不是当按下上移键或其他。
高级玩法:双人控制: Makey Makey上还有方向键(上、下、左、右)和鼠标点击(点击)等触点。你可以创建第二个小鸟角色,将其跳跃事件设置为当按下上移键,然后用另一根导线连接“上箭头”触点到第二个水果(比如一个苹果),让两个玩家可以分别用香蕉和苹果进行双人比赛。
5. 项目优化、扩展与教学应用
5.1 游戏性优化与功能扩展
基础版本完成后,可以引导学习者进行迭代升级,这是培养工程思维的关键。
1. 难度动态调整:
- 思路:随着分数增加,让管道移动速度加快,或者管道之间的空隙变小。
- 实现:创建变量
管道速度和空隙高度。在管道移动的代码中,将将x坐标增加(-5)改为将x坐标增加(管道速度),而管道速度的初始值为-5。在计分后,可以增加一段脚本:如果< (score mod 5) = 0 >那么,将管道速度增加(-0.5)。这样每得5分,速度就加快一点。空隙高度同理。
2. 增加音效和动画:
- 跳跃音效:在声音库中找一个简短的“扑翼”或“跳跃”音效。在小鸟的
当按下空格键积木下,添加播放声音。 - 碰撞动画:小鸟碰到管道后,可以让他快速旋转几圈再隐藏,增加戏剧效果。使用
重复执行10次 -> 右转15度。
3. 添加开始界面和最高分记录:
- 开始界面:创建一个新的“开始按钮”角色,点击它才广播
游戏开始消息,并隐藏自己。 - 最高分:创建变量
最高分。在游戏结束的脚本里,判断如果<score > 最高分>, 将最高分设为score,并在舞台上显示这个变量。
5.2 常见问题与解决方案速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 小鸟不受控制乱飞或不动 | 1. 重力变量逻辑错误。 2. 事件监听错误(如键位不对)。 3. “游戏进行中”变量未正确初始化或更新。 | 1. 检查小鸟脚本中“重力”增加的值是负数(下落),跳跃时设为正数。 2. 确认触发事件是“当按下空格键”。用键盘直接测试。 3. 游戏开始时设为1,结束时设为0,检查是否有其他地方误改了它。 |
| 管道不出现或只出现一根 | 1. 克隆逻辑错误。 2. 管道角色初始状态被隐藏。 | 1. 检查“当作为克隆体启动时”的脚本,确保克隆体被正确位移和翻转。 2. 在管道主体的“当绿旗被点击”脚本中,确保先“显示”。 |
| 分数不增加或增加异常 | 1. 计分条件判断不准确。 2. 分数变量被局部角色错误修改。 | 1. 调试计分条件。可以临时让小鸟“说”出管道的x坐标,观察穿过瞬间的值,调整判断条件。 2. 确保“score”变量是“适用于所有角色”。 |
| Makey Makey连接后无反应 | 1. 电路未形成回路。 2. 导电物体导电性差。 3. 电脑驱动或Scratch支持未开启。 | 1. 务必确保身体同时接触地线和信号物体。 2. 换用更湿润的水果,或增加接触面积(夹住铝箔包裹的物体)。 3. 在记事本中测试Makey Makey是否输出空格,并检查Scratch的Makey Makey支持是否开启。 |
| 游戏卡顿或运行不流畅 | 1. 克隆体过多未删除。 2. 循环内有大量耗时的图形效果。 | 1. 确保管道移出屏幕后“删除此克隆体”。 2. 简化角色造型,减少使用“图章”等复杂积木。 |
5.3 在教育场景中的深度应用建议
这个项目是一个绝佳的跨学科教学案例,可以拆解出多个教学点:
- 计算机科学:事件驱动编程、循环与条件判断、变量与状态管理、克隆与实例化(面向对象思想的启蒙)、碰撞检测算法。
- 物理:模拟重力与速度(匀加速运动)、坐标与位移。
- 电路与工程:理解闭合电路、导体与绝缘体、硬件输入与软件响应的信号流。
- 艺术与设计:角色与背景设计、游戏视觉风格统一、动画与音效的添加。
在教学实践中,建议采用“项目分解-引导探索-挑战扩展”的模式。先带领学生完成基础版本,确保每个人都能成功运行。然后提出开放性问题:“如何让游戏变得更容易或更难?”“除了香蕉,还能用什么来控制?”,鼓励他们查阅资料、动手实验、分享解决方案。最后,可以举办一个小型展示会,让学生们互相体验彼此优化后的游戏,并讲解自己的设计思路。这个过程所培养的问题解决能力、创造力和表达力,远比单纯学会使用几个积木块重要得多。
从一根普通的香蕉,到屏幕上灵动的小鸟,这中间跨越的正是创意、逻辑与技术的桥梁。当你看到学生因为用自己的水杯成功控制游戏而欢呼时,你就会明白,教育的火花往往就诞生于这种连接虚拟与现实的奇妙瞬间。这个项目的魅力在于,它用一个极其有趣的结果,包裹了严谨的编程思维和物理原理,让学习者在“玩”的过程中,不知不觉地构建起了对数字世界运行方式的基础认知。不妨尝试一下,把你手边的水果变成游戏手柄,这其中的乐趣和成就感,远超你的想象。
