金豬腳本(原飛豬腳本)以按鍵精靈教學為主,涉及UiBot,Python,Lua等腳本編程語言,教學包括全自動辦公腳本,遊戲輔助腳本,引流腳本,網頁腳本,安卓腳本,IOS腳本,注冊腳本,點贊腳本,閱讀腳本以及網賺腳本等各個領域。想制作腳本和學習按鍵精靈的朋友可以添加按鍵精靈學習交流群:554127455 學習路上不再孤單,金豬腳本伴你一同成長.
上周跟大家介紹了關于遊戲地圖的尋路方式,也以烈焰遊戲無題材向大家分享了下最簡單的尋路方法—直接輸入坐标尋路法,看過之後,想必大家對遊戲的尋路方式有了一定的認知,小編今天再跟大家分享下進階版的尋路方法,即換算地圖坐标尋路法
換算地圖坐标尋路法
神馬叫換算遊戲坐标尋路法呢?顧名思義就是遊戲地圖上顯示的坐标跟我們屏幕實際坐标不一緻,需要通過相應關系的換算才能算出地圖坐标相對于屏幕實際坐标的偏移量,然後鼠标相對偏移量點擊地圖某位置後即可自動進行尋路,聽到這裡估計大家還是不大懂,沒關系,下面小編就以神途遊戲為例子,跟大家深度解析下
遊戲地圖
圖上左上角紅色的點0,0為遊戲地圖的起始坐标,
右下角紅色的點為遊戲地圖的終點坐标830,690,
但是實際上我們用qq截圖功能對地圖區域進行截圖
會發現該地圖圖片的實際大小大概隻有660*415像素,
除了遊戲初始(0,0)坐标跟實際鼠标偏移坐标一緻外,
其他遊戲地圖坐标跟實際鼠标偏移坐标都是不一緻的
再進一步來講就是相對于遊戲地圖初始點坐标(0,0)來講
遊戲坐标(830,690)=實際鼠标偏移坐标(660,412)
那根據這個關系我們怎麼進行坐标換算呢
坐标換算
該遊戲地圖的大小都是660*412像素(實際是600*375,上傳到論壇變大了,為了方便對照,我們就以上面的圖片為例),那比如我們當前人物如上圖所示坐标是(258,266),遊戲地圖最大坐标是(830,690),那麼相對于遊戲地圖起始坐标(0,0)點來講,我們人物角色當前的所在位置(也就是地圖上橘黃色的點的中心位置)就應該等于:
實際偏移X坐标=int(660/830*258)=205
實際偏移Y坐标=int(412/690*266)=159
到底對不對呢,我們不妨用大漠綜合工具的浮動抓圖功能截取上面的圖片來驗證看看:
有圖有真相,事實證明小編的計算是正确的
思路流程
技術難點:
1.地圖名不一樣所對應的地圖最大X、Y坐标都不一樣
2.如何确定地圖初始點(0,0)位置,然後進行坐标換算後偏移
3.移動過程中,如何判斷人物是否已經移動到了指定坐标點,開始下一步動作
綁定窗口
今天我們寫的腳本有用到大漠插件,并且是後台的
因為是單開腳本,頂層窗口句柄就是遊戲所對應的客戶區句柄,所有用的是大漠的findwindow命令,查找符合類名或者标題名的頂層 可見窗口
後台綁定模式:
圖色模式:dx2
鼠标模式:windows
鍵盤模式:windows
關于大漠綁定模式如何獲知
請參閱相關院刊:
【院刊】-【201501期】沙盤後台綁定遊戲
判斷地圖名
遊戲左下角會顯示地圖名及坐标,由于遊戲不同的地圖對應的遊戲最大X坐标、Y坐标都是不一樣的,所以我們要先識别當前的地圖名,然後根據識别到的地圖名對最大X坐标、Y坐标進行相應賦值,由于左下角會顯示地圖名和坐标,相互之間有時會有影響,所以做了倆個字庫(坐标字庫、地圖名字庫),分開調用
打開地圖
為了避免地圖已經打開的情況
我們要先判斷地圖有沒有打開,沒有打開的話才去按Tab鍵打開地圖
因為後面我們找字的時候就是要在地圖上找字,所以我們先進行找字
沒找到字的情況下說明地圖沒打開,再按Tab鍵打開地圖
确定地圖初始點坐标
找地圖上的"複活區"字,找到後就會得到該字左上角第一點坐标(IntX,IntY)然後通過大漠工具精确抓圖獲取到地圖初始點位置(0,0)相對于"複活區" 偏移的坐标
地圖起始點X坐标=IntX-154
地圖起始點Y坐标=IntY 31
判斷尋路是否到達
這個在上一期的尋路院刊已經介紹過了,這邊就不重複說明了,具體請查看院刊:按鍵有屎以來最智能尋路系列
整體代碼
- Call 注冊大漠()
- Set dm = createobject("dm.dmsoft")//創建大漠對象
- Call 找句柄()
- Delay 100
- Call 大漠綁定()
- dm_ret = dm.SetPath("D:\test")//設置全局路徑
- dm_ret = dm.SetDict(0, "神途地圖名字庫.txt")//設置字庫為地圖名字庫為0号字庫
- dm_ret = dm.SetExactOcr(1)//設置找字方式為精确查找,避免類似字符的幹擾
- //地圖起始點X坐标=找"複活區"字-155
- //地圖起始點Y坐标=找"複活區"字 31
- Delay 1000
- Call 尋路(360, 360)
- Function 尋路(X坐标, Y坐标)
- Call 識别當前地圖名//主要作用在于給當前地圖最大X、Y坐标賦值
- dm_ret = dm.SetDict(1, "神途坐标字庫.txt")//設置坐标字庫為1号字庫
- dm_ret = dm.UseDict(1)//使用1号字庫來找字
- Call 找字
- Delay 1000
- x =int(600/地圖最大X坐标*X坐标)
- y =int(375/地圖最大Y坐标*Y坐标)
- TracePrint x
- TracePrint y
- dm.MoveTo intX-154 x,intY 31 y//相對于地圖起始點坐标進行換算後的鼠标偏移點擊
- Delay 1000
- dm.leftclick
- Do
- s = dm.Ocr(77,746,133,764, "ffffff-000000", 0.9)
- If len(s) > 0 Then
- 坐标 = split(s, ":")//分割遊戲左下角顯示的x、y坐标
- TracePrint "當前角色所在坐标為"&s
- // TracePrint cint(坐标(0))
- // TracePrint cint(坐标(1))
- If (abs(x坐标 - cint(坐标(0))) < 3) and (abs(y坐标 - cint(坐标(1))) < 3) Then //當前位置坐标與指定坐标的距離差的絕對值小于3則判斷到達指定坐标
- dm.keypress 9////按tab關閉地圖
- Call Plugin.Msg.Tips("到達指定坐标,尋路結束并關閉地圖")//托盤信息提示到達指定坐标
- Exit Do
- Else Call Plugin.Msg.Tips("尋路中!!!當前角色所在坐标為"&s) //托盤信息提示還未到達指定坐标
- End If
- End If
- Delay 500
- Loop
- End Function
- Function 找字
- Do
- dm_ret = dm.FindStrFast(0, 0, w, h, "複活區", "ffe34a-000000", 0.9, intX, intY)
- If intX >= 0 and intY >= 0 Then
- TracePrint intX
- TracePrint intY
- Exit Do
- Else
- dm.keypress 9//按tab打開地圖
- End If
- Delay 2000
- loop
- End Function
- Function 識别當前地圖名
- Do
- s = dm.Ocr(4,728,200,768, "ffffff-000000", 0.8)//識别當前地圖名
- If len(s) > 0 Then
- TracePrint s
- Select Case s
- Case "土城"//地圖名是"土城"則對當前地圖最大坐标賦值
- TracePrint "當前角色在土城"
- 地圖最大X坐标=830
- 地圖最大Y坐标 = 690
- Case "客棧一樓"//地圖名是"客棧一樓"則對當前地圖最大坐标賦值
- 地圖最大X坐标=27
- 地圖最大Y坐标 = 31
- // Case 其他···
- End Select
- Exit Do
- End If
- Delay 1000
- Loop
- End Function
- Function 找句柄
- For i = 0 To 20
- hwnd = dm.FindWindow("GAME","神途")
- Delay 2000
- If hwnd > 0 Then
- TracePrint hwnd
- dm_ret = dm.GetClientSize(hwnd,w,h) //獲取窗口客戶區大小
- TracePrint "遊戲客戶區寬度:" & w & ",高度:" & h
- dm_ret = dm.SetWindowState(hwnd, 1)
- Exit For
- Elseif i >= 20 Then MsgBox"未檢測到遊戲窗口,請确認遊戲窗口已經打開"
- End If
- Next
- End Function
- Function 注冊大漠()
- Dim i
- //釋放附件内容
- PutAttachment "D:\test", "*.*"
- Set ws = createobject("Wscript.Shell")
- For i = 0 To 20
- //注冊atl跟dm插件
- ws.run("regsvr32 atl.dll -s")
- ws.run ("regsvr32 D:\test\dm.dll -s")
- Delay 200
- Set ws = nothing
- Set dm = createobject("dm.dmsoft")
- ver = dm.ver()
- //輸出版本号
- If ver <> "" Then
- Exit For
- End If
- Next
- If i >= 20 Then
- TracePrint "大漠插件注冊失敗!"
- EndScript
- End If
- Set dm = nothing
- Delay 10
- End Function
- Function 大漠綁定
- For i = 0 To 20
- dm_ret = dm.BindWindowEx(hwnd, "dx2", "windows", "windows", "", 0)'綁定窗口
- Delay 500
- If dm_ret = 1 Then
- TracePrint "綁定窗口成功"
- Exit For
- Elseif i>=20 Then TracePrint "綁定失敗"
- End If
- Next
- End Function
- Sub OnScriptExit()//解綁大漠
- dm_ret = dm.UnBindWindow()
- End Sub
複制代碼
效果演示
由于遊戲窗口裡錄制的視頻太大了,壓縮後還是上傳不了,還是隻能用代碼演示了
,