Ai实现FPS游戏自动瞄准 yolov5fps自瞄

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Ai实现FPS游戏自动瞄准 yolov5fps自瞄

Ai实现FPS游戏自动瞄准 yolov5fps自瞄

今天来分享一个Yolov5 FPS跟枪的源码解析和原理讲解。代码比较粗糙 各位有什么优化的方式可以留言指出,可以一起交流学习。

需要了解的东西和可能会遇到的问题
1.xy坐标点与当前鼠标的xy坐标点距离计算

2.获取窗口句柄,本文使用的是根据窗口名称获取句柄

3.推理方式:本文使用的是GPU(为啥呢?速度快噻,因为我3060显卡噻~)。

4.屏幕宽高获取和敌人坐标获取和计算哪个是最近的敌人并控制鼠标去敌人身上和头上。(为什么说是身体和头部呢,因为还有一个方式,就是只需要敌人身体坐标就可以计算得出敌人头部坐标)干货噢~

5.还有鼠标按键状态获取。

正文开始吧,我们就从头开始代码解析吧。
先来一个两个xy坐标的距离计算

class Point():

def __init__(self, x1, y1, x2, y2):
    self.x1 = x1
    self.y1 = y1
    self.x2 = x2
    self.y2 = y2

class Line(Point):

def __init__(self, x1, y1, x2, y2):
    super().__init__(x1, y1, x2, y2)

def getlen(self):
    changdu = math.sqrt(math.pow((self.x1 - self.x2), 2) + math.pow((self.y1 - self.y2), 2))
    return changdu

上面这段代码的使用方式如下

L1 = Line(x1, y1, x2, y2) #传入两个xy坐标
L1.getlen() #return出两个坐标点的直线距离

接下来直接上全代码解析 各位可以把类和方法分离出去

这里是导入依赖,需要这些库

import math
import sys
import time

import torch
import win32api
import win32con
import win32gui
from PyQt5.QtWidgets import QApplication
from pynput.mouse import Controller
import mouse

这里这俩class就是文章上面说的那个传入两个坐标点,计算直线距离的

class Point():

def __init__(self, x1, y1, x2, y2):
    self.x1 = x1
    self.y1 = y1
    self.x2 = x2
    self.y2 = y2

class Line(Point):

def __init__(self, x1, y1, x2, y2):
    super().__init__(x1, y1, x2, y2)

def getlen(self):
    changdu = math.sqrt(math.pow((self.x1 - self.x2), 2) + math.pow((self.y1 - self.y2), 2))
    return changdu

第一步:我们获取到某FPS游戏的窗口句柄

hwnd = win32gui.FindWindow(None, "穿越火线")

这个方法是获取上面句柄窗口的窗口截图,用的是PyQt截图,有速度更快更好的方式的话可以换上

截图完毕后保存在根目录的cfbg.bmp文件

def screen_record():

app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()
img.save("cfbg.bmp")

这里就是调用我们那yolo模型来进行推理啦,我设置的是cuda,也就是英伟达的GPU,因为cpu太慢了。

如果自己的不能使用GPU推理的话把下面这两行改改,改成cpu的就可以了。

device = torch.device("cuda")
model = torch.hub.load('F:/yolov5-master', 'custom', 'F:/yolov5-master/yolov5n6.pt',

                   source='local', force_reload=False)  # 加载本地模型

这里是定义屏幕宽高[其实这俩就是游戏所对应的分辨率,比如:游戏里19201080这里就是19201080]

game_width = 1024
game_height = 768

这边就是开始实时进行游戏窗口推理了

无限循环 -> 截取屏幕 -> 推理模型获取到每个敌人坐标 -> 计算每个敌人中心坐标 -> 挑选距离准星最近的敌人 -> 如果左键是按下状态则控制鼠标移动到敌人的身体或者头部(本文计算方式是移动到头部)

while True:

# 截取屏幕
screen_record()
# 使用模型
model = model.to(device)
img = 'cfbg.bmp' 
# 开始推理
results = model(img)
# 过滤模型
xmins = results.pandas().xyxy[0]['xmin']
ymins = results.pandas().xyxy[0]['ymin']
xmaxs = results.pandas().xyxy[0]['xmax']
ymaxs = results.pandas().xyxy[0]['ymax']
class_list = results.pandas().xyxy[0]['class']
confidences = results.pandas().xyxy[0]['confidence']
newlist = []
for xmin, ymin, xmax, ymax, classitem, conf in zip(xmins, ymins, xmaxs, ymaxs, class_list, confidences):
    if classitem == 0 and conf > 0.5:
        newlist.append([int(xmin), int(ymin), int(xmax), int(ymax), conf])
# 循环遍历每个敌人的坐标信息传入距离计算方法获取每个敌人距离鼠标的距离
if len(newlist) > 0:
    # 存放距离数据
    cdList = []
    xyList = []
    for listItem in newlist:
        # 当前遍历的人物中心坐标
        xindex = int(listItem[2] - (listItem[2] - listItem[0]) / 2)
        yindex = int(listItem[3] - (listItem[3] - listItem[1]) / 2)
        mouseModal = Controller()
        x, y = mouseModal.position
        L1 = Line(x, y, xindex, yindex)
        # 获取到距离并且存放在cdList集合中
        cdList.append(int(L1.getlen()))
        xyList.append([xindex, yindex, listItem[0], listItem[1], listItem[2], listItem[3]])
    # 这里就得到了距离最近的敌人位置了
    minCD = min(cdList)
    # 如果敌人距离鼠标坐标小于150则自动进行瞄准,这里可以改大改小,小的话跟枪会显得自然些
    if minCD < 150:
        for cdItem, xyItem in zip(cdList, xyList):
            if cdItem == minCD:
                # 锁头算法:使用win32api获取左键按下状态,如果按下则开始自动跟枪
                if win32api.GetAsyncKeyState(0x01):
                    # 控制鼠标移动到某个点:看不懂计算方式的话看文章下面讲解吧O(∩_∩)O
                    win32api.mouse_event(win32con.MOUSEEVENTF_MOVE, int(xyItem[0] - game_width // 2),int(xyItem[1] - (game_height - (xyItem[3] - xyItem[5])) // 2), 0, 0)
                break

好了,我们来讲解下这行代码
win32api.mouse_event(鼠标行为:这里用的是MOVE相对移动, x坐标,y坐标, 0, 0)
第一个参数,先设定鼠标的行为:使用相对移动,为什么不用绝对移动呢,因为绝对移动在游戏里是无效的
第二个参数,x轴相对移动的距离:敌人x坐标 - (屏幕宽度 / 2)
第三个参数,y轴相对移动的距离:敌人y坐标 - (屏幕高度 - (敌人最大y坐标 - 敌人最小y坐标) / 2)
第一第二个参数相对来说比较好理解,但是可能有人对于第三个y的相对移动的计算方式有点懵,我画了个图,希望可以看明白。

实例图 图比较简陋 勿喷

在其他fps游戏,我们只需要修改窗口名称参数和分辨率参数即可。

以上就是Yolov5 FPS跟枪的源码解析和原理讲解了 感谢大家支持

目录
相关文章
|
6月前
|
人工智能 自然语言处理 文字识别
DeepMind首发游戏AI智能体SIMA:开启虚拟世界的智能探索之旅
【4月更文挑战第3天】DeepMind推出了SIMA,一种能在多个3D环境中执行语言指令的智能体,标志着AI在理解和互动虚拟世界上的进步。SIMA通过多样化的训练数据学习导航、操作、决策等技能,并结合预训练模型处理高维度输入输出。尽管在复杂任务上仍有提升空间,SIMA展现了正向迁移能力和潜力,为AI研究和未来机器人技术铺平道路。然而,仍需解决鲁棒性、可控性、评估方法及道德安全问题。
128 4
DeepMind首发游戏AI智能体SIMA:开启虚拟世界的智能探索之旅
|
6月前
|
人工智能 NoSQL 安全
MongoDB观点:让生成式AI成为业务增长的新动能,游戏公司可以这样做
游戏公司采用检索增强生成(RAG)技术,如MongoDB Atlas Vector Search,以提高AI输出的准确性和定制化服务。通过灵活的文档数据库如MongoDB Atlas,企业能更好地集成AI,确保数据安全并抓住创新机遇。ChatGPT标志着AI时代的转折点,游戏公司凭借大量数据优势,有望在这一变革中引领行业发展。
2976 3
|
2月前
|
机器学习/深度学习 人工智能 开发者
谷歌推世界首个AI游戏引擎,2000亿游戏产业恐颠覆!0代码生成游戏,老黄预言成真
【9月更文挑战第22天】谷歌近日推出的AI游戏引擎GameNGen,作为全球首款神经模型驱动的游戏引擎,引发了广泛关注。该引擎使用户无需编写代码即可生成游戏,并实现了与复杂环境的实时交互,显著提升了模拟质量。在单TPU上,GameNGen能以超20帧/秒的速度流畅模拟经典游戏《DOOM》。这项技术不仅简化了游戏开发流程,降低了成本,还为游戏设计带来了更多可能性。然而,它也可能改变游戏产业的商业模式和创意多样性。无论如何,GameNGen标志着游戏开发领域的一次重大革新。
39 2
|
6月前
|
人工智能 自然语言处理 IDE
被 AI 写的游戏代码砸中是什么感觉 | 10 分钟打造你的超级 AI 编码助手
被 AI 写的游戏代码砸中是什么感觉 | 10 分钟打造你的超级 AI 编码助手
|
4月前
|
人工智能 搜索推荐 开发者
AI驱动的游戏设计:创造更智能、更沉浸的游戏体验
【7月更文第31天】人工智能(AI)技术正在深刻地改变游戏行业,不仅为游戏设计师提供了创造更丰富、更动态游戏世界的工具,也为玩家带来了更加个性化和沉浸式的体验。本文将探讨AI在游戏设计中的应用案例,并展示一些具体的实现方法。
419 2
|
5月前
|
人工智能 图形学
【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏2(附项目源码)
【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏2(附项目源码)
76 1
【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏2(附项目源码)
|
4月前
|
人工智能 搜索推荐
影视与游戏行业AI视频制作实战:第二步,为角色生成个性化语音
每个角色有自己的性格、形象,那也一定需要自己个性化的声音。
|
5月前
|
人工智能 图形学
【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏1(附项目源码)
【制作100个unity游戏之24】unity制作一个3D动物AI生态系统游戏1(附项目源码)
65 2
|
4月前
|
人工智能 编解码 数据可视化
影视与游戏行业AI视频制作实战:第一步,角色形象设计的一致性
随着生成式人工智能技术的发展和应用,影视与游戏行业也迎来了AI化的时代。
|
5月前
|
机器学习/深度学习 人工智能 分布式计算
构建基于AI的游戏AI系统:技术详解与实现
【6月更文挑战第4天】本文探讨了构建基于AI的游戏AI系统的详细过程,包括技术选型(如机器学习、深度学习、强化学习)、系统设计(感知层、决策层和执行层)、实现步骤(数据收集、模型训练、评估与优化)和优化策略(实时更新、多代理协同、迁移学习、持续学习)。通过合理选择技术和策略,可以创建高性能、适应性强的游戏AI系统,提升游戏体验并推动创新。