金豬腳本(原飛豬腳本)以按鍵精靈教學爲主,涉及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

判斷尋路是否到達

這個在上一期的尋路院刊已經介紹過了,這邊就不重複說明了,具體請查看院刊:按鍵有屎以來最智能尋路系列

整體代碼

  1. Call 註冊大漠()
  2. Set dm = createobject("dm.dmsoft")//創建大漠對象
  3. Call 找句柄()
  4. Delay 100
  5. Call 大漠綁定()
  6. dm_ret = dm.SetPath("D: est")//設置全局路徑
  7. dm_ret = dm.SetDict(0, "神途地圖名字庫.txt")//設置字庫爲地圖名字庫爲0號字庫
  8. dm_ret = dm.SetExactOcr(1)//設置找字方式爲精確查找,避免類似字符的干擾
  9. //地圖起始點X座標=找"復活區"字-155
  10. //地圖起始點Y座標=找"復活區"字+31
  11. Delay 1000
  12. Call 尋路(360, 360)
  13. Function 尋路(X座標, Y座標)
  14. Call 識別當前地圖名//主要作用在於給當前地圖最大X、Y座標賦值
  15. dm_ret = dm.SetDict(1, "神途座標字庫.txt")//設置座標字庫爲1號字庫
  16. dm_ret = dm.UseDict(1)//使用1號字庫來找字
  17. Call 找字
  18. Delay 1000
  19. x =int(600/地圖最大X座標*X座標)
  20. y =int(375/地圖最大Y座標*Y座標)
  21. TracePrint x
  22. TracePrint y
  23. dm.MoveTo intX-154+x,intY+31+y//相對於地圖起始點座標進行換算後的鼠標偏移點擊
  24. Delay 1000
  25. dm.leftclick
  26. Do
  27. s = dm.Ocr(77,746,133,764, "ffffff-000000", 0.9)
  28. If len(s) > 0 Then
  29. 座標 = split(s, ":")//分割遊戲左下角顯示的x、y座標
  30. TracePrint "當前角色所在座標爲"&s
  31. // TracePrint cint(座標(0))
  32. // TracePrint cint(座標(1))
  33. If (abs(x座標 - cint(座標(0))) < 3) and (abs(y座標 - cint(座標(1))) < 3) Then //當前位置座標與指定座標的距離差的絕對值小於3則判斷到達指定座標
  34. dm.keypress 9////按tab關閉地圖
  35. Call Plugin.Msg.Tips("到達指定座標,尋路結束並關閉地圖")//托盤信息提示到達指定座標
  36. Exit Do
  37. Else Call Plugin.Msg.Tips("尋路中!!!當前角色所在座標爲"&s) //托盤信息提示還未到達指定座標
  38. End If
  39. End If
  40. Delay 500
  41. Loop
  42. End Function
  43. Function 找字
  44. Do
  45. dm_ret = dm.FindStrFast(0, 0, w, h, "復活區", "ffe34a-000000", 0.9, intX, intY)
  46. If intX >= 0 and intY >= 0 Then
  47. TracePrint intX
  48. TracePrint intY
  49. Exit Do
  50. Else
  51. dm.keypress 9//按tab打開地圖
  52. End If
  53. Delay 2000
  54. loop
  55. End Function
  56. Function 識別當前地圖名
  57. Do
  58. s = dm.Ocr(4,728,200,768, "ffffff-000000", 0.8)//識別當前地圖名
  59. If len(s) > 0 Then
  60. TracePrint s
  61. Select Case s
  62. Case "土城"//地圖名是"土城"則對當前地圖最大座標賦值
  63. TracePrint "當前角色在土城"
  64. 地圖最大X座標=830
  65. 地圖最大Y座標 = 690
  66. Case "客棧一樓"//地圖名是"客棧一樓"則對當前地圖最大座標賦值
  67. 地圖最大X座標=27
  68. 地圖最大Y座標 = 31
  69. // Case 其他···
  70. End Select
  71. Exit Do
  72. End If
  73. Delay 1000
  74. Loop
  75. End Function
  76. Function 找句柄
  77. For i = 0 To 20
  78. hwnd = dm.FindWindow("GAME","神途")
  79. Delay 2000
  80. If hwnd > 0 Then
  81. TracePrint hwnd
  82. dm_ret = dm.GetClientSize(hwnd,w,h) //獲取窗口客戶區大小
  83. TracePrint "遊戲客戶區寬度:" & w & ",高度:" & h
  84. dm_ret = dm.SetWindowState(hwnd, 1)
  85. Exit For
  86. Elseif i >= 20 Then MsgBox"未檢測到遊戲窗口,請確認遊戲窗口已經打開"
  87. End If
  88. Next
  89. End Function
  90. Function 註冊大漠()
  91. Dim i
  92. //釋放附件內容
  93. PutAttachment "D: est", "*.*"
  94. Set ws = createobject("Wscript.Shell")
  95. For i = 0 To 20
  96. //註冊atl跟dm插件
  97. ws.run("regsvr32 atl.dll -s")
  98. ws.run ("regsvr32 D: estdm.dll -s")
  99. Delay 200
  100. Set ws = nothing
  101. Set dm = createobject("dm.dmsoft")
  102. ver = dm.ver()
  103. //輸出版本號
  104. If ver <> "" Then
  105. Exit For
  106. End If
  107. Next
  108. If i >= 20 Then
  109. TracePrint "大漠插件註冊失敗!"
  110. EndScript
  111. End If
  112. Set dm = nothing
  113. Delay 10
  114. End Function
  115. Function 大漠綁定
  116. For i = 0 To 20
  117. dm_ret = dm.BindWindowEx(hwnd, "dx2", "windows", "windows", "", 0)'綁定窗口
  118. Delay 500
  119. If dm_ret = 1 Then
  120. TracePrint "綁定窗口成功"
  121. Exit For
  122. Elseif i>=20 Then TracePrint "綁定失敗"
  123. End If
  124. Next
  125. End Function
  126. Sub OnScriptExit()//解綁大漠
  127. dm_ret = dm.UnBindWindow()
  128. End Sub

複製代碼

效果演示

由於遊戲窗口裏錄製的視頻太大了,壓縮後還是上傳不了,還是隻能用代碼演示了

按鍵精靈自動尋路系列換算地圖座標尋路法


按鍵精靈自動尋路系列換算地圖座標尋路法


相關文章