基于M5StickC Plus完成体感游戏手柄,并设计游戏“小心外星人”
本项目基于M5StickC Plus,基于UIFlow平台进行开发,使用姿态传感器完成体感游戏手柄,并设计了“小心外星人”的小游戏
标签
2022暑假在家练
M5StickC Plus
姿态传感器
Hermanrao
更新2022-09-02
北京化工大学
640

1 项目介绍

简介:本项目基于M5StickC Plus,基于UIFlow平台进行开发,使用姿态传感器完成体感游戏手柄,并设计了“小心外星人”的小游戏。

游戏规则:玩家通过M5StickC Plus内部的姿态传感器控制火箭的左右移动,躲避外星人的攻击。共有五种不同的外星人,每种外星人具有不同的攻击特性,成功躲避25次即可获得胜利。

硬件介绍:M5StickC Plus 是M5StickC的大屏幕版本,主控采用ESP32-PICO-D4模组,具备蓝牙4.2与WIFI功能,小巧的机身内部集成了丰富的硬件资源,如红外、RTC、麦克风、LED、IMU、按键、蜂鸣器、PMU等,在保留原有M5StickC功能的基础上加入了无源蜂鸣器,同时屏幕尺寸升级到1.14寸、135*240分辨率的TFT屏幕,相较之前的0.96寸屏幕增加18.7%的显示面积,电池容量达到120mAh,接口同样支持HAT与Unit系列产品。

2 实现的功能

1)控制火箭:通过加速计的变化判定倾斜方向控制变量x的增减,从而控制“火箭飞船”的左右移动。

2)不同的“外星人”:设置不同的“外星飞船”以及“外星人”作为障碍物,以不同的速度以及规则落下。共有五个不同的障碍物:敌人1、敌人2、敌人3、Boss1、Boss2。其中敌人1、2、3体型较小,但速度不同,1最慢3最快。Boss1体型较大,速度中等。Boss2体型最大,行动缓慢,但是会随着玩家控制的飞船所在方向进行移动,躲避难度较大。

3)判定碰撞:判定飞船是否与外星人碰撞,若成功躲避则玩家积1分,积累得25分则游戏胜利;若在完成25次躲避之前与外星人发生碰撞,则游戏结束。

4)重新开始:按下按键A,游戏重新开始。

3 框图和软件流程图

Fosz3FzD4aeEns8T0Q6MzHIksSoh

4 设计思路

4.1 倾斜m5StickC Plus完成最简单的控制飞船运动模块,需要使用到了m5StickC Plus的姿态传感器,此目的通过UIFlow中Hardwares-IMU-Get X ACC获取X轴方向的加速度实现。

4.2 设计不同的飞船以及外星人模块,首先上网搜集合适的图片,通过Photoshop进行图片样式转化,由于m5StickC Plus的屏幕尺寸为14寸、135*240分辨率的,所以将所有的导入图片修改到50*50像素以内的大小,再进行导入。

FhsG90HIg0rE_U8QpGtpl48B4Obl

4.3 屏幕中每次只出现一个外星人,所以引用函数对每个外星人的参数进行编辑,并通过变量diren来决定出现哪个外星人,出现外星人通过主函数调用对应外星人函数来实现。

4.4 不同的外星人具有不同的外形大小,所以根据外星人的大小设置不同的碰撞判定参数。同时为了增加游戏的乐趣体验以及难度,Boss2被设置为具有朝玩家移动方向移动的特点。

FjchOhhI_qD5q9D7nNNp-ALtGkgE

4.5 根据实时得分score来决定出现外星人的躲避难易,得到的score越多,出现的外星人越难以躲避。此目的通过对score进行条件判断从而得到不同的diren值区间来实现。

4.6 当得分score达到25,将直接跳出胜利页面:“wonderful!!!you win”;若score未达到25却发生碰撞,则跳出失败页面:“sorry please try again”。

4.7 游戏结束后通过按键A可以重新开始。

Fvq3ZcNGxSH3IA_19qQqAXUkxT0qFt32eImrLrg0zlllLI_DEDOVbVvx

5 主要代码片段

5.1 通过得分来判断出现外星人的区间

if score <= 5:
    diren = 1
elif score <= 10:
    diren = random.randint(1, 3)
elif score <= 15:
    diren = random.randint(2, 4)
elif score <= 20:
    diren = random.randint(3, 5)
elif score < 25:
    diren = random.randint(4, 5)
else:
    diren = 0

5.2 通过diren来调用不同外星人的函数

randomx = random.randint(0, 105)
if diren == 1:
    diren1()
elif diren == 2:
    diren2()
elif diren == 3:
    diren3()
elif diren == 4:
    randomx = random.randint(0, 99)
    boss1()
elif diren == 5:
    randomx = random.randint(0, 63)
    boss2()
elif diren == 0:
    flag = False

5.3 根据姿态传感器来控制宇宙飞船的左右移动

if (imu0.acceleration[0]) >= 0.1 and x >= 1:
    x = (x if isinstance(x, Number) else 0) + -3
    image0.setPosition(x=x)
if (imu0.acceleration[0]) <= 0.1 and x <= 121:
    x = (x if isinstance(x, Number) else 0) + 3
    image0.setPosition(x=x)

5.4 根据坐标位置距离来判定是否发生碰撞

if j > 199 and x - randomx < 19 and randomx - x < 14:
    flag = False

5.5 Boss2可以跟随玩家控制的火箭移动

boss2x = int((boss2x + (x - boss2x) / 10))

 

6 遇到的难题以及解决办法

难点1:实现不同的外星人随机出现以及游戏难度由简单到难的过渡。

解决方法:创建diren参数,在不同的score下取不同的diren区间,从而实现随着玩家得分越来越高的情况下,取得的diren值对应的外星人躲避难度越大。

难点2:不同外星人碰撞参数的设置。

解决方法:通过photoshop提前设置好外星人图片的大小,根据大小参数,即像素点参数,对对应外星人的碰撞参数进行设置。

难点3:玩家游戏体验以及游戏可玩性的验证。

解决方法:找同学们进行玩,收集他们的建议(比如Boss2跟随速度太快,应该调低些),根据建议对代码进行修改。

7 未来的计划或建议

本次“暑假在家一起练”活动正好赶上暑假备战考研以及学校提早开学进行校内生产实习,并没有太多的精力来深入学习M5StickC Plus的外设硬件,以后肯定会花时间把对应的开发环境配置好,然后把8*8LED灯板研究一下。

至于这个小游戏,其实还有很多想实现想法,比如在得分越来越高地过程中火箭升级,体型变大,速度变快,甚至可以通过发射子弹击败BOS,但碍于时间精力有限,暂时无法实现。

当初想做这个还是因为在入门教程中看到了类似的案例,然后又回想起儿时玩过的雷霆战机、飞机大战的像素游戏,于是马上去网上找了类似元素的飞船外星人图片,照着案例改进了小游戏中,然后又自己设计了很多(自以为)很有趣的规则,最后做出了这一版小游戏。在写这份报告的时候,还花了一些表格,让我有一种自己在做游戏攻略的感觉哈哈哈哈哈哈,也许这就是开发游戏的一种乐趣吧,今天在我的游戏处子秀中感受到了。

研究开发板真的是一个很有趣的过程,尤其是看到自己的代码反馈出想要的结果,那种充满自豪的感觉难以比拟,感谢硬禾学堂这次“暑假在家一起练”的活动,我的建议就是这个活动要一直一直办下去呀!我超级喜欢的!

 

附件下载
fjdzrhtfinal.m5f
《小心外星人》游戏代码
小心外星人_图片文件.zip
《小心外星人》图片文件,需要将文件导入到板卡的res文件夹中
团队介绍
要强的立风,想学各种各样的东西
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号