• 记一次尝试用脚本模拟手柄打游戏(一)


    最近打游戏累了
    想自动化打游戏
    最开始是打算模拟键鼠方案的,但是吧,很快就遇到了问题。
    对于常规的窗口来讲,ctypes库足以模拟键鼠输入了
    但是进到第三人称视角的游戏里面吧,键盘模拟还好说,鼠标移动他视角不动啊
    这就很令人头疼了。
    我又检测了一下鼠标的位置,发现鼠标的坐标其实一直锁定在窗口的正中心。
    也就是说游戏检测鼠标移动来调整视角是不能通过脚本让鼠标向某个坐标移动来实现的。
    可能可以从更底层的驱动来模拟鼠标运动进而实现这个操作,但是我决定何不用一个更简单的方法——模拟手柄。

    自动化手柄操作

    vjoy

    网上搜了一下,第一个考虑用的vjoy
    python需要用的库是pyvjoy
    当然还需要搭配一个测试工具来看我设置手柄对不对
    测试工具

    import pyvjoy
    MAX_VJOY = 32767
    
    j = pyvjoy.VJoyDevice(1)
    for i in range(0x1,0x8000):
        
        j.set_axis(pyvjoy.HID_USAGE_X, i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行后发现

    Unable to load vJoy SDK DLL.  Ensure that vJoyInterface.dll is present
    
    • 1

    回去看github页面发现
    Currently vJoyInterface.dll is looked for inside the pyvjoy directory only so place the desired version of that file there to use. (Note: this library currently only works with the x86 dll!)
    也就是说需要把dll放在pyvjoy的目录下,注意是pyvjoy的目录下,不是新写的代码的目录下。
    在这里插入图片描述
    此时再运行刚才的代码,可以在测试工具中看到摇杆的移动
    在这里插入图片描述
    进入一下debug模式,让他停在这里

    打开steam的控制器页面可以看到已经检测到了vjoy手柄
    在这里插入图片描述
    在这里插入图片描述
    通过set_axis可以让steam把摇杆识别出来。看来问题不大

    但是啊,这个时候我就又遇到问题了,那就是vjoy这玩意他只有一个摇杆啊,我要设置右摇杆怎么办呢?
    呜。。。
    好像还是有解决办法,但是秉着不要重复造轮子的思想,毕竟时间有限每天还要正经工作还要打游戏,于是我又去找有没有什么直接模拟XBOX360或者XBOX ones手柄的方法,反正你得给我来个XINPUT对吧。

    然后我就发现了一个东西,vgamepad

    vgamepad

    vgamepad是用来模拟XBox360 gamepad的,说明文档也比长久不更新的pyvjoy详细很多。
    当然了,这个东西只支持windows。
    如果你和我一样尝试在mac上通过pip安装,就会出现下面的情况。
    在这里插入图片描述
    windows就好说了,安装好然后重启。(他会自动给你安装viGem的,然后要求你重启)

    我们打开一个xbox控制器测试软件来试试看。

    在这里插入图片描述
    最开始是没插手柄的,然后我们创建一个手柄

    import vgamepad as vg
    
    gamepad = vg.VX360Gamepad()
    
    gamepad.press_button(button=vg.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_LEFT)  # press the left hat button
    
    gamepad.update()  # send the updated state to the computer
    
    # (...) A and left hat are pressed...
    
    gamepad.release_button(button=vg.XUSB_BUTTON.XUSB_GAMEPAD_A)  # release the A button
    
    gamepad.update()  # send the updated state to the computer
    
    # (...) left hat is still pressed...
    while 1:
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    脚本结束后这个设备会被拔出,然后就检测不到手柄了。
    目前看来这个手柄的方案应该能用。

  • 相关阅读:
    ArrayList 和 Vector,LinkedList
    NestJs和Vite使用monorepo管理项目中,需要使用共享的文件夹步骤
    机器学习 | MATLAB实现支持向量机分类ClassificationSVM参数设定
    maven的安装即案例
    3GPP R17连接态省电特性
    JAVA - 项目启动后执行定时任务
    反射内存卡驱动的安装
    Estimator::relativePose
    设计模式java版本阅读笔记 一结构型
    MindSpore版本问题:1.1版本下的报错,在1.0版本并未报错,求解
  • 原文地址:https://blog.csdn.net/kzz6991/article/details/126701950