「图形化编程」Micro:bit Flappy Bird 小游戏(一)

传说世界上有一种鸟没有脚,生下来就不停的飞,飞累了就睡在风里。一辈子只能着陆一次,那就是死亡的时候,对没错,我说的就是 Flappy Bird(笑)
flappybird

提起 Flappy Bird,想必大家都不太陌生,它的玩法非常简单,你只需要不停点击屏幕,一边保持小鸟不要掉下去或者碰到屏幕顶端,一边躲避从右边飞来的超级玛丽里的管子就好了,嗯,不要管为啥是从超级玛丽里面来的管子,也不要管这和鸟有什么关系,对不起其实我也不知道作者阮哈东是咋想的,反正当年就这么火了起来。这篇教程主要讲解一下 Flappy Bird 的原理,以及实现这个类似Flappy Bird小游戏的小鸟部分。

Flappy Bird 原理

Flappy Bird 游戏的原理其实非常简单,大体分为 5 个部分:

  1. 小鸟移动
  2. 生成管子
  3. 移动管子
  4. 检测碰撞
  5. 记分

下面一一讲解

小鸟移动

小鸟的移动分为两部分,

  1. 小鸟在玩家没有按屏幕时会自动下落,我们要实现的小游戏小鸟会一直固定在屏幕最左边,因此小鸟的 x 轴坐标一直为 0,小鸟下落其实是增加小鸟的 y 轴坐标,还记得这幅坐标图吗?坐标原点在左上角
    chuanqiu-zuobiao
  2. 小鸟在玩家点击屏幕时会上升,并且玩家点的越快,上升越快,小鸟上升也就是减少小鸟 y 轴坐标的值

生成管子

由于需要迫使玩家不停点击屏幕控制小鸟躲避管子,因此需要不断变化新生成的管子的位置,才能制造出高低不平的通道让玩家通过,生成管子的速率要固定,不然会使玩家觉得这个游戏很难(已经很难了)

移动管子

管子生成后,需要不断向左移动,这样才能使这个游戏进行下去,不然一切都是静止的,因为小鸟一直在屏幕左边,所以需要移动管子不停向左移动,制造出小鸟不停往右飞的感觉,管子的移动速度也要固定,不能有的快有的慢,这样有可能造成管子挤在一起

检测碰撞

需要检测的碰撞有 3 种,

  1. 小鸟 碰到 屏幕顶端
  2. 小鸟 碰到 地板
  3. 小鸟 碰到 管子
    任何一种碰撞发生,都会使游戏结束,在我们要实现的这个小游戏里,由于 led 点阵大小的限制,我们会把 3 种碰撞简化为 1 种,即小鸟对障碍物的碰撞,不考虑小鸟碰到顶端或者碰到地板的情况

记分

记分规则是当一组管子(上下各一个)移动到屏幕最左边并且小鸟没有碰到时,分数加一

下面我们来实现小鸟移动的部分

小鸟移动部分

前面说过,小鸟的移动分为 玩家点击屏幕上升,不点击屏幕就下落,因此我们在程序里也要实现这两部分,

  1. 首先需要初始化,在游戏开始时我们在屏幕最左边中间位置初始化一个精灵,坐标是(0,2),并赋值给变量 xiaoniao
  2. 需要用到一个 输入 分类下的 当按钮 A 按下 事件模块,用来响应玩家的输入
  3. 拖一个 游戏 分类下的 更改 x 幅度为 1 的模块到 当按钮 A 按下 事件下,改为 xiaoniao 更改 y 幅度为 -1
  4. 拖一个 基本 分类下的 暂停 模块到 当按钮 A 按下 事件下,改为暂停 200ms,加一个暂停为了防止玩家不停点击按钮,使得小鸟上升过快,你可以试着改成自己喜欢的值,至此小鸟上升的部分完成
  5. 在 无限循环 模块下,拖一个 游戏 分类下的 更改 x 幅度为 1 的模块,改为 xiaoniao 更改 y 幅度为 1,即增加 xiaoniao 的 y 轴坐标,小鸟下降
  6. 再拖一个 暂停 模块到 无限循环 模块下,并改为 500ms,这样每隔 0.5 秒,小鸟就下降一格。小鸟下降的逻辑就完成啦

完整程序图

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.