本帖最后由 云天 于 2021-2-15 17:35 编辑
【项目目的】
该项目使您可以使用micro:bit作为游戏控制器来控制PC游戏。
【项目准备】
为了使代码正常工作,您需要在Mind+的Python模式下安装几个额外的Python模块:Pynput,“监视和控制用户输入设备”。 PinPong库,“允许您在PC / Mac / Linux / Raspberry Pi上的Python并直接与micro:bit交互”。
【代码解析】
- from pinpong.board import Board,MSensor,MScreen
复制代码
我们需要导入模块以供以后使用。我们将使用3个模块;用于控制和读取micro:bit数据的pinpong模块,用于等待特定时间步长的time模块和用于控制键盘的pynput模块(当然还有游戏)。
- Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
- #Board("microbit","COM36").begin() #windows下指定端口初始化
- #Board("microbit","/dev/ttyACM0").begin() #linux下指定端口初始化
- #Board("microbit","/dev/cu.usbmodem14101").begin() #mac下指定端口初始化
-
- micro = MSensor() #Microbit板载传感器
- microbit = MScreen()#Microbit屏幕
- accelerometer_values=[0,0,0]
- previous_values=[0,0,0]
复制代码
初始化
- def changeKeyState(key, value):
- global keyboard_keys
-
- #Change Only Neccessary
- if value!=keyboard_keys.get(key, False):
- if value:
- keyboard.press(key)
- else:
- keyboard.release(key)
-
- keyboard_keys[key] = value
复制代码
changeKeyState 是一项功能,它将帮助我们控制键盘键-例如,如果车把向左移动,它将按向左箭头键。
- micro.cal_compass() #校准电子罗盘
-
- keyboard = Controller()
- #Set Accelerometer Values
- previous_values[0] = micro.get_accelerometer_X()
- previous_values[1] = micro.get_accelerometer_Y()
- previous_values[2] = micro.get_accelerometer_Z()
- keyboard_keys = {}
复制代码
校准电子罗盘,获取加速度计的X,Y,Z值。
-
- while 1:
- #Blink
- microbit.show_shape("heart")
- time.sleep(0.5)
- microbit.hide_all_lights()
-
- #Start the Program if a Button is Pressed
- if micro.buttonA_is_pressed() or micro.buttonB_is_pressed():
- break
- time.sleep(0.5)
复制代码
这是第一个循环。它将一直闪烁,直到用户按下A或B按钮。按下按钮后,控制器将开始运行。
-
- while 1:
- #Get Accelerometer Values
- accelerometer_values[0] = micro.get_accelerometer_X()
- accelerometer_values[1] = micro.get_accelerometer_Y()
- accelerometer_values[2] = micro.get_accelerometer_Z()
- x = micro.get_accelerometer_X()
- y = micro.get_accelerometer_Y()
- z = micro.get_accelerometer_Z()
-
- #Calculate Avarege Motion in X,Y,Z Directions
- motion = sum(map(lambda i:abs(accelerometer_values[i]-previous_values[i]),range(3)))/3
-
复制代码
这是主循环。我们将从获取所需的值并计算运动开始。-
- changeKeyState(Key.up, y>400)
- changeKeyState(Key.right, x>60)
- changeKeyState(Key.left, x<-60)
- changeKeyState(Key.shift, motion>500)
- previous_values = accelerometer_values
-
复制代码
然后,我们将使用之前获得的信息来控制游戏。当Microbit向右或向左旋转高于特定值时,将触发键盘键。
【演示视频】
【完整代码】
-
- import time
- from pinpong.board import Board,MSensor,MScreen
- from pynput.keyboard import Key, Controller
- Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
- #Board("microbit","COM36").begin() #windows下指定端口初始化
- #Board("microbit","/dev/ttyACM0").begin() #linux下指定端口初始化
- #Board("microbit","/dev/cu.usbmodem14101").begin() #mac下指定端口初始化
-
- micro = MSensor()
- microbit = MScreen()
- accelerometer_values=[0,0,0]
- previous_values=[0,0,0]
- def changeKeyState(key, value):
- global keyboard_keys
-
- #Change Only Neccessary
- if value!=keyboard_keys.get(key, False):
- if value:
- keyboard.press(key)
- else:
- keyboard.release(key)
-
- keyboard_keys[key] = value
- #changeKeyState 是一项功能,它将帮助我们控制键盘键-例如,如果车把向左移动,它将按向左箭头键。
-
-
- micro.cal_compass() #校准电子罗盘
-
-
- keyboard = Controller()
- #Set Accelerometer Values
- previous_values[0] = micro.get_accelerometer_X()
- previous_values[1] = micro.get_accelerometer_Y()
- previous_values[2] = micro.get_accelerometer_Z()
- keyboard_keys = {}
-
- while 1:
- #Blink
- microbit.show_shape("heart")
- time.sleep(0.5)
- microbit.hide_all_lights()
-
- #Start the Program if a Button is Pressed
- if micro.buttonA_is_pressed() or micro.buttonB_is_pressed():
- break
- time.sleep(0.5)
- #这是第一个循环。它将一直闪烁,直到用户按下A或B按钮。按下按钮后,控制器将开始运行。
- #Start the Loop
- while 1:
- #Get Accelerometer Values
- accelerometer_values[0] = micro.get_accelerometer_X()
- accelerometer_values[1] = micro.get_accelerometer_Y()
- accelerometer_values[2] = micro.get_accelerometer_Z()
- x = micro.get_accelerometer_X()
- y = micro.get_accelerometer_Y()
- z = micro.get_accelerometer_Z()
-
- #Calculate Avarege Motion in X,Y,Z Directions
- motion = sum(map(lambda i:abs(accelerometer_values[i]-previous_values[i]),range(3)))/3
- #Change Direction
-
- changeKeyState(Key.up, y>400)
- changeKeyState(Key.right, x>60)
- changeKeyState(Key.left, x<-60)
- changeKeyState(Key.shift, motion>500)
-
- #Set Current Accelerometer Values to Previous
- previous_values = accelerometer_values
-
复制代码
|