1. 程式人生 > >P-1.4.3 Python實現OW自動瞄準的起與落

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

在逐漸捨棄Pyuserinput與PIL模組並使用pywin32來截圖與操作後,我的程式成功地達到了每秒59次的執行次數
以下的程式碼已經有了基本的實用價值

from math import pi,asin#載入數學符號
import win32api,win32con,win32gui,win32ui#載入pywin32模組,pywin32有許多功能,是windows提供的介面,追求效率或追求控制更深層的系統功能的話,這是值得學習的
e=1#改變函式f的彎曲方向,f是一個指數函式(e小於1時是凸函式)
ke=(1*2000/303)**(1/e-1)#函式f的係數,(2000/33)決定了對於函式f當指標與目標相距50畫素時f(x)=x,(這是一個指數函式,畫張圖就非常明白了)。2000/33前的係數(1)用於妥善增大或減小50這個值
f= lambda x:(ke*x)**e if x >=0 else -(-ke*x)**e#這是一個‘指數函式’,只是在x小於0時它的影象是對稱於x大於0時的影象的。 hwnd=0#目標視窗的控制代碼,0是全屏 x=0 y=0#為x,y設定一個初始值 xs=1920#xs,ys代表視窗大小 ys=1080#由於程式碼多次修改,並沒有做到只要修改xs、ys就能使程式匹配新的視窗大小,還需做很多調整 x0=xs/2 y0=ys/2#x0,y0是視窗的中點 nx=0 ny=0#為x0,y0設定一個初始值 while 1==1: ni=0 flag=0 ki=0#以上三個資料用於重啟找色部 #截圖部
hwndDC=win32gui.GetWindowDC(0) mfcDC=win32ui.CreateDCFromHandle(hwndDC) saveDC=mfcDC.CreateCompatibleDC() saveBitMap=win32ui.CreateBitmap()#以下幾行均是在這個bitmap中作畫的程式碼 saveBitMap.CreateCompatibleBitmap(mfcDC,300,300)#檢測範圍可以再大點嗎 saveDC.SelectObject(saveBitMap) saveDC.BitBlt((0, 0), (300
, 300), mfcDC, (810,390), win32con.SRCCOPY) #第一個二元數對是畫作左上角在bitmap中的位置,第二個是畫作與畫作源的大小,第三個是畫作源左上角在螢幕中的位置 data=saveBitMap.GetBitmapBits() #獲取bitmap中每個點的R.G.B.alpha值構成的一個元組(順序是G.B.R.alpha)。已知的影象大小的情況下,這個有序元組結合二維空間中每一個點的色彩值資訊 #saveDC.DeleteDC() #mfcDC.DeleteDC() #win32gui.ReleaseDC(hwnd, hwndDC) #win32gui.DeleteObject(saveBitMap.GetHandle()) #輸出data後便可清空截圖的快取。由於未系統學習win32,原理不明。耗時極短。作為可選項 #耗時小於0.0005s/100次 #找色部 while flag == 0: try:#其實這種遍歷方式我也不是很喜歡,所以問:是否可以一次只取第一個19,不符合就直接返回未找到?←決定其,我可以在找到合適的函式後看一看這個遍歷起到了多大的作用,共佔用了多少的時間,最長佔用多少時間。 #目前的感受是,在測試中找色部沒有影響程式的流暢感。 #完成於凌晨4點,無法正常思考所以實現方式冗雜。尚未改進(便不作太多註釋了),但似乎沒有太大影響。 ni=data[ki:].index(19) # ki=ki+ni if ki%4==0 and data[ki+1]==0 and data[ki+2]==-1: #此處的if也可以精簡 flag=1 x=(ki/4)%300+810+50 y=(ki/4)//300+390+75 else: ki=ki+1 except: x,y=960,540 flag=1 #此時,輸出了x,y #計算部 #將x,y轉化為滑鼠需要移動的畫素數與方向 #基本思想是在已知視角為90度且通過實驗得到滑鼠移動1畫素在某靈敏度下[角度→畫素]的關係的情況下,將目標在螢幕x軸上的比值轉化為偏移角度,再將角度轉化為滑鼠需要移動的方向與畫素數,y軸同理 #可以簡化,但本身用時極少 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))#OW 20靈敏度下,x一圈2727畫素 y一圈2700畫素 nx=round(f(xt*2727/(360*2*3.51)))#round後誤差僅在1畫素即0.1度左右,是可以接受的誤差 #分母(小,大)→速度(快,慢),過頭程度(高,較低),建議y軸過頭少x速度快 ny=round(yt*2700/(360*2*3.51))#nx與ny的分母已經過除錯(理論上2可減小到1.5),使得過頭程度幾乎為0,在這個基礎上可以改變函式f或者分母的係數來調整nx與ny的大小 #操作部 #使用win32api的mouse event才能模擬滑鼠拖動而不是重新設定滑鼠位置。後一個方法是不能操作FPS遊戲的。 win32api.mouse_event(win32con.MOUSEEVENTF_MOVE,nx,ny) #迴圈

在決定使用pywin32截圖之前,我嘗試過開啟PIL.ImageGrab的module檔案並檢視.grab()的原始碼,發現其包含了很多我用不上的命令,刪去後程式獲得了略微的提速。在希望加快程式執行速度又因為技術限制無法自己用低階語言實現的時候,不妨開啟函式的module檔案,看看能不能刪掉一點無關的指令。

在OW的訓練模式中,程式有了出色的表現,59的幀率非常流暢。但是在PVE甚至PVP中,OW似乎刻意地不允許截圖(進入PVE、PVP後才會出現狀況),無論視窗化、無邊框還是全屏截圖結果只有OW視窗為黑色。
這應該涉及到了Overlay Surfaces相關的問題。

下面這位網友解釋得比較全面準確,當然也有可能是因為OW對窗體設定了IsScreenCaptureEnabled屬性
網友觀點

解決方案一:使用HDMI採集卡直接採集顯示器的資料並返回到我的程式中。
解決方案二:想辦法獲取Overlay Surfaces中的影象資料(或使用別的截圖方式)

不管哪種解決方案,win32的截圖方式似乎在OW這款遊戲中是起不到作用了,但是P-1.4.x的實踐讓我收穫了許多寶貴的經驗與方法。

2.12.18備註:
1.OW新春更新後可以直接截圖了
2.改進了找色部的方法

#找色部
try:

        ni=data.index(19)#先快速檢索 


        if ni%4==0 and data[ni+1]==0 and data[ni+2]==-1: 

            x=(ni/4)%300+810+60
            y=(ni/4)//300+390+50#這裡修改了偏移量

        else:#若第一個快速檢索結果不符合要求

            try:#則使用精確檢索,佔用約0.02s,使瞬間幀率降低為30幀,可以接受。
                dat=np.array(data)#將陣列轉為np陣列
                dat=dat.reshape(90000,4)#reshape陣列
                ni=np.where((dat==[19,0,-1,-1]).all(1)==True)[0][0]
                #np陣列==a 這個指令返回一個布林值組成的陣列,若a是一個數,則np陣列的每一個元素被替換為布林值,若a是一個順序從0~n陣列,則二維np陣列每一行的數從0~n地一一與陣列中的第0~n個數進行比較並用布林值替換
                #np陣列.all(),若np陣列元素全為True則返回True反之返回False;括號中輸入1則按行比較,並分別返回T/F,輸入0則按列比較,並分別返回T/F
                #np.where([email protected],c,d),a是一個np陣列,@是<、>、==、!=等比較符號中的一種,c是用來替代輸出中True的元素,d是用來替代輸出中False的元素。c與d為空時,這個函式返回a中滿足[email protected]關係的元素在a中的座標。c與d不為空時,這個函式返回一個c代表T,d代表F的陣列,這個陣列將體現每一個a中的元素是否滿足[email protected]關係
                x=ni%300+810+60 #此時的ni是90000個畫素中的位置,所以不需要除以4
                y=ni//300+390+50

            except:
                x,y=960,540#若精確搜尋也無結果,則輸出這樣的xy
#此時,輸出了x,y

相關推薦

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的拖動功能不起作用

ios拒審4.3 python自動生成辣雞程式碼

配置檔案config.json [ { "key" : "jiebabuyuxiniubuyu", "add_func_num" :1, "lua_in_path":"../../../..", "lua_out_p

構建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x註入的後臺管理系統(66)-MVC WebApi 用戶驗證 (2)

簡單 權限管理 mark 調用接口 cat pps 總結 回顧 bsp 前言: 構建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x註入的後臺管理系統(65)-MVC WebApi 用戶驗證 (1) 回顧上一節,我們利用w

十、cent OS開啟APR模式報錯:configure: error: Found APR 1.3.9. You need version 1.4.3 or newer installed

config 安裝目錄 prefix org col spa -a you 新版 錯誤內容顯示APR的版本過低,需要新版本 到http://apr.apache.org/download.cgi#apr1這個地址下載所需要的包apr-1.4.5.tar.gz apr-ic

程序員的自我救贖---1.4.3: 核心框架講解(MVC)

登錄頁面 就會 技術 virtual mon status pan gpu aac 《前言》 《目錄》 (一) Winner2.0 框架基礎分析 (二) 短信中心 (三)SSO單點登錄 (四)PLSQL報表系統 (五)錢包系統 (六)GPU支付中心 (七)權

Spring Data JPA中文文檔[1.4.3] PDF

repos itl class rda pdf spring ims com main 下載地址:網盤下載 1.使用 Spring Data Repositories Spring Data Repository的存在,是為了把你從大量重復、繁雜的數據庫層操作中解放出來。

1.4.3 編寫自己的模塊和包

python腳本 1.4 for 模塊導入 AD pri 模塊名 模塊 包含   Python程序除了可以直接運行,還可以作為模塊導入並使用其中的對象。通過__name__屬性可以識別程序的使用方式。每個Python腳本在運行時都有一個__name__屬性,如果腳本作為模塊

利用Python實現導彈自動追蹤!室友面前的裝逼利器!史上最詳細!

技術 取數 跟隨鼠標 構造 制作 思想 室友 相同 精確 不好意思 ,上傳錯了。接著看圖! 由於待會要用pygame演示,他的坐標系是y軸向下,所以這裏我們也用y向下的坐標系。 算法總的思想就是根據上圖,把時間t分割成足夠小的片段(比如1/1000,

python實現mongo自動新增地圖索引, 自動修正遇到的問題

mongo新增地圖索引時常會遇到兩個問題: 座標點衝突和座標點重合, 所以之前寫了個指令碼解決一下, 主要思路就是:當新增地圖索引報錯時, 根據error資訊,判斷座標點衝突or 座標點重合的地方, 根據正則修正座標點, 然後通過遞迴or迴圈的方式, 重新嘗試, 程式碼如下: -*- coding: ut

python實現mongo自動添加地圖索引, 自動修正遇到的問題

elif 兩個 刪除 fin create creat con int cati mongo添加地圖索引時常會遇到兩個問題: 坐標點沖突和坐標點重合, 所以之前寫了個腳本解決一下, 主要思路就是:當添加地圖索引報錯時, 根據error信息,判斷坐標點沖突or 坐標點重合的

python自然語言處理——1.4 回到python:決策和控制

ott thead top linear 控制 san max-width eight 技術分享 微信公眾號:數據運營人本系列為博主的讀書學習筆記,如需轉載請註明出處。 第一章 語言處理與python 1.4 回到python:決策和控制條件對每個元素進行操作嵌套

(telegram自動拉人實現python對於telegram開發交流分享 python 實現telegram自動拉人進群

可氣的是上篇文章被舉報了=這次不賣自動拉人軟體啦! 實習在公司開發用python實現telegram(電報群)自動拉人進群--分享心得 當時做了自動註冊 爬取最近兩天登入使用者 telegram自動拉人 機器人管理。。。。一路艱辛----- 給大家推薦非常良心的開源專案 

python 實現 jumpserver 自動登入

現在很多團隊都在使用 jumpserver(http://www.jumpserver.org/ )作為跳板機,管理伺服器許可權,一些對安全要求比較高的團隊還會加上 Google authenticator (Google 身份驗證器)。 但是安全和方便就是蹺蹺

使用Spring Data 倉庫工作 4.1-4.3

 譯者:Edenpan 原文連線 Spring Data 倉庫抽象的目標是為了明顯減少為了各種持久儲存的來實現的資料訪問層的樣板程式碼量。 Spring Data儲存庫文件和你的模組 本章解釋了Spring Data 儲存庫的核心觀念,以及介面。本章的資訊來自Spring Data公共模組。它使用了Jav

《HttpClient官方文件》4.1-4.3 HTTP驗證

原文連結  譯者:edenpan 4 HTTP 驗證 httpClient 對根據HTTP 標準規則制定的許可權驗證方案,以及很多不標準但廣泛使用的驗證方案,比如:NTML和SPNEGO提供完全的支援。 4.1 使用者憑證 任何一個使用者驗證程式需要一系列的憑證資訊用來確認使用者身份。最簡單的使用者憑證就

網頁文字編輯器UEditor.1.4.3 jsp使用配置

網頁文字編輯器UEditor.1.4.3 jsp使用配置 由於專案需要文字編輯的功能,研究了百度ueditor編輯器,實現線上富文字的編輯和圖片檔案的上傳。 首先需要配置好jsp開發的基本環境,即jee-eclipse(IDE)、JRE、Tomcat(JSP伺服器),網上資

UEditor (JSP 1.4.3版本) 整合到ssh框架中

     通過以上配置,ueditor基本上就可以使用了。 二:圖片顯示問題 1,如果ueditor圖片上傳失敗,提示“未找到上傳資料”    這時要檢查專案的jar包,刪除common-io-1.4.jar 即可上傳成功 2,如果ueditor圖片上傳成功,但是顯示不出來    這個問題就是讀取圖片

[LeetCode]1.TwoSum(Python實現

1.題目描述 給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nu

4.4.3 python 字串雙指標/雜湊演算法3 —— Minimum Window Substring & Smallest Range

這一節兩道題頗有難度,hard層次的, 可謂需要對雙指標和雜湊二者理解十分透徹,當然了,一些特定的處理技巧也是很重要的。這兩道題比較思想比較接近,建議認真研讀,弄清這一類問題。 76. Minimum Window Substring Given a string S and a