- 按键认证大神
- 728264
- 3501
- 18
- 1898 朵
- 27453 个
- 1717 个
- 82980
- 2011-08-04
|
1#
t
T
发表于 2022-04-18 23:05
|
|只看楼主
在没有快捷拾取的游戏中,我们一般会选择查找物品的图片和文字,然后通过键盘按键或者鼠标点击逐渐靠近物品进行拾取操作。但是无论找字还是找图,它返回的都是屏幕坐标,而不是游戏内的真实坐标,这样会导致如果遇到障碍或者物品名字较长的情况会无法到达或位置跑偏。今天我们要说的就是,如何利用人物真实坐标,来转换物品的真实坐标,有了真实坐标,人物就可以准确地到达指定坐标。思路:以本游戏为例,人物脚下物品屏幕坐标为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,即可通过人物屏幕坐标、真实坐标转换物品屏幕坐标、真实坐标。坐标示意图:查找演示图:调试代码:- Dim 排序前,排序后
- 排序前 = 查找人物周围的物品位置(723, 312, 8, "恶魔|长袍|龙纹|心灵|手镯|灯笼|项链|生命|骑士|灵魂|幽灵|手套|战衣|骷髅|头盔|天珠|战神|盔甲|记忆|三眼|铂金|戒指", "ffffff|00ff00")
- 排序后 = 坐标排序(723, 312, 排序前)
- TracePrint "排序前:" & 排序前
- 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源码:- Public Declare Function SetDllPathW Lib ".\plugin\dmreg.dll" Alias "SetDllPathW" (ByVal path As String, ByVal mode As Long) As Long
- Dim 脚本ID, 脚本文件存放路径
- 脚本ID = GetMacroID()
- 脚本文件存放路径 = "C:\查找物品真实坐标\" & 脚本ID & "\"
- Call 创建文件夹Ex(脚本文件存放路径)
- Call 释放文件
- Call 注册大漠插件到系统
- Call 创建大漠对象
- Call 设置大漠相对路径(脚本文件存放路径)
- Dim 排序前,排序后
- 排序前 = 查找人物周围的物品位置(723, 312, 8, "恶魔|长袍|龙纹|心灵|手镯|灯笼|项链|生命|骑士|灵魂|幽灵|手套|战衣|骷髅|头盔|天珠|战神|盔甲|记忆|三眼|铂金|戒指", "ffffff|00ff00")
- 排序后 = 坐标排序(723, 312, 排序前)
- TracePrint "排序前:" & 排序前
- TracePrint "排序后:" & 排序后
- Function 查找人物周围的物品位置(人物当前x坐标,人物当前y坐标,范围, 物品名称, 物品颜色)
- 查找人物周围的物品位置 = ""
- If 范围 < 1 Then
- Exit Function
- End If
- Call dm.SetDict(0,"物品字库.txt")
- Dim font_desc, count, i
- font_desc = dm.GetDictInfo(Replace(物品名称, "|", ""), "宋体", 9, 0)
- font_desc = split(font_desc,"|")
- count = ubound(font_desc)
- for i = 0 to count
- dm.AddDict 0, font_desc(i)
- Next
- dm_ret = dm.SetDisplayInput("pic:原始图片.bmp")
- Dim x1, y1, x2, y2, px, py, 区域
- Dim 初始范围, x间隔, y间隔, 方向, k, 偏移方向数组, 偏移方向数组最大下标
- x间隔 = 48
- y间隔 = 32
- 初始范围 = Array(510, 280, 557, 292)
- 偏移方向数组 = 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))
- 偏移方向数组最大下标 = 7
- Dim x偏移数值, y偏移数值, 当前范围
- Dim x范围, y范围
- Dim 识别结果, 物品名称数组
- 物品名称数组 = Split(物品名称, "|")
- 识别结果 = dm.Ocr(初始范围(0),初始范围(1),初始范围(2),初始范围(3), 物品颜色, 1.0)
- If 识别结果 <> "" Then
- If 判断物品名称是否匹配(物品名称数组, 识别结果) = 1 Then
- 查找人物周围的物品位置 = 查找人物周围的物品位置 & 识别结果 & "," & (人物当前x坐标 + x偏移数值 * 偏移方向数组(k)(0)) & "," & (人物当前y坐标 + y偏移数值 * 偏移方向数组(k)(1)) & "|"
- End If
- End If
- For k = 0 To 偏移方向数组最大下标
- If 偏移方向数组(k)(0) = 0 Then
- x范围 = 1
- Else
- x范围 = 范围
- End If
- If 偏移方向数组(k)(1) = 0 Then
- y范围 = 1
- Else
- y范围 = 范围
- End If
- For x偏移数值 = 1 To x范围
- For y偏移数值 = 1 To y范围
- x1 = 初始范围(0) + x偏移数值 * 偏移方向数组(k)(0) * x间隔
- y1 = 初始范围(1) + y偏移数值 * 偏移方向数组(k)(1) * y间隔
- x2 = 初始范围(2) + x偏移数值 * 偏移方向数组(k)(0) * x间隔
- y2 = 初始范围(3) + y偏移数值 * 偏移方向数组(k)(1) * y间隔
- 当前范围 = x1 & "," & y1 & "," & x2 & "," & y2
- If InStr(区域, 当前范围) = 0 Then
- 区域 = 区域 & "|" & 当前范围
- 识别结果 = dm.Ocr(x1, y1, x2, y2, 物品颜色, 1.0)
- If 识别结果 <> "" Then
- If 判断物品名称是否匹配(物品名称数组, 识别结果) = 1 Then
- 查找人物周围的物品位置 = 查找人物周围的物品位置 & 识别结果 & "," & (人物当前x坐标 + x偏移数值 * 偏移方向数组(k)(0)) & "," & (人物当前y坐标 + y偏移数值 * 偏移方向数组(k)(1)) & "|"
- End If
- End If
- End If
- Next
- Next
- Next
- If 查找人物周围的物品位置 <> "" Then
- 查找人物周围的物品位置 = Left(查找人物周围的物品位置, Len(查找人物周围的物品位置) - 1)
- End If
- End Function
- Function 坐标排序(x, y, str)
- If str = "" Then
- 坐标排序 = ""
- Exit Function
- End If
- Dim a, b, temp, 原始数组, UBound_原始数组
- 原始数组 = Split(str, "|")
- UBound_原始数组 = UBound(原始数组)
- Dim sz1, sz2
- For a = 0 To UBound_原始数组 - 1
- For b = 0 To UBound_原始数组 - 1 - a
- sz1 = Split(原始数组(b), ",")
- sz2 = Split(原始数组(b + 1), ",")
- If Abs(CLng(sz1(1)) - x) + Abs(CLng(sz1(2)) - y) > Abs(CLng(sz2(1)) - x) + Abs(CLng(sz2(2)) - y) Then
- temp = 原始数组(b)
- 原始数组(b) = 原始数组(b + 1)
- 原始数组(b + 1) = temp
- End If
- Next
- Next
- 坐标排序 = Join(原始数组, "|")
- End Function
- Function 判断物品名称是否匹配(arr, str)
- 判断物品名称是否匹配 = 0
- Dim U_arr
- U_arr = Ubound(arr)
- For i = 0 To U_arr
- If InStr(str, arr(i)) > 0 Then
- 判断物品名称是否匹配 = 1
- Exit For
- End If
- Next
- End Function
- Sub 释放文件
- PutAttachment 脚本文件存放路径, "*.*"
- PutAttachment ".\plugin", "dmreg.dll"
- End Sub
- Sub 创建大漠对象
- Set dm = createobject("dm.dmsoft")
- End Sub
- Sub 设置大漠相对路径(路径)
- dm_ret = dm.SetPath(路径)
- End Sub
- Sub 注册大漠插件到系统()
- Dim ver, need_ver
- need_ver="3.1233"
- Call SetDllPathW(脚本文件存放路径 & "dm.dll", 0)
- Set dm = createobject("dm.dmsoft")
- ver = dm.ver()
- If ver = "" Then
- MessageBox "插件对象创建失败!"
- ElseIf ver <> need_ver Then
- MessageBox "插件版本错误,当前使用的版本是:" & ver & ",插件所在目录是:" & dm.GetBasePath()
- End If
- End Sub
- Sub 创建文件夹Ex(路径)
- Dim 当前路径
- If 获取路径基本名称(路径) <> "" Then
- 当前路径 = 路径
- 路径 = 获取路径父文件夹(路径)
- Call 创建文件夹Ex(路径)
- Call 创建文件夹(当前路径)
- End If
- End Sub
- Function 获取路径父文件夹(DriveSpec)
- Dim fso
- Set fso = CreateObject("Scripting.FileSystemObject")
- 获取路径父文件夹 = fso.GetParentFolderName(Drivespec)
- set fso = nothing
- End Function
- Function 获取路径基本名称(filespec)
- Dim fso
- Set fso = CreateObject("Scripting.FileSystemObject")
- 获取路径基本名称 = fso.GetBaseName(filespec)
- set fso = nothing
- End Function
- Sub 创建文件夹(路径)
- Dim fso
- Set fso = CreateObject("Scripting.FileSystemObject")
- fso.CreateFolder 路径
- set fso = nothing
- End Sub
复制代码 源文件:
- test.zip (, 下载次数:339)
|