我是靠谱客的博主 苗条蚂蚁,最近开发中收集的这篇文章主要介绍P-1.4.4 A_1_OWwg 1/25报告——OW自瞄的简易实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、A_1_OWwg 1/25报告:
由于守望先锋非训练模式不允许截图
需要寻找解决方法:

1.想到可以直接从显存提取数据
前天,由于语文不好以为OpenGL可以用于截图
昨天试图寻找从DirectX提取数据的方法
今天凌晨:
发现想要实现深层次的功能还是得要用C语言

发现fraps软件可以用dll注入+api拦截的方式进行截图,成功截到了OW的游戏图像

寻找类似fraps的开源软件找到OBS软件。OBS可以用dll注入+api拦截的方式进行截图(这个功能是基于C语言并且开源的),成功获得OW的游戏图像。

总结,这两天花了大量的时间在这个问题上,不知道值得不值得,不知道应不应该学会放弃。

二、OW自瞄的简易实现

简易指的是:由于我不会使用C语言,所以我将直接对OBS进行浅层次的利用。

即使不对这个开源软件进行定制,OBS也是一个相对灵活的软件。我可以比较自由地调整它输出图像在其UI中的大小,位置等。

OBS配置方式如下:
1.窗口始终置顶
这里写图片描述

2.捕捉游戏进程
这里写图片描述

3.将窗口置于右下角(用windows的MouseKey功能来微调),显示一个300x300的窗口(调整OBS使屏幕中心300x300的区域1:1地映射到这个300x300的窗口中)
这里写图片描述

自瞄实现:
直接使用P-1.4.3的代码,将搜索区域修改至屏幕最右下角的300x300区域就可以了。(1/25守望先锋更新后默认的血条颜色变成了RGB:(186,0,19),所以程序检索的颜RGB值也应该改变)

代码如下(详细注释见P-1.4.3):

#OWwg-beta-2
from math import pi,asin
from time import sleep,time
import win32api,win32con,win32gui,win32ui
e=1
ke=(2000*1/303)**(1/e-1)#函数的系数应该用 像素→角度映射来做
f= lambda x:(ke*x)**e if x >=0 else -(-ke*x)**e
hwnd=0
x=0
y=0
xs=1920
ys=1080
x0=xs/2
y0=ys/2
nx=0
ny=0
i=0
while 1==1:
ni=0
flag=0
ki=0
hwndDC=win32gui.GetWindowDC(0)
mfcDC=win32ui.CreateDCFromHandle(hwndDC)
saveDC=mfcDC.CreateCompatibleDC()
saveBitMap=win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC,300,300)
saveDC.SelectObject(saveBitMap)
saveDC.BitBlt((0,0), (300, 300), mfcDC, (1615,780), win32con.SRCCOPY)#此处修改了检索的起始位置
data=saveBitMap.GetBitmapBits()
while flag == 0:
try:
ni=data[ki:].index(19)
ki=ki+ni
if ki%4==0 and data[ki+1]==0 and data[ki+2]==-70:#此处改变了检索的颜色 
flag=1
x=(ki/4)%300+810+60
y=(ki/4)//300+390+50#这里修改了偏移量
else:
ki=ki+1
except:
x,y=960,540
flag=1
#↓partA
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hwndDC)
win32gui.DeleteObject(saveBitMap.GetHandle())
#↑partA,经过实验,partA是必要的,否则在运行一段时间后程序会报告无法创建某‘DC’
ax=xs-x
ay=xs-(y+0.5*(xs-ys))
b=xs/((2)**0.5)
cx=(ax**2+b**2-((2)**0.5)*ax*b)**0.5
xt=45-360*(asin(ax*(2)**0.5/(2*cx))/(2*pi))
cy=(ay**2+b**2-((2)**0.5)*ay*b)**0.5
yt=45-360*(asin(ay*(2)**0.5/(2*cy))/(2*pi))#x一圈3636像素 y一圈3600像素

nx=round(f(xt*2727/(360*1.5*3.51)))
ny=round(yt*2700/(360*1.5*3.51))
win32api.mouse_event(win32con.MOUSEEVENTF_MOVE,nx,ny)

OWwg-beta-2存在的问题:
1.实现方式简易(短时间内难以解决,但并不迫切)
2.函数f仍未优化
3.找色方式仍未优化,在复杂的游戏环境中效率较低

2.12.18备注:
1.找色部方法得到了优化(详见1.4.3备注)
2.OW新春更新后可以直接截图,不需要OBS辅助了

最后

以上就是苗条蚂蚁为你收集整理的P-1.4.4 A_1_OWwg 1/25报告——OW自瞄的简易实现的全部内容,希望文章能够帮你解决P-1.4.4 A_1_OWwg 1/25报告——OW自瞄的简易实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部