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)。
相關推薦
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