当前位置: 首页 > 工具软件 > Ow > 使用案例 >

P-1.4.1 尝试实现OW的自动瞄准

韶硕
2023-12-01

想法1:
1)用P-1.4的功能寻找屏幕中与血条RGB值相同的点,并获得它的坐标
2)用P-1.3.1的功能使鼠标拖动到该点
3)循环

存在的问题:第一步成功执行,但第二步的问题在于FPS游戏枪口朝向与屏幕的平面坐标无关,P-1.3.1的拖动功能不起作用

想法2:
1)用P-1.4的功能寻找屏幕中与血条RGB值相同的点,并获得它的坐标
2)只使用P-1.3.1的指向功能,获取鼠标移动到目的坐标需要的平面单位方向向量
3)使用PyKeyboard操控”键盘控制鼠标软件”模拟鼠标的拖动,以单位方向方向移动一个微小的距离(目的坐标较远时移动的距离可以适当加大1

4)循环

存在的问题:所有步骤成功执行,鼠标也能准确地逼近目标位置,但是第一步的耗时太长,导致鼠标移动极其缓慢,改变遍历的步长与搜索的范围也是效果不好,还不治本。

想法3:
通过实验得到鼠标位移一个像素后游戏人物转动的角度
在需要瞄准的时候执行:
1)用P-1.4的功能寻找屏幕中与血条RGB值相同的点,并获得它的坐标
2)在已知屏幕的二维坐标与视角的情况下(在OW等游戏中视角是可调的,视角本身也是可测的2),使用平面几何方法,求出游戏人物在三维空间中需要转动的角度值,并将角度值转化为鼠标需要移动的方向与像素数
3)使用PyKeyboard操控”键盘控制鼠标软件”按已知的方向与像素数模拟鼠标的拖动

存在的问题:预想的功能:在需要瞄准时通过按键触发,准星立刻调转至目标位置
现实的功能:在需要瞄准时通过按键触发,准星短暂延迟后调转至目标位置(依旧是步骤一导致的延迟)

加入循环后的代码

from PIL.ImageGrab import grab
from math import pi,asin
from pykeyboard import PyKeyboard
from time import sleep
pkb=PyKeyboard()
#non0= lambda x:1/1e99 if x==0 else x
keyx= lambda x:6 if x>0 else 4 if x<0 else 7
keyy= lambda x:5 if x>0 else 8 if x<0 else 7

xs=1920
ys=1080
x0=xs/2
y0=ys/2
while 1==1:
    im=grab((0,0,xs,ys))
    pix=list(im.getdata())
    try:
        n=pix.index((255,0,19))
    except:
        x=xs/2
        y=ys/2
    else:
        x=n%xs#+偏移量
        y=n//xs#+偏移量


    ax=xs-x
    ay=xs-(y+420)
    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(xt*3636/360)#此处得xt与yt函数可以简化
    ny=round(yt*3600/360)#round后误差仅在1像素即0.1度左右,是可以接受的误差
    pkb.tap_key(pkb.numpad_keys[keyx(nx)],n=abs(nx))
    pkb.tap_key(pkb.numpad_keys[keyy(ny)],n=abs(ny))

总结:由于全屏找图功能无法很好地实现,使用Python实现OW自动瞄准的尝试再次被搁置了,但是这次尝试让我收获了很多经验与编码技巧,所以还是很有意义的。
1/14日批注:
想法4:
1)目标较远时使用‘想法3’的数学方法一次移动方向到目标位置附近
2)从目标在中距离开始,执行优化的‘想法2’方法
3)优化的‘想法2’方法:
1.假设目标平滑移动没有瞬移:
2.以目标与准星距离为依据,不断缩小截图区域,并不断跟踪目标,最终缩小到血条面积(130*15左右)甚至更小。此时检索频率极高
3.若丢失目标(如目标瞬移,玩家鼠标移动等),则执行1)。


  1. 用凸指数函数实现即可
  2. 寻找游戏中的一个参照物,套用想法3中使用的数学方法,可获得角度值
 类似资料: