赞
踩
本篇分享PUBG自动识别+压枪宏实现的完整思路,同样的思路可套用在其他FPS游戏上,开发语言使用Python3.9。
项目完整代码见:https://github.com/Cjy-CN/PUBGRecognizeAndGunpress
自动压枪简单的理解就是控制鼠标下移。但是,鼠标下移量的多少却是多方面因素的共同影响结果,以PUBG(绝地求生)为例,每一发子弹射出时的后座,除了每把枪的弹道表,还与枪械配件(倍镜、握把、枪托)、射击时的人物姿势(站、蹲、趴)、开火状态(全自动、连发、单发)相关联。因此,要实现压枪的需求,就必须解决背包中的配枪、配件识别,按下开火键时的人物姿势、开火模式识别,最后才是如何调用硬件驱动以实现游戏内鼠标指针下移操作。
由于绝地求生屏蔽了硬件驱动外的其他鼠标输入,因此我们无法直接通过py脚本来控制游戏内鼠标操作。为了实现游戏内的鼠标下移,我使用了罗技鼠标的驱动(ghub),而py通过调用ghub的链接库文件,将指令操作传递给ghub,最终实现使用硬件驱动的鼠标指令输入给游戏,从而绕过游戏的鼠标输入限制。值得一提的是,我们只是通过py代码调用链接库的接口将指令传递给罗技驱动的,跟实际使用的是何种鼠标没有关系,所以即便用户使用的是雷蛇、卓威、双飞燕等鼠标,对下面的代码并无任何影响。
【本章节代码对应项目中ghub.py模块】
罗技驱动使用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('缺少文件')
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模块】
这里我使用的钩子是Pynput,其他可使用的库还有Pyhook3
由于我们只需要对绝地求生这个窗口进行监听,而不是想在任何界面都去让我们的鼠标在按下左键时自动下移,因此还引入win32gui进行当前窗口的判断。
from pynput
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。