1. 程式人生 > >P-1.4.1 嘗試實現OW的自動瞄準

P-1.4.1 嘗試實現OW的自動瞄準

想法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中使用的數學方法,可獲得角度值

相關推薦

P-1.4.3 Python實現OW自動瞄準的起與落

起 在逐漸捨棄Pyuserinput與PIL模組並使用pywin32來截圖與操作後,我的程式成功地達到了每秒59次的執行次數 以下的程式碼已經有了基本的實用價值 from math import pi,asin#載入數學符號 import win32a

P-1.4.1 嘗試實現OW自動瞄準

想法1: 1)用P-1.4的功能尋找螢幕中與血條RGB值相同的點,並獲得它的座標 2)用P-1.3.1的功能使滑鼠拖動到該點 3)迴圈 存在的問題:第一步成功執行,但第二步的問題在於FPS遊戲槍口朝向與螢幕的平面座標無關,P-1.3.1的拖動功能不起作用

1.計算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值2.實現陣列中值的交換

#include <stdio.h> #include<math.h> int main(){ int i=0; for (i = 0; i < 101; i++){ if (i % 2 == 0){ printf("%d\n",

c語言:求多項式1-1/2+1/3-1/4+...+1/99-1/100的值,3種迴圈實現

方法一:for迴圈實現 程式: #include<stdio.h> int main() { double i = 0, t = 0,sum = 0,sign = -1; for (i =

spring boot 2.1.4 快取 Hazelcast實現(四)

hazelcast.xml檔案可以拆分成多個,並且在hazelcast.xml檔案中預設可以從系統配置項讀取配置屬性,這裡轉成在s

spring boot 2.1.4 快取 Hazelcast實現(三)

Hazelcast官方提供了監控包,下載路徑https://hazelcast.org/download/ 裡面有Hazelca

Spring Cloud實戰 | 第十篇 :Spring Cloud + Seata 1.4.1 + Nacos1.4.0 整合實現微服務架構中逃不掉的話題分散式事務

Seata分散式事務線上體驗地址: [www.youlai.store](http://www.youlai.store) ![](https://i.loli.net/2021/01/14/ACcKBaGte5s7Wy9.png) 本篇完整原始碼地址:https://github.com/hxrui/y

用for和while循環求e的值[e=1+1/1!+1/2!+1/3!+1/4!+1/5!+...+1/n!]

主函數 int class urn log emp art print tracking /*編敲代碼,依據下面公式求e的值。要求用兩種方法計算: 1)for循環。計算前50項 2)while循環,直至最後一項的值小於10-4 e=1+1/1!+1/2!+1/

Spark SQL and DataFrame Guide(1.4.1)——之DataFrames

ati been -m displays txt -a 版本 ava form Spark SQL是處理結構化數據的Spark模塊。它提供了DataFrames這樣的編程抽象。同一時候也能夠作為分布式SQL查詢引擎使用。 DataFrames D

偶數求1/2+1/4+...+1/n奇數1/1+1/3+...+1/n

exti blank blog pan targe ava href spa tin 題目:編寫一個函數,輸入n為偶數時,調用函數求1/2+1/4+...+1/n,當輸入n為奇數時,調用函數1/1+1/3+...+1/n Scanner scanner

計算1/1-1/2+1/3-1/4+1/5+……+1/99-1/100的值

看到這個式子首先總結規律: 1.每一項都是分數 2.分子都為1,分母依次遞增至100 3.分母的奇數項為正,偶數項為負 思路: 1.定義一個sum 2.建立一個迴圈,再判斷是否是奇數,如果是奇數往sum上加,否則(偶數)往sum上減 3.列印sum 程式碼如下: #include <s

易學筆記-計算機底層-第1章:計算機系統漫遊/1.4 處理器處理記憶體中的指令/1.4.1 系統的硬體組成

系統的硬體組成 示意圖: 匯流排: 第6章 系統配置與效能評價/6.3 輸入輸出系統/6.3.2 匯流排 概念:電晶體,負責在各個部件間傳遞資訊 被設計成傳遞定長的位元組快,比如4個位元組或者8個位元組,也就是32位或者64位 I

python筆記(1.4-1.5)

1.4 函式的變數區域性變數和全域性變數 Python中的任何變數都有特定的作用域 在函式中定義的變數一般只能在該函式內部使用,這些只能在程式的特定部分使用的變數我們稱之為區域性變數 在一個檔案頂部定義的變數可以供檔案中的任何函式呼叫,這些可以為整個程式所使用的變數稱為全域性變數 glo

C語言——兩種方法計算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值

方法一:首先我們先觀察這個數學式子的規律,可以發現奇數項均為正數,偶數項均為負數。則我們可以利用條件語句if來判斷奇偶,最後分別對奇數項和偶數項求和。 原始碼: #include<stdio.h> #include<stdlib.h> int main() {

pow函式(數學次方)在c語言的用法,兩種編寫方法例項( 計算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值)

關於c語言裡面pow函式,下面借鑑了某位博主的一篇文章: 標頭檔案:#include <math.h> pow() 函式用來求 x 的 y 次冪(次方),x、y及函式值都是double型 ,其原型為:    double pow(double x, double y

計算1/1-1/2+1/3-1/4+1/5······+1/99-1/100的值

#include <stdio.h> #include <stdlib.h> void main() { int i, n; double num = 0.0, sum = 0.0; for (i = 1; i <= 100;i++ ) { if (i%2=

計算1/1-1/2+1/3-1/4+.....1/99-1/100的值

#include<stdio.h> #include<stdlib.h> main() { int i = 1; double a=0; for (i = 1.; i < 101; i++) { if (i % 2 == 1) { a = a

計算1/1-1/2+1/3-1/4+1/5 …… + 1/99

分析: 將式子拆分成兩部分:正數相加部分、負數相加部分。利用for迴圈分別求得第一部分和第二部分之和,再將兩個和相減。 #include <stdio.h> #include <stdlib.h> double add(double a, dou

noip初賽整理1.4 & 1.5(軟體系統和語言)

計算機軟體系統                                                                          軟體系統                                  系統軟體      

躺雨沒的學習筆記(3)——藍芽概述 (1.3&1.4&1.5)AMP概述&術語命名&總結

Agenda: 1.3 AMP操作概述 Alternate MAC/PHYs (AMP)是藍芽核心系統的次要控制器(secondary Controllers)。BR/EDR的主要控制器用作搜尋,配對,連線建立,連線維持。當兩個BR