• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

返回列表 12345678» / 9
发新话题 回复该主题

[昨夜星辰] 【实战+源码+思路】网游CQ查找物品真实坐标 [复制链接]

1#
在没有快捷拾取的游戏中,我们一般会选择查找物品的图片和文字,然后通过键盘按键或者鼠标点击逐渐靠近物品进行拾取操作。但是无论找字还是找图,它返回的都是屏幕坐标,而不是游戏内的真实坐标,这样会导致如果遇到障碍或者物品名字较长的情况会无法到达或位置跑偏。今天我们要说的就是,如何利用人物真实坐标,来转换物品的真实坐标,有了真实坐标,人物就可以准确地到达指定坐标。

思路:
以本游戏为例,人物脚下物品屏幕坐标为510, 280, 557, 292,物品与物品之间的屏幕坐标x间隔为48,物品与物品之间的屏幕坐标y间隔为32。以人物当前屏幕坐标为起点,人物周围1格内物品的左、上、右、下、左上、右上、左下、右下的屏幕坐标分别为(- 1 * x间隔 , 0 * y间隔)、(0 * x间隔, - 1 * y间隔 )、(1 * x间隔, 0 * y间隔)、(0 * x间隔, 1 * y间隔 )、(- 1 * x间隔 , - 1 * y间隔 )、(1 * x间隔, - 1 * y间隔 )、(- 1 * x间隔 , 1 * y间隔)、(1 * x间隔, 1 * y隔)。对应的以人物当前真实坐标为起点,物品的真实坐标分别为(- 1 , 0)、(0, - 1 )、(1, 0)、(0, 1 )、(- 1 , - 1 )、(1, - 1 )、(- 1 , 1)、(1, 1)。以此类推,想要获取人物周围N格内的物品的坐标,只需要将1换成N,即可通过人物屏幕坐标、真实坐标转换物品屏幕坐标、真实坐标。

坐标示意图:


查找演示图:


调试代码:
  1. Dim 排序前,排序后
  2. 排序前 = 查找人物周围的物品位置(723, 312, 8, "恶魔|长袍|龙纹|心灵|手镯|灯笼|项链|生命|骑士|灵魂|幽灵|手套|战衣|骷髅|头盔|天珠|战神|盔甲|记忆|三眼|铂金|戒指", "ffffff|00ff00")
  3. 排序后 = 坐标排序(723, 312, 排序前)
  4. TracePrint "排序前:" & 排序前
  5. TracePrint "排序后:" & 排序后
复制代码
调试结果:
排序前:
铂金戒指,723,312|幽灵手套,723,310|龙纹,723,306|骷髅头盔,725,312|骑士手镯,722,310|灯笼项链,722,308|生命项链,721,309|心灵手镯,721,308|魔长袍,721,306|灵战衣,719,310|灵魂项链,724,310|骑士手镯,725,308|三眼手镯,728,311|天珠项链,721,314|神盔甲,725,316|记忆头盔,727,314
排序后:
铂金戒指,723,312|幽灵手套,723,310|骷髅头盔,725,312|骑士手镯,722,310|灵魂项链,724,310|天珠项链,721,314|灯笼项链,722,308|生命项链,721,309|龙纹,723,306|心灵手镯,721,308|灵战衣,719,310|骑士手镯,725,308|三眼手镯,728,311|神盔甲,725,316|记忆头盔,727,314|魔长袍,721,306


源码:
  1. Public Declare Function SetDllPathW Lib ".\plugin\dmreg.dll" Alias "SetDllPathW" (ByVal path As String, ByVal mode As Long) As Long
  2. Dim 脚本ID, 脚本文件存放路径
  3. 脚本ID = GetMacroID()
  4. 脚本文件存放路径 = "C:\查找物品真实坐标\" & 脚本ID & "\"
  5. Call 创建文件夹Ex(脚本文件存放路径)
  6. Call 释放文件
  7. Call 注册大漠插件到系统
  8. Call 创建大漠对象
  9. Call 设置大漠相对路径(脚本文件存放路径)
  10. Dim 排序前,排序后
  11. 排序前 = 查找人物周围的物品位置(723, 312, 8, "恶魔|长袍|龙纹|心灵|手镯|灯笼|项链|生命|骑士|灵魂|幽灵|手套|战衣|骷髅|头盔|天珠|战神|盔甲|记忆|三眼|铂金|戒指", "ffffff|00ff00")
  12. 排序后 = 坐标排序(723, 312, 排序前)
  13. TracePrint "排序前:" & 排序前
  14. TracePrint "排序后:" & 排序后
  15. Function 查找人物周围的物品位置(人物当前x坐标,人物当前y坐标,范围, 物品名称, 物品颜色)
  16. 查找人物周围的物品位置 = ""
  17. If 范围 < 1 Then
  18. Exit Function
  19. End If
  20. Call dm.SetDict(0,"物品字库.txt")
  21. Dim font_desc, count, i
  22. font_desc = dm.GetDictInfo(Replace(物品名称, "|", ""), "宋体", 9, 0)
  23. font_desc = split(font_desc,"|")
  24. count = ubound(font_desc)
  25. for i = 0 to count
  26. dm.AddDict 0, font_desc(i)
  27. Next
  28. dm_ret = dm.SetDisplayInput("pic:原始图片.bmp")
  29. Dim x1, y1, x2, y2, px, py, 区域
  30. Dim 初始范围, x间隔, y间隔, 方向, k, 偏移方向数组, 偏移方向数组最大下标
  31. x间隔 = 48
  32. y间隔 = 32
  33. 初始范围 = Array(510, 280, 557, 292)
  34. 偏移方向数组 = Array(Array(- 1 , 0), Array(0, - 1 ), Array(1, 0), Array(0, 1 ), Array(- 1 , - 1 ), Array(1, - 1 ), Array(- 1 , 1), Array(1, 1))
  35. 偏移方向数组最大下标 = 7
  36. Dim x偏移数值, y偏移数值, 当前范围
  37. Dim x范围, y范围
  38. Dim 识别结果, 物品名称数组
  39. 物品名称数组 = Split(物品名称, "|")
  40. 识别结果 = dm.Ocr(初始范围(0),初始范围(1),初始范围(2),初始范围(3), 物品颜色, 1.0)
  41. If 识别结果 <> "" Then
  42. If 判断物品名称是否匹配(物品名称数组, 识别结果) = 1 Then
  43. 查找人物周围的物品位置 = 查找人物周围的物品位置 & 识别结果 & "," & (人物当前x坐标 + x偏移数值 * 偏移方向数组(k)(0)) & "," & (人物当前y坐标 + y偏移数值 * 偏移方向数组(k)(1)) & "|"
  44. End If
  45. End If
  46. For k = 0 To 偏移方向数组最大下标
  47. If 偏移方向数组(k)(0) = 0 Then
  48. x范围 = 1
  49. Else
  50. x范围 = 范围
  51. End If
  52. If 偏移方向数组(k)(1) = 0 Then
  53. y范围 = 1
  54. Else
  55. y范围 = 范围
  56. End If
  57. For x偏移数值 = 1 To x范围
  58. For y偏移数值 = 1 To y范围
  59. x1 = 初始范围(0) + x偏移数值 * 偏移方向数组(k)(0) * x间隔
  60. y1 = 初始范围(1) + y偏移数值 * 偏移方向数组(k)(1) * y间隔
  61. x2 = 初始范围(2) + x偏移数值 * 偏移方向数组(k)(0) * x间隔
  62. y2 = 初始范围(3) + y偏移数值 * 偏移方向数组(k)(1) * y间隔
  63. 当前范围 = x1 & "," & y1 & "," & x2 & "," & y2
  64. If InStr(区域, 当前范围) = 0 Then
  65. 区域 = 区域 & "|" & 当前范围
  66. 识别结果 = dm.Ocr(x1, y1, x2, y2, 物品颜色, 1.0)
  67. If 识别结果 <> "" Then
  68. If 判断物品名称是否匹配(物品名称数组, 识别结果) = 1 Then
  69. 查找人物周围的物品位置 = 查找人物周围的物品位置 & 识别结果 & "," & (人物当前x坐标 + x偏移数值 * 偏移方向数组(k)(0)) & "," & (人物当前y坐标 + y偏移数值 * 偏移方向数组(k)(1)) & "|"
  70. End If
  71. End If
  72. End If
  73. Next
  74. Next
  75. Next
  76. If 查找人物周围的物品位置 <> "" Then
  77. 查找人物周围的物品位置 = Left(查找人物周围的物品位置, Len(查找人物周围的物品位置) - 1)
  78. End If
  79. End Function
  80. Function 坐标排序(x, y, str)
  81. If str = "" Then
  82. 坐标排序 = ""
  83. Exit Function
  84. End If
  85. Dim a, b, temp, 原始数组, UBound_原始数组
  86. 原始数组 = Split(str, "|")
  87. UBound_原始数组 = UBound(原始数组)
  88. Dim sz1, sz2
  89. For a = 0 To UBound_原始数组 - 1
  90. For b = 0 To UBound_原始数组 - 1 - a
  91. sz1 = Split(原始数组(b), ",")
  92. sz2 = Split(原始数组(b + 1), ",")
  93. If Abs(CLng(sz1(1)) - x) + Abs(CLng(sz1(2)) - y) > Abs(CLng(sz2(1)) - x) + Abs(CLng(sz2(2)) - y) Then
  94. temp = 原始数组(b)
  95. 原始数组(b) = 原始数组(b + 1)
  96. 原始数组(b + 1) = temp
  97. End If
  98. Next
  99. Next
  100. 坐标排序 = Join(原始数组, "|")
  101. End Function
  102. Function 判断物品名称是否匹配(arr, str)
  103. 判断物品名称是否匹配 = 0
  104. Dim U_arr
  105. U_arr = Ubound(arr)
  106. For i = 0 To U_arr
  107. If InStr(str, arr(i)) > 0 Then
  108. 判断物品名称是否匹配 = 1
  109. Exit For
  110. End If
  111. Next
  112. End Function
  113. Sub 释放文件
  114. PutAttachment 脚本文件存放路径, "*.*"
  115. PutAttachment ".\plugin", "dmreg.dll"
  116. End Sub
  117. Sub 创建大漠对象
  118. Set dm = createobject("dm.dmsoft")
  119. End Sub
  120. Sub 设置大漠相对路径(路径)
  121. dm_ret = dm.SetPath(路径)
  122. End Sub
  123. Sub 注册大漠插件到系统()
  124. Dim ver, need_ver
  125. need_ver="3.1233"
  126. Call SetDllPathW(脚本文件存放路径 & "dm.dll", 0)
  127. Set dm = createobject("dm.dmsoft")
  128. ver = dm.ver()
  129. If ver = "" Then
  130. MessageBox "插件对象创建失败!"
  131. ElseIf ver <> need_ver Then
  132. MessageBox "插件版本错误,当前使用的版本是:" & ver & ",插件所在目录是:" & dm.GetBasePath()
  133. End If
  134. End Sub
  135. Sub 创建文件夹Ex(路径)
  136. Dim 当前路径
  137. If 获取路径基本名称(路径) <> "" Then
  138. 当前路径 = 路径
  139. 路径 = 获取路径父文件夹(路径)
  140. Call 创建文件夹Ex(路径)
  141. Call 创建文件夹(当前路径)
  142. End If
  143. End Sub
  144. Function 获取路径父文件夹(DriveSpec)
  145. Dim fso
  146. Set fso = CreateObject("Scripting.FileSystemObject")
  147. 获取路径父文件夹 = fso.GetParentFolderName(Drivespec)
  148. set fso = nothing
  149. End Function
  150. Function 获取路径基本名称(filespec)
  151. Dim fso
  152. Set fso = CreateObject("Scripting.FileSystemObject")
  153. 获取路径基本名称 = fso.GetBaseName(filespec)
  154. set fso = nothing
  155. End Function
  156. Sub 创建文件夹(路径)
  157. Dim fso
  158. Set fso = CreateObject("Scripting.FileSystemObject")
  159. fso.CreateFolder 路径
  160. set fso = nothing
  161. End Sub
复制代码


源文件:

test.zip (, 下载次数:203)


最后编辑昨夜星辰 最后编辑于 2022-04-20 12:21:40
本主题由 超级版主 瑞祥幽冥狼 于 2023/8/13 22:34:20 执行 审核帖子 操作
近期制作:
传奇私服各种反外挂插件版本挂机软件,可教可售
原神加速、连发辅助工具
天下3自动钓大鱼辅助工具

承接脚本定制,点击下方联系
QQ:250039815

交流群:101296478

2#

学习学习

3#

必须看看 学习一下

4#

我来看看学习一下

5#

很巧妙啊

6#

学习一下

7#

思路很棒

8#

论找字还是找图,它返回的都是屏幕坐标,而不是游戏内的真实坐标,这样会导致如果遇到障碍或者物品名字较长的情况会无法到达或位置跑

9#

观摩学习

<font color="Magenta"><strong>【淘服务Designer】按键精灵 办公类、手机类、游戏类、辅助类脚本  QQ:271240457</strong></font>
10#

牛逼啊,学习了!

11#

我来看看学习一下

12#

回帖关注

助人为乐,共同学习,共同进步!
13#

学习学习

14#

学习学习,感谢分享

15#

学习一下看看

16#

学习学习

17#

学习

18#


19#

XUEXI

20#

看下看下

发新话题 回复该主题