FPS游戏自动枪械识别+压枪(以PUBG为例)

FPS游戏自动枪械识别+压枪(以PUBG为例)



前言

本篇分享PUBG自动识别+压枪宏实现的完整思路,同样的思路可套用在其他FPS游戏上,开发语言使用Python3.9。
项目完整代码见:https://github.com/Cjy-CN/PUBGRecognizeAndGunpress


一、明确压枪宏的功能需求

自动压枪简单的理解就是控制鼠标下移。但是,鼠标下移量的多少却是多方面因素的共同影响结果,以PUBG(绝地求生)为例,每一发子弹射出时的后座,除了每把枪的弹道表,还与枪械配件(倍镜、握把、枪托)、射击时的人物姿势(站、蹲、趴)、开火状态(全自动、连发、单发)相关联。因此,要实现压枪的需求,就必须解决背包中的配枪、配件识别,按下开火键时的人物姿势、开火模式识别,最后才是如何调用硬件驱动以实现游戏内鼠标指针下移操作。

二、实现游戏内的鼠标指针下移

由于绝地求生屏蔽了硬件驱动外的其他鼠标输入,因此我们无法直接通过py脚本来控制游戏内鼠标操作。为了实现游戏内的鼠标下移,我使用了罗技鼠标的驱动(ghub),而py通过调用ghub的链接库文件,将指令操作传递给ghub,最终实现使用硬件驱动的鼠标指令输入给游戏,从而绕过游戏的鼠标输入限制。值得一提的是,我们只是通过py代码调用链接库的接口将指令传递给罗技驱动的,跟实际使用的是何种鼠标没有关系,所以即便用户使用的是雷蛇、卓威、双飞燕等鼠标,对下面的代码并无任何影响。
【本章节代码对应项目中ghub.py模块】

1.驱动安装和链接库的加载

罗技驱动使用LGS_9.02.65_X64(请自行找资源安装,官网新版罗技驱动没找到对应的链接库文件),链接库文件在项目链接里面可以找到。下面是载入链接库的代码。

try:
    gm = CDLL(r'./ghub_device.dll')
    gmok = gm.device_open() == 1
    if not gmok:
        print('未安装ghub或者lgs驱动!!!')
    else:
        print('初始化成功!')
except FileNotFoundError:
    print('缺少文件')

2.通过罗技驱动控制键鼠

demo代码如下:

#按下鼠标按键
def press_mouse_button(button):
    if gmok:
        gm.mouse_down(button)

#松开鼠标按键
def release_mouse_button(button):
    if gmok:
        gm.mouse_up(button)

#点击鼠标
def click_mouse_button(button):
    press_mouse_button(button)
    release_mouse_button(button)

#按下键盘按键
def press_key(code):
    if gmok:
        gm.key_down(code)

#松开键盘按键
def release_key(code):
    if gmok:
        gm.key_up(code)

#点击键盘按键
def click_key(code):
    press_key(code)
    release_key(code)

# 鼠标移动
def mouse_xy(x, y, abs_move = False):
    if gmok:
        gm.moveR(int(x), int(y), abs_move)

鼠标移动的函数中,xy就是移动的横纵距离。
鼠标点击函数中,传入参数1,2,3分别代表鼠标左、中、右键
键盘按键函数中,传入的参数采用的是键盘按键对应的键码


三、实现键盘、鼠标监听

前面说到,要实现压枪就要对各种配件、状态做出识别。那么在写识别的函数之前,我们先要解决的是何时识别的问题。如果识别使用多线程\多进程的一直持续检测,无疑是一种巨大的开销,因此就需要对键盘、鼠标的状态进行监听。只有按下特定按键时,才触发特定相应的识别请求。
【本章节代码对应项目中monitor.py模块】

1、引入库

这里我使用的钩子是Pynput,其他可使用的库还有Pyhook3
由于我们只需要对绝地求生这个窗口进行监听,而不是想在任何界面都去让我们的鼠标在按下左键时自动下移,因此还引入win32gui进行当前窗口的判断。

from pynput import mouse,keyboard
from win32gui import GetWindowText, GetForegroundWindow

2、键盘监听

在PUBG中,Tab键是打开背包,因此键盘对应检测Tab键。代码都很浅显。只有以下需要注意

  • Listener中绑定on_press和on_release的函数( on_key_press、on_key_release),它们返回False的时候是结束监听,下文鼠标监听的函数同理,所以不要随便返回False
  • 键盘的特殊按键采用keyboard.Key.tab这种写法,普通按键用keyboard.KeyCode.from_char(‘c’)这种写法
def start_key_listen(dict):
    
    def on_key_press(key):
        nonlocal dict
        if 
评论 76
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值