项目需求:使用姿态传感器完成体感游戏手柄,并设计完成一个游戏,例如俄罗斯方块、左右晃动手柄使方块左右移动。
本项目是要实现的功能是基于M5STICK PLUS板卡实现对是男人就下100层这个复古游戏的简单移植。游戏大体为当按下按钮后游戏开始,玩家通过对板卡的左右偏移来控制目标单位的移动,往右偏移单位向右移动,往左偏移单位向左移动。同时会有平台不断从屏幕下方往屏幕上方上升,当玩家控制的单位位于平台的上方是,会随着平台一起上升,否则将会下降,当单位随着平台上升或下降超出屏幕范围,游戏将会结束。
实现思路:
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时,单位消失于屏幕中,游戏宣告结束,打断循环并显示游戏结束的提示。.
主要问题:
由于对游戏开发的不熟悉,以及时间关系,平台上升速度、陷阱、血量等设置为能实现。
未来计划:
完善游戏,加上分数、速度等级、陷阱等元素,增加游戏的趣味性。