项目环境
语言:按键精灵(.mq)
运行平台:Android
对象:妄想山海
大型自由开放世界的最短寻路思路的视频教程
实现思路
思路过程:
RPG游戏的寻路模式不同,可分为地图上标识和界面上标识
这次分享的时界面上标识的类型。
- 通过搜索后显示的距离数字,进行计算最短路径。
- 通过观察,距离数字的现实始终保持在图标的右下角,所以我们可以通过先找到图标,取得图标的坐标点后,进行偏移坐标
- 偏移到数字的范围进行OCR识别,经过计算后即可得到最短距离。
具体代码
1.找到图标
- 找到图标的方式很多,我将使用多点找色进行匹配:
注意点:
- 匹配的第一个点必要比数字的 X 坐标要大(数字的上面)
- 并且所以的图标匹配的第一个点,都应该和数字的距离相近,不然 OCR 的范围将扩大,影响效率。
- 10个点最好都取满,提升准确率。
以下代码,可全屏匹配兽皮并返回匹配成功的数量:
Dim targetNumber
Dim number = Image.FindMultiColor(0,0,0,0,"383237","-2|-4|738CC6,-11|-2|BFABB2,-18|-7|363338,-12|-13|535A73,-20|-26|70717F,-26|6|CECECE,-2|-14|979796,-11|-18|717188,-8|-10|39455D",0,0.9)
targetNumber = UBOUND(number) + 1
If targetNumber >= 1 Then
TracePrint "测试语句:目标数量"&targetNumber
TracePrint number(0,0),number(0,1)
End If
2.偏移到数字的范围
- 找到的图标后,用第一个点进行偏移,偏移到数字的左上角和右下角,然后进行 OCR 识别,将数字进行比较,保存最小的数字,同时记录是哪一个图标。
以下代码可实现上述功能:
Dim minIndex
Dim minNumber = 100
Dim OCRNumber = 100
For i= 0 to targetNumber - 1 step 1
OCRNumber = CInt(Ocr(number(i,0)+2,number(i,1),number(i,0)-20,number(i,1)+85,"FFFFFF-303030",0.9))
TracePrint "识别出数值:"&OCRNumber
If OCRNumber < minNumber And OCRNumber > 0 Then
minNumber = OCRNumber
minIndex = i
End If
Next
TracePrint "最近距离图标坐标为:"&number(0,0),number(0,1)&"下标为:"&minIndex&"距离为:"&minNumber
3.OCR识别
- OCR 可自行写字库也可使用自带的字库,不再赘述:
- 需要字库文件可在公众号(王菠萝包的多样空间)发送:妄想山海字库,即可获得下载链接。
SetDictEx 5, "Attachment:通用寻路数字.txt"
UseDict (5)
Dim OCRNumber = CInt(Ocr(number(i,0)+2,number(i,1),number(i,0)-20,number(i,1)+85,"FFFFFF-303030",0.9))
TracePrint "识别出数值:"&识别出数值
4.最短距离判断
- 将最短距离的图标的做坐标赋值给变量,随后进行移动操作:
Dim moveDate(2)
Dim stopNumber = 5
If targetNumber <> 0 Then
moveDate(1) = number(minIndex, 0)
moveDate(2) = number(minIndex, 1)
End If
If minNumber > stopNumber And minNumber < 100 Then
TouchDown 1 , 397,723
TracePrint "距离目标" & minNumber & "丈"
TouchMove moveDate(1), moveDate(2), 1, 100
TouchDown 278, 1228, 2 //疾跑
Delay 2000
TouchUp 2
End If
更多交流
若还有不懂也可关注博主加入我,一起讨论技术和摸鱼,也可观看视频学习。
王菠萝的多样空间的公众号