由來之前想給手游寫一套很牛逼的自動化控制腳本,能夠?qū)崿F(xiàn)自動領(lǐng)任務(wù),自動尋路,找怪,打怪。。。以前一直用按鍵精靈寫簡單的游戲腳本,但是按鍵精靈底層不夠穩(wěn)定,經(jīng)常死掉無響應(yīng),而且按鍵精靈網(wǎng)絡(luò)通信基本等于殘廢。于是我決定自己從輪子開始開發(fā)。 大致架構(gòu)首先,領(lǐng)任務(wù),找怪。。。這些肯定得用上文字識別,在尋找很久后,最終用了cnocr 這個項目使用了TensorFlow,基于MXNet網(wǎng)絡(luò)訓(xùn)練,并且部署及其簡單。在識別率和速度上面都完全滿足游戲腳本開發(fā),我將其用django包裹成了restapi以供腳本調(diào)用。 屏幕監(jiān)控方面,使用的android的錄屏實(shí)現(xiàn),屏幕每次從新渲染都會更新記錄到內(nèi)存,因此有些低配手機(jī)可能會卡頓。但是如果不保存每次的屏幕可能會造成找圖慢和找圖延遲(按鍵精靈就是這樣)。 模擬點(diǎn)擊和輸入,為了實(shí)現(xiàn)這個我花了很多時間,我反編譯了按鍵精靈,看了他的實(shí)現(xiàn),也在網(wǎng)上找了很多別人的實(shí)現(xiàn)。但是都沒有找到合適的方法。最終,我使用了android的Instrumentation實(shí)現(xiàn)。使用了xposed的hook功能, 攔截修改了系統(tǒng)權(quán)限檢測函數(shù),從而實(shí)現(xiàn)全局的按鍵點(diǎn)擊。 找圖功能,我第一想法是引入opencv,使用opencv的模板匹配來找圖,但是實(shí)際使用發(fā)現(xiàn)opencv太大了,用在這里不太適合。于是我自己實(shí)現(xiàn)了一個找圖功能(其實(shí)相當(dāng)于按鍵精靈的多點(diǎn)找色)。出于性能的考慮,沒有實(shí)現(xiàn)圖片匹配功能, 其實(shí)按鍵精靈也是滑動窗口的方法找圖的,性能并不好,另外實(shí)際游戲腳本開發(fā)中找圖并不好用,各種屏幕尺寸會造成各種適配問題。為此得每種屏幕都做截圖,非常麻煩。 到這里,整個項目基本功能都實(shí)現(xiàn)了,但是!嘗試進(jìn)行腳本開發(fā)后發(fā)現(xiàn)使用java代碼開發(fā)很不方便,每次改動都得重新編譯安裝,安裝過程中游戲會處于后臺,可能被殺死。于是我引入了lua腳本到程序中,使用lua腳本來控制程序。 從而每次改動只需要重新推lua腳本到手機(jī)上,然后就能重新運(yùn)行測試。 引入lua腳本參考了Android-Lua項目。 引入lua腳本后,我把常用的幾個功能寫成了lua的全局函數(shù),注入到了lua運(yùn)行時中,在lua腳本中可以直接調(diào)用。 目前支持函數(shù):1.Lua語言提供的自帶函數(shù),有哪些請參考Lua官網(wǎng) 2.找圖函數(shù) findMulPoint(string t)
和按鍵精靈的多點(diǎn)找圖相似,前4個數(shù)字表示需要查找的區(qū)域(左上到右下),后面一個是顏色的第一個坐標(biāo),再后面是顏色和第一個顏色的偏移位置+顏色的色值。提示,這個多點(diǎn)找色特征值可以使用按鍵精靈的工具制作(刪掉最后的顏色偏差),也可以使用我提供的python腳本制作,但是我的工具很簡陋。 3.日志輸出loge(string log)
輸出錯誤日志。使用的android Log.e輸入,因此,你需要連接adb才能看到錯誤輸出。 4.單行文字識別singeLineOcr(int x1,int y1,int x2,int y2)
識別一個區(qū)域(參數(shù)為左上到右下的坐標(biāo))內(nèi)的文字,這個文字必須是單行的(其實(shí)可以支持多行,但是我不需要,沒有實(shí)現(xiàn))。 5.暫停sleep(int i)
使腳本停止i毫秒 6.觸摸屏幕某個點(diǎn)tap(int x,int y)
點(diǎn)擊屏幕(x,y)坐標(biāo) 到此。大喊一聲,真tm完美!終于,把輪子造完了。我可以開始開發(fā)我的手游程序了。但是,輪子造完我已經(jīng)不想玩以前那手游了。emmmmmm,我這里把我造的輪子開源出來吧,有需要的老哥自取。(滑稽) |
|