在电磁场拍打襟翼

我去了电磁场,一个有好奇心的人参加的野营节,其中的一项福利是一个叫做TildaMkπ的特殊徽章。

Tilda徽章是基于BBC micro:bit的精巧工程,因此它运行一些固件,该固件运行一个名为Micropython的python版本。

我的徽章附带了许多预先构建的应用程序,其中显示您的姓名,一些设置工具以及一个蛇游戏。

更重要的是,徽章可以使用python进行完全编程,而营地既令人惊奇又充满奇异,我突然真的想让徽章做点什么,什么酷,什么有趣的事情。

问题是我在这些情况下经常不知道,但是我想到了做游戏的想法,一个简单的游戏可以在几个小时内完成编程。 我差点就制作了蛙人风格的游戏,但最终还是决定制作“飞扬的小鸟”克隆游戏。

选择Flappy Bird的主要原因是它只需要一个按钮,更重要的是,它是一款具有非常简单的机制的无限滚动器。

tl; dr; 该代码可在github上找到,您可以直接下载该应用程序,也可以从徽章上的app_library下载该应用程序

如何处理

一旦决定了要做什么,就需要确定要编写的代码。 使系统启动并运行非常简单。 将徽标附加到我的ubuntu VM上,将一个名为main.py的python文件复制到apps / bruntonspall〜emflap目录,然后从app_library中选择游戏。

游戏必须初始化图形和按钮库,设置一些全局变量,然后开始操作。

该应用程序有一个玩单个游戏的主循环,然后打印分数和结束屏幕内容,并等待查看是否按下了A或B按钮。 如果按下B按钮,则退出;如果按下A按钮,则返回循环。

在玩游戏方面,我们初始化变量并随机化管道。 每个管道都从前一个管道上拉出10个块,并且生成的间隙是前一个管道的随机高度±5。 这是为了确保管道的生成距离之前的管道不会太远,这会使游戏变得非常困难。

绘制管道是一个有趣的过程。 我们确定管道是一定的高度,例如7高。 但是画图很难。 我们在网格上绘制所有内容,该网格从左侧的0到右侧的320(x轴),从顶部的0到底部的240(y轴)。

从Snake游戏开始,我认为使用8×8网格是明智的,而不是绘制单个像素,而是使用8×8块进行绘制,这使我们得到40块宽和30块高。

因此,如果我们要在7个块高处进行绘制,则从0到56(7 * 8)高进行绘制。 但我们也想在另一侧绘制匹配的管道。 如果我们的差距是5块高,则意味着我们希望从96((7 + 5)* 8)减至240。 ,在我撰写本文时,实现可能仍然是错误的!)

在绘制管道时,我也会做一件可怕的事情,而不是找出可见的管道,我只是要求图形库绘制屏幕外的管道,并希望该库不会绘制它们(它不会t)。 这可能效率很低,但是还不需要修复。

主循环

最后,我需要一个循环来绘制屏幕,​​检查是否有人按下了按钮,然后更新了游戏状态。

Snake应用程序以传统方法执行此操作,因为它循环了,但在每个循环结束时都有500ms的延迟,因此它不会运行得太快。 在Snake应用程序中,如果蛇每圈绕圈移动一次,并且每秒设法运行100次,那么您将在大约1/3秒的时间内撞到墙!

但是,每次在循环中暂停应用程序500毫秒,这意味着在每次循环中输入也只能读取一次。

对于蛇来说,这可能会起作用,但是如果输入感到迟钝或错过控制,它可能会变得非常烦人。 在Flappy Bird中,您确实希望系统具有响应能力,因此我实现了一个不同的输入系统。

而不是在循环时暂停,而是检查自上次循环以来经过了多少毫秒。 如果经过时间已超过100毫秒,则我们将更新游戏状态和显示。 这使我们每秒有10个游戏“滴答声”。

在与物理学相关的游戏中,我们可能会在每次循环时执行游戏更新,但会根据时间的变化来更新游戏状态。 这使我们可以在循环中每次重画屏幕,并更新非玩家互动。

在EMFlappy中,我不需要做所有的事情,因为世界上大多数时间都没有改变,所以我们只是改变了鸟的位置。 我们每秒可以这样做10次,它将运行正常。

对于输入系统,我们使用了一个有趣的技巧。 由于系统每秒可能检查输入数百次,因此我们不需要使用乘法的输入检测功能。 相反,只要按住按钮,我们就将鸟的方向设置为-2。 这将相差10秒,但不小于10秒。

鸟类运动

那么,如何使这只鸟弹跳起来呢?

正如任何完成了基础物理学的学生都会知道的那样,地球上的重力会导致物体以9.8 m / s的速度向地面加速。

关键在于这是一种加速。 因此,为了进行建模,我们将存储鸟的当前位置(x和y),以及下一个刻度时将改变多少位置(简称Delta-x,Delta-y或dx,dy)。

每个刻度线,我将dx添加到当前x以更新其位置,并且与y在y上相同。 为了模拟飞向地面的飞鸟,我们每回合将dy增加1。 因此,起初它可能是-2,所以我们的y将下降2(将我们带到屏幕顶部)。 在下一个刻度时,dy变为-1,因此我们的y仅上升1,然后dy为0,而我们保持在原位置。 然后我们开始在每个滴答声之后向地面加速,每个滴答声越来越快。

当您按下A按钮时,我们将dy设置为-2,从而在接下来的3个正确的块中向您倒退总共3个块(-2,-1、0)。 但是,如果您按住按钮2十分之一秒,则在接下来的4个块中将上升5个块。 这使输入感觉正确,快速点击使您弹出,而按住按钮一秒钟或更短,则使您弹出的位置略高!

下一步是什么?

放在一起很有趣。 在大约3个小时的黑客攻击中,我将所有内容整理在一起。 幸运的是我有游戏开发背景,所以我知道很多技巧和窍门,但是我真的很想快速地将某些东西组合在一起,只是为了展示在徽章上可以做什么。

徽章的硬件和开发环境非常容易,我建议您试用一下,看看能做什么。

如果人们想尝试,我已经免费打开了代码以供重用,您可以考虑一些想法。 我怀疑声音效果会很酷,并会增加沉浸感。 更好的图形,因此看起来像管道的管道,漂亮的背景,滚动等等将使游戏感觉更好。

毫无疑问,系统中存在错误,我敢肯定,至少要碰到管道的边界条件有些奇怪。 查找并修复这些问题可能很有用。

最后,尽管我没有实现比27高的分数,但实际上实现无限滚动会很好。 也许您更好,需要挑战,如果这样,欢迎提出要求。