如何创建基于Arduino的便携式游戏主机
这款主机通过ProtoStax模块构建了一个便携式游戏开发环境,配备16x2字符LCD显示屏、两个控制按钮以及两个压电扬声器,用于播放背景音乐和音效。整个设备集成在一个轻巧的外壳中,便于携带。
当然,如果一个便携式游戏主机没有一些演示游戏,那它又有什么用呢?:-) 我们首先从一款森林主题的“无限跑酷”游戏开始,包含背景音乐和音效。游戏中,一位类似哈利·波特风格的“魔法师”手持魔杖,需要跳跃越过障碍物(树木)以尽可能多地收集分数。这款游戏是在现有Arduino版“无限跑酷”基础上进行升级,使游戏体验更接近街机风格——加入背景音乐、音效、高分记录等功能。你还可以轻松切换成哈利·波特、《权力的游戏》或《塞尔达传说》主题(甚至可以自己设计主题)。
在本篇文章中,我们将展示第二款演示游戏——蛇类游戏。
如果你还没见过这款在旧款(非智能)翻页手机上广泛流行过的蛇类游戏,那么游戏的目标就是避开障碍物并吃掉苹果。每当蛇吃掉一个苹果,它的长度就会增加1,游戏速度也会略微加快!同时,蛇不能撞到自己(当蛇变长时,这会成为危险因素)。
按下按钮1或按钮2即可开始游戏。游戏过程中,按按钮1可使蛇向左(逆时针)转弯,按按钮2则使其向右(顺时针)转弯。
当蛇撞到障碍物时游戏结束——无论是碰到四个边缘/墙壁中的任意一个,还是撞到自身。得分根据蛇的长度来计算。
游戏中包含多种音效:蛇转向时、吃苹果时、撞到障碍物或游戏结束时都会发出声音。当你达到高分时,还会播放庆祝音乐!游戏还会显示你失败的原因以及可供挑战的最高分!
本游戏基于SadaleNet开发的“Arduino 1602 蛇类游戏”(原始代码链接请见下方署名)。
准备便携式游戏主机
第二步:准备软件
您可以使用GitHub页面(下方链接)中的示例代码ProtoStaxSnakeGame,该代码也包含运行说明。
此代码使用了以下库:
- ProtoStax_MmlMusicPlayer
- MmlMusic(ProtoStax_MmlMusicPlayer继承自MmlMusic库,因此需要先安装基础库)
- LiquidCrystal_I2C(用于LCD显示屏)
您还需要按照README文件中的说明安装上述库。
第三步:运行程序
编译并上传代码到您的便携式Arduino游戏控制台。
在播放简短的开场音乐(致敬《吃豆人》!)后,按下按钮1(靠近您的按钮,连接至Arduino的引脚2),或按钮2(远离您的按钮,连接至Arduino的引脚3)来开始游戏。
游戏进行时,按按钮1可使蛇向左或逆时针方向转弯;按按钮2则使蛇向右或顺时针方向转弯。
当蛇转弯时(因此你也会听到提示音,知道哪个按钮对应什么),或当蛇撞到障碍物(如边缘/墙壁,或碰到自己/吃掉自己)时,会有不同的音效。每吃掉一个苹果,蛇的长度就会增加1,游戏速度也会略微加快。
游戏将持续到蛇碰到障碍物为止。得分根据蛇的长度计算,游戏开始时会显示最高分。如果在游戏结束时你超过了上次记录的最高分,还会播放一段庆祝音乐(致敬Mappy!)。
对SadaleNet的Arduino 1602蛇形游戏引擎的修改
虽然我保留了原始代码中的基本游戏引擎,但对其进行了大量修改。
代码已调整为使用ProtoStax LCD套件V2中的LiquidCrystal_I2C显示屏。按钮连接至引脚2和3,与ProtoStax便携式Arduino游戏控制台的电路图一致。
此外,控制台还连接了两个压电扬声器至数字引脚10和13,并使用ProtoStax_MmlMusicPlayer库来播放音乐和音效。在游戏过程中,适当位置插入了播放这些音效的调用。
我还添加了游戏运行时的背景音乐:游戏开始时的引导音乐、蛇向左或向右转弯时的音效,以及碰到障碍物时的音效;当打破最高分时,还会播放庆祝音乐,所有功能均通过ProtoStax_MmlMusicPlayer库和压电扬声器实现。当播放开场音乐和庆祝音乐时,控制台输入会被阻断,类似于街机游戏,玩家需要等待简短的音乐片段结束后才能继续操作。添加音乐和音效使游戏在听觉反馈方面更加沉浸。
我会记录最高分,并在游戏结束时将最高分显示在屏幕上。同时,我还会记录游戏结束的原因(如撞到障碍物或蛇头相撞),并以消息形式向玩家提示,让失败原因一目了然——这对新手玩家来说尤其有用。
关于精灵的运作方式
需要注意的一个细节是精灵——蛇和苹果。
在LCD屏幕上,字符以8x5的单元格显示。除了常规的ASCII字符外,你还可以自定义显示字符,该字符将被存储在内存中(createChar函数的第一个参数指定字符应存储在内存中的哪个位置)。
之后,你可以直接使用该内存位置来显示笑脸符号,具体方法如下:
你只能定义8个这样的自定义字符——createChar函数的第一个参数是用于存储内存中其中一个自定义字符的索引(0到7)。
在蛇类游戏中,为了增加可移动位置的数量,每个蛇段和苹果只占用8x5字符区域的一半(实际上少于一半,因为精灵本身只有3x5大小,中间留出第四行为空白)。
在graphic_generate_characters()函数中,根据自定义字符上半部分是否为空白、蛇段或苹果,以及下半部分是否为空白(0)、蛇段(S)或苹果(A)的不同排列方式,共定义了8个自定义字符:
0: 0 A
1: 0 S
2: A 0
3: A A
4: A S
5: S 0
6: S A
7: S S
仅看代码可能有点难以理解,希望这个解释能帮到你!如果你愿意,可以修改这些精灵图像——最简单的方法就是直接更新代码中的方块和苹果字节数组(如上图所示)。
继续前进
一如既往,我想以分享如何通过添加自己的内容来推进这个项目作为结尾。一旦你熟悉了代码示例并理解了代码,尝试通过更多实践来拓展学习成果总是很有帮助的。
以下是一些关于如何推进该项目的建议:
使用LCD自定义字符生成器创建自己的精灵,以制作游戏的个性化版本。需要注意的是,由于每条蛇或苹果精灵仅占用半个字符,因此总共可以创建8个自定义字符,每个字符中可包含蛇、苹果,或空位,以应对蛇在上方、下方,或上下同时出现(例如旋转时)等不同情况。由于LCD最多只能创建8个自定义字符,这限制了可用的特殊精灵数量。例如,希望蛇头、身体和尾巴看起来各不相同,可能需要动态创建自定义字符,这还可能影响游戏的运行性能。
通过编写自己的MML字符串,创作专属的开场音乐、庆祝音乐和音效。
当玩家获得高分时,允许其输入自己的姓名,并建立一个高分及对应玩家姓名的列表。
使用按钮1/按钮2在游戏开始前切换设置/高分菜单界面——用户可通过该设置界面选择背景音乐和音效设置等。
代码已自带按钮去抖功能。你可以用 JC_Button 等库来替代这一部分,这些库除了去抖外,还能轻松处理短按、长按或两个按钮同时按下等情况。例如,可以将两个按钮同时被按住的长按行为视为重置游戏高分(或者只是再次播放令人愉悦的吃豆人开场音乐,而无需真正重置高分记录)!
本文编译自hackster.io





