提起 Flappy Bird,想必大家都不太陌生,它的玩法非常简单,你只需要不停点击屏幕,一边保持小鸟不要掉下去或者碰到屏幕顶端,一边躲避从右边飞来的超级玛丽里的管子就好了,嗯,不要管为啥是从超级玛丽里面来的管子,也不要管这和鸟有什么关系,对不起其实我也不知道作者阮哈东是咋想的,反正当年就这么火了起来。这篇教程主要讲解一下 Flappy Bird 的原理,以及实现这个类似Flappy Bird小游戏的小鸟部分。
Flappy Bird 原理
Flappy Bird 游戏的原理其实非常简单,大体分为 5 个部分:
- 小鸟移动
- 生成管子
- 移动管子
- 检测碰撞
- 记分
下面一一讲解
小鸟移动
小鸟的移动分为两部分,
- 小鸟在玩家没有按屏幕时会自动下落,我们要实现的小游戏小鸟会一直固定在屏幕最左边,因此小鸟的 x 轴坐标一直为 0,小鸟下落其实是增加小鸟的 y 轴坐标,还记得这幅坐标图吗?坐标原点在左上角
 - 小鸟在玩家点击屏幕时会上升,并且玩家点的越快,上升越快,小鸟上升也就是减少小鸟 y 轴坐标的值
生成管子
由于需要迫使玩家不停点击屏幕控制小鸟躲避管子,因此需要不断变化新生成的管子的位置,才能制造出高低不平的通道让玩家通过,生成管子的速率要固定,不然会使玩家觉得这个游戏很难(已经很难了)
移动管子
管子生成后,需要不断向左移动,这样才能使这个游戏进行下去,不然一切都是静止的,因为小鸟一直在屏幕左边,所以需要移动管子不停向左移动,制造出小鸟不停往右飞的感觉,管子的移动速度也要固定,不能有的快有的慢,这样有可能造成管子挤在一起
检测碰撞
需要检测的碰撞有 3 种,
- 小鸟 碰到 屏幕顶端
- 小鸟 碰到 地板
- 小鸟 碰到 管子
任何一种碰撞发生,都会使游戏结束,在我们要实现的这个小游戏里,由于 led 点阵大小的限制,我们会把 3 种碰撞简化为 1 种,即小鸟对障碍物的碰撞,不考虑小鸟碰到顶端或者碰到地板的情况
记分
记分规则是当一组管子(上下各一个)移动到屏幕最左边并且小鸟没有碰到时,分数加一
下面我们来实现小鸟移动的部分
小鸟移动部分
前面说过,小鸟的移动分为 玩家点击屏幕上升,不点击屏幕就下落,因此我们在程序里也要实现这两部分,
- 首先需要初始化,在游戏开始时我们在屏幕最左边中间位置初始化一个精灵,坐标是(0,2),并赋值给变量 xiaoniao
 - 需要用到一个 输入 分类下的 当按钮 A 按下 事件模块,用来响应玩家的输入
- 拖一个 游戏 分类下的 更改 x 幅度为 1 的模块到 当按钮 A 按下 事件下,改为 xiaoniao 更改 y 幅度为 -1
- 拖一个 基本 分类下的 暂停 模块到 当按钮 A 按下 事件下,改为暂停 200ms,加一个暂停为了防止玩家不停点击按钮,使得小鸟上升过快,你可以试着改成自己喜欢的值,至此小鸟上升的部分完成
- 在 无限循环 模块下,拖一个 游戏 分类下的 更改 x 幅度为 1 的模块,改为 xiaoniao 更改 y 幅度为 1,即增加 xiaoniao 的 y 轴坐标,小鸟下降
- 再拖一个 暂停 模块到 无限循环 模块下,并改为 500ms,这样每隔 0.5 秒,小鸟就下降一格。小鸟下降的逻辑就完成啦
完整程序图

效果图:按 A 按钮小鸟就上升,不按按钮小鸟就下降

今天就到这里啦,下篇教程我们来学习如何生成障碍物(管子)