tft每日頭條

 > 生活

 > 按鍵精靈識别坐标并輸出

按鍵精靈識别坐标并輸出

生活 更新时间:2024-07-26 09:14:13

金豬腳本(原飛豬腳本)以按鍵精靈教學為主,涉及UiBot,Python,Lua等腳本編程語言,教學包括全自動辦公腳本,遊戲輔助腳本,引流腳本,網頁腳本,安卓腳本,IOS腳本,注冊腳本,點贊腳本,閱讀腳本以及網賺腳本等各個領域。想制作腳本和學習按鍵精靈的朋友可以添加按鍵精靈學習交流群:554127455 學習路上不再孤單,金豬腳本伴你一同成長.

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)1

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)2

上周跟大家介紹了關于遊戲地圖的尋路方式,也以烈焰遊戲無題材向大家分享了下最簡單的尋路方法—直接輸入坐标尋路法,看過之後,想必大家對遊戲的尋路方式有了一定的認知,小編今天再跟大家分享下進階版的尋路方法,即換算地圖坐标尋路法

換算地圖坐标尋路法

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)3

神馬叫換算遊戲坐标尋路法呢?顧名思義就是遊戲地圖上顯示的坐标跟我們屏幕實際坐标不一緻,需要通過相應關系的換算才能算出地圖坐标相對于屏幕實際坐标的偏移量,然後鼠标相對偏移量點擊地圖某位置後即可自動進行尋路,聽到這裡估計大家還是不大懂,沒關系,下面小編就以神途遊戲為例子,跟大家深度解析下

遊戲地圖

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)4

圖上左上角紅色的點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

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)5

到底對不對呢,我們不妨用大漠綜合工具的浮動抓圖功能截取上面的圖片來驗證看看:

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)6

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)7

有圖有真相,事實證明小編的計算是正确的

思路流程

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)8

技術難點:

1.地圖名不一樣所對應的地圖最大X、Y坐标都不一樣

2.如何确定地圖初始點(0,0)位置,然後進行坐标換算後偏移

3.移動過程中,如何判斷人物是否已經移動到了指定坐标點,開始下一步動作

綁定窗口

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)9

今天我們寫的腳本有用到大漠插件,并且是後台的

因為是單開腳本,頂層窗口句柄就是遊戲所對應的客戶區句柄,所有用的是大漠的findwindow命令,查找符合類名或者标題名的頂層 可見窗口

後台綁定模式:

圖色模式:dx2

鼠标模式:windows

鍵盤模式:windows

關于大漠綁定模式如何獲知

請參閱相關院刊:

【院刊】-【201501期】沙盤後台綁定遊戲

判斷地圖名

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)10

遊戲左下角會顯示地圖名及坐标,由于遊戲不同的地圖對應的遊戲最大X坐标、Y坐标都是不一樣的,所以我們要先識别當前的地圖名,然後根據識别到的地圖名對最大X坐标、Y坐标進行相應賦值,由于左下角會顯示地圖名和坐标,相互之間有時會有影響,所以做了倆個字庫(坐标字庫、地圖名字庫),分開調用

打開地圖

為了避免地圖已經打開的情況

我們要先判斷地圖有沒有打開,沒有打開的話才去按Tab鍵打開地圖

因為後面我們找字的時候就是要在地圖上找字,所以我們先進行找字

沒找到字的情況下說明地圖沒打開,再按Tab鍵打開地圖

确定地圖初始點坐标

找地圖上的"複活區"字,找到後就會得到該字左上角第一點坐标(IntX,IntY)然後通過大漠工具精确抓圖獲取到地圖初始點位置(0,0)相對于"複活區" 偏移的坐标

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)11

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)12

地圖起始點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:\test")//設置全局路徑
  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:\test", "*.*"
  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:\test\dm.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

複制代碼

效果演示

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

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)6

按鍵精靈識别坐标并輸出(按鍵精靈自動尋路系列換算地圖坐标尋路法)14

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved