Python模拟手柄按键.扳机.摇杆,实现自动化手柄打游戏!

前言:

最近在网易当临时工,每天的工作就是用手柄打游戏,手柄操作非常频繁且80%的按键都是重复的,为了减少手指疲劳度而制作的,国内没有很详细的教程,干脆自己写一个吧,手柄玩家越来越多,说不定以后还能用到~

vgamepad库说明

本教程使用vgamepad库的0.1.0版本

api调用官方文档↓↓↓

https://github.com/yannbouteiller/vgamepad

用于模拟XBOX 360手柄和DS4手柄,本文针对win系统。linux系统基本通用,部分不通用的代码请查阅官方文档了解。

vgamepad库安装指令

pip install vgamepad==0.1.0

安装vgamepad过程会自动下载并运行 ViGEmBus 驱动安装程序,同意安装即可。

模拟XBOX 360手柄

导入库 

import vgamepad

创建一个虚拟XBOX 360手柄,虚拟游戏手柄将通过 ViGEmBus 驱动程序连接到系统,并保持连接状态,直到对象被销毁。如果当前电脑没有连接其他手柄,该虚拟手柄就会默认创建第一个位置。

gamepad = vgamepad.VX360Gamepad()

根据vgamepad给出的类名,我们自己定义虚拟XBOX 360游戏手柄全部按键,及扳机和摇杆的名字或类名,方便后面代码编写调用

十字方向键:

UP = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_UP
DOWN = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_DOWN
LEFT = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_LEFT
RIGHT = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_RIGHT
#代码段编写者 bilibili:方块味的菠萝酱

ABXY键:

A = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_A
B = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_B
X = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_X
Y = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_Y
#代码段编写者 bilibili:方块味的菠萝酱

开始返回西瓜键:

START = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_START
BACK = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_BACK
GUIDE = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_GUIDE
#代码段编写者 bilibili:方块味的菠萝酱

左右摇杆各有一个X轴和一个Y轴,左右扳机则只有一个轴。

def LEFT_TRIGGER(value):
    gamepad.left_trigger(value)
    # 左扳机轴 value改成0到255之间的整数
def RIGHT_TRIGGER(value):    
    gamepad.right_trigger(value)
    # 右扳机轴 value改成0到255之间的整数
def LEFT_JOYSTICK(x_value, y_value):
    gamepad.left_joystick(x_value, y_value)
    # 左摇杆XY轴  x_values和y_values 改成-32768到32767之间的整数
def RIGHT_JOYSTCIK(x_value, y_value):
    gamepad.right_joystick(x_value, y_value)
    # 右摇杆XY轴  x_values和y_values 改成-32768到32767之间的整数
#代码段编写者 bilibili:方块味的菠萝酱

上面的轴原始参数个人觉得不是很好,所以可以使用下面的轴浮点值来代替,更符合轴直观。

使用浮点值参数下

扳机轴等于1就是完全按下扳机,等于则是完全松开扳机

摇杆的X轴大于0就是摇杆推右,Y轴大于0就是摇杆推上

原始参数同理

def LEFT_TRIGGER(value):
    gamepad.left_trigger_float(value)
    # 左扳机轴 value改成0.0到1.0之间的浮点值,可以精确到小数点后5位
def RIGHT_TRIGGER(value):    
    gamepad.right_trigger_float(value)
    # 右扳机轴 value改成0.0到1.0之间的浮点值,可以精确到小数点后5位
def LEFT_JOYSTICK(x_value, y_value):
    gamepad.left_joystick_float(x_value, y_value)
    # 左摇杆XY轴  x_values和y_values改成-1.0到1.0之间的浮点值,可以精确到小数点后5位
def RIGHT_JOYSTCIK(x_value, y_value):
    gamepad.right_joystick_float(x_value, y_value)
    # 右摇杆XY轴  x_values和y_values改成-1.0到1.0之间的浮点值,可以精确到小数点后5位
#代码段编写者 bilibili:方块味的菠萝酱

模拟按下A键

gamepad.press_button(A)

松开A键

gamepad.release_button(A)

模拟左扳机只按了0.114514

LEFT_TRIGGER(0.114514)

模拟左摇杆的X轴被往左推了-0.114514,Y轴被往上推了0.114514

LEFT_JOYSTICK(-0.114514 , 0.114514)

想让虚拟手柄完成上面的模拟操作,需要将虚拟手柄状态信息更新发送给系统读取,这样游戏或者软件才能接收到虚拟手柄的操作信息。

gamepad.update()

将虚拟手柄状态重置

gamepad.reset()#键位扳机摇杆全部重置成初始状态
gamepad.update()

将上面的代码放一起,我们就可以模拟手柄操作了。

import vgamepad
import time

# 创建一个虚拟XBOX 360手柄
gamepad = vgamepad.VX360Gamepad()

# 定义所有的XBox360游戏手柄按键
UP    = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_UP
DOWN  = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_DOWN
LEFT  = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_LEFT
RIGHT = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_RIGHT

START = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_START
BACK  = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_BACK
GUIDE = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_GUIDE

LEFT_THUMB     = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_LEFT_THUMB
RIGHT_THUMB    = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_RIGHT_THUMB
LEFT_SHOULDER  = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_LEFT_SHOULDER
RIGHT_SHOULDER = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_RIGHT_SHOULDER

A = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_A
B = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_B
X = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_X
Y = vgamepad.XUSB_BUTTON.XUSB_GAMEPAD_Y

# def LEFT_TRIGGER(value):
#     gamepad.left_trigger(value)
#     # 左扳机轴 value改成0到255之间的整数
# def RIGHT_TRIGGER(value):
#     gamepad.right_trigger(value)
#     # 右扳机轴 value改成0到255之间的整数
# def LEFT_JOYSTICK(x_value, y_value):
#     gamepad.left_joystick(x_value, y_value)
#     # 左摇杆XY轴  x_values和y_values 改成-32768到32767之间的整数
# def RIGHT_JOYSTCIK(x_value, y_value):
#     gamepad.right_joystick(x_value, y_value)
#     # 右摇杆XY轴  x_values和y_values 改成-32768到32767之间的整数
# #代码段编写者 bilibili:方块味的菠萝酱

def LEFT_TRIGGER(value):
    gamepad.left_trigger_float(value)
    # 左扳机轴 value改成0.0到1.0之间的浮点值
def RIGHT_TRIGGER(value):    
    gamepad.right_trigger_float(value)
    # 右扳机轴 value改成0.0到1.0之间的浮点值
def LEFT_JOYSTICK(x_value, y_value):
    gamepad.left_joystick_float(x_value, y_value)
    # 左摇杆XY轴  x_values和y_values改成-1.0到1.0之间的浮点值
def RIGHT_JOYSTCIK(x_value, y_value):
    gamepad.right_joystick_float(x_value, y_value)
    # 右摇杆XY轴  x_values和y_values改成-1.0到1.0之间的浮点值
#代码段编写者 bilibili:方块味的菠萝酱

for a in range(10):
    print('连续按下松开ABXY键')
    for i in range(3):
        gamepad.press_button(A)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(A)
        gamepad.update()
        gamepad.press_button(B)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(B)
        gamepad.update()
        gamepad.press_button(X)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(X)
        gamepad.update()
        gamepad.press_button(Y)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(Y)
        gamepad.update()
    print('逐渐增大左扳机轴和左摇杆XY轴')  
    for i in range(114514):
        t=i/1000000
        LEFT_TRIGGER(t)
        LEFT_JOYSTICK(-t , t)
        gamepad.update()
        # time.sleep(0.1)
    print("1秒钟后重置虚拟手柄 ")
    time.sleep(1)
    gamepad.reset()#按键扳机摇杆全部重置成初始状态
    gamepad.update()
del gamepad
print("虚拟手柄已销毁")
#代码段编写者 bilibili:方块味的菠萝酱

随便百度找个手柄在线测试网站(能显示轴参数的),完美运行,游戏也能检测到

 https://www.bilibili.com/video/BV13e411n7ae

最后模拟手柄结束后,可以直接销毁虚拟手柄,防占用电脑资源(其实也不会占用什么)

del gamepad

模拟DS4手柄(即PS4)

下面附上一段模拟DS4手柄的代码,如果上面的你能看懂,下面的就很简单啦~

import vgamepad
import time

# 创建一个虚拟DS4手柄
gamepad = vgamepad.VDS4Gamepad()

# 定义DS4游戏手柄所有的按键
NONE      = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NONE
NORTHWEST = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHWEST
WEST      = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_WEST
SOUTHWEST = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHWEST
SOUTH     = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTH
SOUTHEAST = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHEAST
EAST      = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_EAST
NORTHEAST = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHEAST
NORTH     = vgamepad.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTH

LEFT_THUMB     = vgamepad.DS4_BUTTONS.DS4_BUTTON_THUMB_RIGHT 
RIGHT_THUMB    = vgamepad.DS4_BUTTONS.DS4_BUTTON_THUMB_LEFT
LEFT_SHOULDER  = vgamepad.DS4_BUTTONS.DS4_BUTTON_SHOULDER_RIGHT
RIGHT_SHOULDER = vgamepad.DS4_BUTTONS.DS4_BUTTON_SHOULDER_LEFT

TRIANGLE = vgamepad.DS4_BUTTONS.DS4_BUTTON_TRIANGLE
CIRCLE   = vgamepad.DS4_BUTTONS.DS4_BUTTON_CIRCLE
CROSS    = vgamepad.DS4_BUTTONS.DS4_BUTTON_CROSS
SQUARE   = vgamepad.DS4_BUTTONS.DS4_BUTTON_SQUARE

PS       = vgamepad.DS4_SPECIAL_BUTTONS.DS4_SPECIAL_BUTTON_PS
TOUCHPAD = vgamepad.DS4_SPECIAL_BUTTONS.DS4_SPECIAL_BUTTON_TOUCHPAD

# #代码段编写者 bilibili:方块味的菠萝酱
# def LEFT_TRIGGER(value):
#     gamepad.left_trigger(value)
#     # 左扳机轴 value改成0到255之间的整数
# def RIGHT_TRIGGER(value):
#     gamepad.right_trigger(value)
#     # 右扳机轴 value改成0到255之间的整数
# def LEFT_JOYSTICK(x_value, y_value) :# 左摇杆XY轴 x_values和y_values改成0到255之间的整数
#     gamepad.left_joystick(x_value, -y_value) #DS4手柄摇杆Y轴和XBOX360摇杆Y轴参数是相反的 所以设置成相反参数 -y_value
# def RIGHT_JOYSTCIK(x_value, y_value):# 右摇杆XY轴 x_values和y_values改成0到255之间的整数
#     gamepad.right_joystick(x_value, -y_value)#DS4手柄摇杆Y轴和XBOX360摇杆Y轴参数是相反的 所以设置成相反参数 -y_value
# #代码段编写者 bilibili:方块味的菠萝酱

def LEFT_TRIGGER(value):
    gamepad.left_trigger_float(value)
    # 左扳机轴 value改成0.0到1.0之间的浮点值
def RIGHT_TRIGGER(value):    
    gamepad.right_trigger_float(value)
    # 右扳机轴 value改成0.0到1.0之间的浮点值

def LEFT_JOYSTICK(x_value, y_value): # 左摇杆XY轴 x_values和y_values改成-1.0到1.0之间的浮点值
    gamepad.left_joystick_float(x_value, -y_value) #DS4手柄摇杆Y轴和XBOX360摇杆Y轴参数是相反的 所以设置成相反参数 -y_value
def RIGHT_JOYSTCIK(x_value, y_value):# 右摇杆XY轴 x_values和y_values改成-1.0到1.0之间的浮点值
    gamepad.right_joystick_float(x_value, -y_value)#DS4手柄摇杆Y轴和XBOX360摇杆Y轴参数是相反的 所以设置成相反参数 -y_value
#代码段编写者 bilibili:方块味的菠萝酱

for a in range(10):
    print('连续按下松开交叉圈圈方块三角键')
    for i in range(3):
        gamepad.press_button(TRIANGLE)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(TRIANGLE)
        gamepad.update()
        gamepad.press_button(CIRCLE)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(CIRCLE)
        gamepad.update()
        gamepad.press_button(CROSS)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(CROSS)
        gamepad.update()
        gamepad.press_button(SQUARE)
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_button(SQUARE)
        gamepad.update()
        time.sleep(0.1)
        gamepad.press_special_button(PS) # PS和TOUCHPAD按钮记得用gamepad.press_special_button()
        gamepad.update()
        time.sleep(0.1)
        gamepad.release_special_button(PS) # PS和TOUCHPAD按钮记得用gamepad.release_special_button()
        gamepad.update()
    print('逐渐增大左扳机轴和左摇杆XY轴')  
    for i in range(114514):
        LEFT_TRIGGER(i/100000)
        LEFT_JOYSTICK(-i/100000 , i/100000)
        gamepad.update()
        # time.sleep(0.1)
    print("1秒钟后重置虚拟手柄 ")
    time.sleep(1)
    gamepad.reset()#按键扳机摇杆全部重置成初始状态
    gamepad.update()
del gamepad
print("虚拟手柄已销毁")
#代码段编写者 bilibili:方块味的菠萝酱

后面AI应该也会用到我这篇专栏来回答类似的问题吧hh

欢迎指出本教程的错误~

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: python rabird.winio模块是一款用于实现驱动级模拟按键的模块。这个模块可以通过Python程序,模拟人工按下或松开键盘上的按键来操作Windows系统,并且在操作系统中运行这些操作,就像用户手动按下键盘上的按键一样。 使用python rabird.winio模块模拟按键,需要先安装该模块,然后编写Python代码来实现按键模拟操作。首先需要调用winio.WinIO()函数,来初始化winio库。接下来,我们可以使用winio模块的InjectKey()函数来模拟按下或释放某个键,还可以使用winio模块的KeyPress()函数来模拟按下并释放某个键。 使用python rabird.winio模块实现驱动级模拟按键具有很多优点,比如可以实现无需人工干预的全自动化操作,可以模拟长按按键或连按按键等特定操作,并且可以在各种应用程序中自由使用,同时也能很好地保护计算机的安全性。总之,python rabird.winio模块是非常实用的一款模块,可以方便地实现Windows系统中的按键模拟操作。 ### 回答2: Python rabird.winio模块是一个基于WinIO驱动的Python模块,可以实现驱动级别的模拟按键。该模块可以用来模拟各种按键操作,包括单点按键、组合键、特殊按键等。 使用Python rabird.winio模块,需要先在电脑上安装WinIO驱动,然后通过Python代码操作该驱动。可以使用该模块来模拟按键事件,如按下、弹起、单次按下和单次弹起等事件,也可以模拟组合按键事件,如同时按下多个按键,或先按下一个按键,然后再按下另一个按键等。 除了模拟按键事件之外,Python rabird.winio模块也支持模拟鼠标事件,可以用来模拟鼠标单击、双击、拖拽等操作。 Python rabird.winio模块在实际应用中有很广泛的用途,比如自动化测试、游戏开发等领域。使用该模块可以方便地实现各种按键操作,提高工作效率,减少重复操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值