云天 发表于 2021-2-17 23:28:00

【智控万物】Microbit控制PC射击游戏

本帖最后由 云天 于 2021-2-17 23:28 编辑



【项目目的】

该项目使您可以使用micro:bit作为游戏控制器来控制PC射击游戏。

【项目准备】

使用pynput库中mouse库控制电脑鼠标

为了使代码正常工作,您需要在Mind+的Python模式下安装几个额外的Python模块:Pynput,“监视和控制用户输入设备”。 PinPong库,“允许您在PC / Mac / Linux / Raspberry Pi上的Python并直接与micro:bit交互”。
【代码解析】
import time
from pinpong.board import Board,MSensor,MScreen,Pin
from pynput.mouse import Controller,Button我们需要导入模块以供以后使用。我们将使用3个模块;用于控制和读取micro:bit数据的pinpong模块,用于等待特定时间步长的time模块和用于控制键盘的pynput模块(当然还有PC射击游戏——使用网页版小游戏)。
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=
previous_values=
btn = Pin(Pin.P0, Pin.IN)
mouse = Controller()程序初始化,按钮接在Microbit的P0引脚上。
def btn_rising_handler(pin):#中断事件回调函数
    mouse.click(Button.left,1)
btn.irq(trigger=Pin.IRQ_RISING, handler=btn_rising_handler) #设置中断模式为上升沿触发,及回调函数使用中断,按钮触发中断模拟鼠标点击左键
micro.cal_compass()                                     #校准电子罗盘


#Set Accelerometer Values
previous_values = micro.get_accelerometer_X()
previous_values = micro.get_accelerometer_Y()
x=previous_values
y=previous_values
校准电子罗盘,获取加速度计X,Y值


while 1:
    #Get Accelerometer Values
    tem=0
    for i in range(40):
      tem=tem+micro.get_accelerometer_X()
    tem=int(tem/40)                                          #使用平均值,滤掉干扰值,X轴
    accelerometer_values = tem
    tem=0
    for i in range(40):
      tem=tem+micro.get_accelerometer_Y()
    tem=int(tem/40)                                        #使用平均值,滤掉干扰值,Y轴
    accelerometer_values = tem

    #position=format(mouse.position)
    #print(position)
    if abs(accelerometer_values-previous_values)>8:#去除小抖动,X轴
       x = accelerometer_values
       previous_values = accelerometer_values

    if abs(accelerometer_values-previous_values)>8:#去除小抖动,Y轴
       y = accelerometer_values
       previous_values = accelerometer_values

    if x<-700:
       x=-700
    if x>700:
       x=700
    if y<-400:
       y=-400
    if y>400:
       y=400   
    xcord=int(((1366-0)/ (700 - (-700))) * (x - (-700)) + 0)#映射到屏幕大小,X轴
    ycord=int(((768-0) / (-400 - 400)) * (y-400 ) + 0)       #映射到屏幕大小,Y轴


    mouse.position=(xcord, ycord)#移动鼠标指针
主程序【演示视频】https://v.youku.com/v_show/id_XNTEwNTM4Nzc1Mg==.html【完整代码】

# -*- coding: utf-8 -*-

import time
from pinpong.board import Board,MSensor,MScreen,Pin
from pynput.mouse import Controller,Button
import math
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=
previous_values=
btn = Pin(Pin.P0, Pin.IN)
mouse = Controller()

def btn_rising_handler(pin):#中断事件回调函数
mouse.click(Button.left,1)
btn.irq(trigger=Pin.IRQ_RISING, handler=btn_rising_handler) #设置中断模式为上升沿触发,及回调函数
micro.cal_compass()                                     #校准电子罗盘


#Set Accelerometer Values
previous_values = micro.get_accelerometer_X()
previous_values = micro.get_accelerometer_Y()
x=previous_values
y=previous_values



#Start the Loop
while 1:
    #Get Accelerometer Values
    tem=0
    for i in range(40):
      tem=tem+micro.get_accelerometer_X()
    tem=int(tem/40)
    accelerometer_values = tem
    tem=0
    for i in range(40):
      tem=tem+micro.get_accelerometer_Y()
    tem=int(tem/40)
    accelerometer_values = tem

    #position=format(mouse.position)
    #print(position)
    if abs(accelerometer_values-previous_values)>8:
       x = accelerometer_values
       previous_values = accelerometer_values

    if abs(accelerometer_values-previous_values)>8:
       y = accelerometer_values
       previous_values = accelerometer_values

    if x<-700:
       x=-700
    if x>700:
       x=700
    if y<-400:
       y=-400
    if y>400:
       y=400   
    xcord=int(((1366-0)/ (700 - (-700))) * (x - (-700)) + 0)
    ycord=int(((768-0) / (-400 - 400)) * (y-400 ) + 0)


    mouse.position=(xcord, ycord)




hnyzcj 发表于 2021-2-18 06:31:38

这枪做的真gun
页: [1]
查看完整版本: 【智控万物】Microbit控制PC射击游戏