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 框图和软件流程图
4 设计思路
4.1 倾斜m5StickC Plus完成最简单的控制飞船运动模块,需要使用到了m5StickC Plus的姿态传感器,此目的通过UIFlow中Hardwares-IMU-Get X ACC获取X轴方向的加速度实现。
4.2 设计不同的飞船以及外星人模块,首先上网搜集合适的图片,通过Photoshop进行图片样式转化,由于m5StickC Plus的屏幕尺寸为14寸、135*240分辨率的,所以将所有的导入图片修改到50*50像素以内的大小,再进行导入。
4.3 屏幕中每次只出现一个外星人,所以引用函数对每个外星人的参数进行编辑,并通过变量diren来决定出现哪个外星人,出现外星人通过主函数调用对应外星人函数来实现。
4.4 不同的外星人具有不同的外形大小,所以根据外星人的大小设置不同的碰撞判定参数。同时为了增加游戏的乐趣体验以及难度,Boss2被设置为具有朝玩家移动方向移动的特点。
4.5 根据实时得分score来决定出现外星人的躲避难易,得到的score越多,出现的外星人越难以躲避。此目的通过对score进行条件判断从而得到不同的diren值区间来实现。
4.6 当得分score达到25,将直接跳出胜利页面:“wonderful!!!you win”;若score未达到25却发生碰撞,则跳出失败页面:“sorry please try again”。
4.7 游戏结束后通过按键A可以重新开始。
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,但碍于时间精力有限,暂时无法实现。
当初想做这个还是因为在入门教程中看到了类似的案例,然后又回想起儿时玩过的雷霆战机、飞机大战的像素游戏,于是马上去网上找了类似元素的飞船外星人图片,照着案例改进了小游戏中,然后又自己设计了很多(自以为)很有趣的规则,最后做出了这一版小游戏。在写这份报告的时候,还花了一些表格,让我有一种自己在做游戏攻略的感觉哈哈哈哈哈哈,也许这就是开发游戏的一种乐趣吧,今天在我的游戏处子秀中感受到了。
研究开发板真的是一个很有趣的过程,尤其是看到自己的代码反馈出想要的结果,那种充满自豪的感觉难以比拟,感谢硬禾学堂这次“暑假在家一起练”的活动,我的建议就是这个活动要一直一直办下去呀!我超级喜欢的!