基于M5StickC Plus的体感游戏
本次所设计的一款基于M5StickC Plus的体感游戏,类似于是男人就下100层的简易体感版
标签
嵌入式系统
ESP32
2022暑假在家练
M5StickC Plus
繁光与梦
更新2022-09-06
华东理工大学
490

项目需求:使用姿态传感器完成体感游戏手柄,并设计完成一个游戏,例如俄罗斯方块、左右晃动手柄使方块左右移动。

本项目是要实现的功能是基于M5STICK PLUS板卡实现对是男人就下100层这个复古游戏的简单移植。游戏大体为当按下按钮后游戏开始,玩家通过对板卡的左右偏移来控制目标单位的移动,往右偏移单位向右移动,往左偏移单位向左移动。同时会有平台不断从屏幕下方往屏幕上方上升,当玩家控制的单位位于平台的上方是,会随着平台一起上升,否则将会下降,当单位随着平台上升或下降超出屏幕范围,游戏将会结束。

实现思路:

Fnq-1Mqk5AR9btkG7hRusTgYXaDS

1.使用体感操作对单位进行控制。

def move():
   X = imu0.ypr[2]
  global block2_y, block3_y, block1_y, MOVE_X, block1_x, X, MOVE_Y, block2_x, block3_x, Y, block1__x, block2__x, block3__x
  if float(X) >= 5:
    if MOVE_X < 130:
      MOVE_X = MOVE_X + 1
  if float(X) <= -5:
    if MOVE_X > 0:
      MOVE_X = MOVE_X - 1

新建两个变量X和MOVE_X,将板卡的俯仰角度数存储在变量X中,通过变量X的数值来判断板卡的当前状态,把玩家控制单位的X轴坐标储存在MOVE_X中。当板卡向左偏转一定角度时,X的值大于负五,增加MOVE_X的值,使控制单位的x轴坐标向右移动。当板卡向右偏转时,X的值大于五,减少MOVE_X的值,使单位向左移动。将MOVE_X的值加上范围,避免单位移动超出屏幕范围。

2.平台单位的随机生成。

def block1():
  global block2_y, block3_y, block1_y, MOVE_X, block1_x, X, MOVE_Y, block2_x, block3_x, Y, block1__x, block2__x, block3__x
  if float(block1_y) >= 0:
    block1_y = block1_y - 1
    lcd.rect(block1_x, block1_y, 50, 10, color=0xffffff)
  if float(block2_y) >= 0:
    block2_y = block2_y - 1
    lcd.rect(block2_x, block2_y, 50, 10, color=0xffffff)
  if float(block3_y) >= 0:
    block3_y = block3_y - 1
    lcd.rect(block3_x, block3_y, 50, 10, color=0xffffff)
  if float(block1_y) == 0:
    block1_y = 230
    block1_x = random.randint(0, 90)
  if float(block2_y) == 0:
    block2_y = 230
    block2_x = random.randint(0, 90)
  if float(block3_y) == 0:
    block3_y = 230
    block3_x = random.randint(0, 90)
  wait_ms(5)

创建两个新的向量block_x和block_y分别记录平台的x、y值,并引入随机函数库,将平台在x轴上的值设置为随机整数,增加游戏的趣味性。为限制平台生成与屏幕外,给随机函数加上范围限制,使其在0到90之间取随机整数。block_y的值不停减少,使平台不停上升。同时,为了方便之后单位与平台的碰撞判断,将这两个变量重复三次,使屏幕同时出现3个平台,每个平台有各自的数据,当其中一个上到到屏幕顶端时,将移动到屏幕底端,在随机的x轴上重新开始上升。

3.单位与平台的碰撞判定。

def move():
     block1__x = block1_x + 50
    block2__x = block2_x + 50
    block3__x = block3_x + 50  
   if Y == block1_y and MOVE_X < block1__x and MOVE_X > block1_x or Y == block2_y and MOVE_X < block2__x and MOVE_X > block2_x or Y == block3_y and MOVE_X < block3__x and MOVE_X > block3_x:
      MOVE_Y = MOVE_Y - 1
   else:
      MOVE_Y = MOVE_Y + 1
   lcd.rect(MOVE_X, MOVE_Y, 10, 10, color=0xffffff)
   wait_ms(5)

由于平台是有宽度的,所以新建一个变量block__x,其数值为block_x加五十。当单位位于block_x和block__x之间,同时y轴与平台的y轴也就是变量block_y的数值相同时,单位就位于平台上,使单位的y轴数值增加,,形成单位随着平台上升的情形。之前平台的变量设置了三份,将这三份全部导入后,除了这三种情况外,单位都必不在平台上,所以使单位y轴数值减少,使单位下降。

4.游戏的结束判断。

def buttonA_wasPressed():
  if MOVE_Y > 240 or MOVE_Y < 5:
    lcd.print('game ', 0, 30, 0xffffff)
    lcd.print('over', 0, 60, 0xffffff)
  pass
btnA.wasPressed(buttonA_wasPressed)

循环中内嵌循环,使当循环被打断后重新按下按钮就可以重新开始。设置范围,当单位的y轴数值大于240或者小于5时,单位消失于屏幕中,游戏宣告结束,打断循环并显示游戏结束的提示。.

FsraRdFlFJsIKxuhG4lzFfO-ieVQFjqfcvbtMl31MNaBYB-2lf7-DRDa

Fs5l7WOi-88tgfBbTXqzr4wnIKC9

主要问题:

由于对游戏开发的不熟悉,以及时间关系,平台上升速度、陷阱、血量等设置为能实现。

未来计划:

完善游戏,加上分数、速度等级、陷阱等元素,增加游戏的趣味性。

 

附件下载
game.m5f
团队介绍
华东理工大学
团队成员
繁光与梦
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号