我的自描外挂制作日志——FPS类游戏的自瞄【优化改进1】

1,068 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

前言

  在上篇文章中已完成实验猜想,今天要工作的核心是如何优化外挂的使用,今日工作的重点主要是优化如下功能项:

1.添加是否启动&结束按钮(指定建的输入或者关闭);
2. 添加鼠标右键触发自动瞄准机制(不必要时不进行自描实现,节省系统资源);
3. 剔除输出演示图像,仅进行鼠标的位置控制。

  考虑到在实际应用自描的过程中,我们不需要自描时在图像中把人物框出来,在实际应用中其基本逻辑如下:

  1. 打开游戏,进入游戏缓冲界面;
  2. 打开外挂;
  3. 获取游戏画面
  4. 判断游戏画面中是否存在目标物
  5. 外挂判断鼠标右键是否被执行
  6. 当鼠标右键被执行的时则执行“自描”,否则不执行;
  7. 不显示绘制目标框,只控制鼠标的移动

系统实施优化

获取游戏画面:

  对游戏视频画面处理和对视频处理有一定的差异,对视频处理我们可以直接进行读取视频然而在玩游戏的时候我们需要对游戏画面进行获取,这里获取游戏画面的频率注意以下,这个频率是你使用显示器刷新频率 我们可以通过opencv, pyautogui 实现屏幕截取和处理,后面我们就可以对获取的视频画面进行检测判断了。截图代码如下:

import cv2
import numpy as np
import pyautogui

ScreenImg = pyautogui.screenshot()
ScreenImg  = cv2.cvtColor(np.array(ScreenImg ), cv2.COLOR_RGB2BGR)
cv2.imshow("ScreenImg ", ScreenImg 
cv2.waitKey(0)

右健执行自描

  在这个阶段我们已初步完成了获取游戏视频画面进行检测游戏内目标物是否存在和对目标物的中心坐标输出。考虑到一直执行目标检测和移动鼠标会耗费大量内存,以及在游戏中会有不好的体验感,这里我将做如下的优化:

  1. 对截图部分我们应当选择不显示,在使用yolo进行目标检测的时候只需要输出鼠标的位置坐标即可;
  2. 构建多线程,当右健(或其他指定按键)被执行时则执行后续的目标检测和移动鼠标。
# 检测键盘是否被按下

def on_press(key):
    global BUG
    """定义按下时候的响应,参数传入key"""
    try:
        print(f'{key.char} down')
        if key.char == '1':
            BUG = True
            print(f'{key.char} down')
    except AttributeError:
        pass


def on_release(key):
    """定义释放时候的响应"""
    global BUG
    print(f'{key} up')
    try:
        print(f'{key.char} down')
        if key.char == '1':
            BUG = False
            print(f'{key.char} down')
    except AttributeError:
        pass


# 监听写法2
def listen_key_nblock():
    # mouse.Listener()
    listener = keyboard.Listener(
        on_press=on_press, on_release=on_release
    )
    listener.start()  # 启动线程