挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
游戏交易就上寄售网-专注稳定-诚信赢天下玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)天下盾/国内/免实名/免备案CDN无视一切CC/DD攻击 找塔科夫作者TG @wuhao1954 QQ283931494 →入驻S9企业发卡网各种全黑号辅助群:475351077
██【我要租此广告位】██... .
查看: 17756|回复: 44
打印 上一主题 下一主题

[其他技术交流] 按键有屎以来最智能寻路系列之二

[复制链接]
3正式会员
142/300

142

积分

47

主题

5

听众
已帮网友解决0 个问题
好评
0
贡献
95
海币
290
交易币
0
跳转到指定楼层
楼主
发表于 2015-4-9 15:39:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


按键有屎以来最智能寻路系列之二
换算地图坐标寻路法

本文按键学院提供技术支持



{:4_111:}上周跟大家介绍了关于游戏地图的寻路方式,也以烈焰游戏无题材向大家分享了下最简单的寻路方法—直接输入坐标寻路法(没看过的童鞋可以参考:该链接无法确定安全),看过之后,想必大家对游戏的寻路方式有了一定的认知,小编今天再跟大家分享下进阶版的寻路方法,即换算地图坐标寻路法




换算地图坐标寻路法

{:4_92:}神马叫换算游戏坐标寻路法呢?顾名思义就是游戏地图上显示的坐标跟我们屏幕实际坐标不一致,需要通过相应关系的换算才能算出地图坐标相对于屏幕实际坐标的偏移量,然后鼠标相对偏移量点击地图某位置后即可自动进行寻路,听到这里估计大家还是不大懂,没关系,下面小编就以神途游戏为例子,跟大家深度解析下

                                                                                                            
游戏地图




图上左上角红色的点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
{:4_115:}到底对不对呢,我们不妨用大漠综合工具的浮动抓图功能截取上面的图片来验证看看:



有图有真相,事实证明小编的计算是正确的


思路流程





技术难点:
1.地图名不一样所对应的地图最大X、Y坐标都不一样
2.如何确定地图初始点(0,0)位置,然后进行坐标换算后偏移
3.移动过程中,如何判断人物是否已经移动到了指定坐标点,开始下一步动作



绑定窗口

{:5_138:}今天我们写的脚本有用到大漠插件,并且是后台的


因为是单开脚本,顶层窗口句柄就是游戏所对应的客户区句柄,所有用的是大漠的findwindow命令,查找符合类名或者标题名的顶层    可见窗口

后台绑定模式:
      图色模式:dx2
      鼠标模式:windows
      键盘模式:windows

关于大漠绑定模式如何获知
请参阅相关院刊:

游客,如果您要查看本帖隐藏内容请回复


判断地图名

游戏左下角会显示地图名及坐标,由于游戏不同的地图对应的游戏最大X坐标、Y坐标都是不一样的,所以我们要先识别当前的地图名,然后根据识别到的地图名对最大X坐标、Y坐标进行相应赋值,由于左下角会显示地图名和坐标,相互之间有时会有影响,所以做了俩个字库(坐标字库、地图名字库),分开调用

打开地图

为了避免地图已经打开的情况
我们要先判断地图有没有打开,没有打开的话才去按Tab键打开地图
因为后面我们找字的时候就是要在地图上找字,所以我们先进行找字
没找到字的情况下说明地图没打开,再按Tab键打开地图


确定地图初始点坐标

找地图上的"复活区"字,找到后就会得到该字左上角第一点坐标(IntXIntY)然后通过大漠工具精确抓图获取到地图初始点位置(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:\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
复制代码





游客,如果您要查看本帖隐藏内容请回复



联系我时,请说是在 挂海论坛 上看到的,谢谢!



上一篇:看了之后,我都想去做乞丐了
下一篇:按键精灵视频教程系列_共八讲
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:[email protected]),本站将立即改正。

18

积分

13

主题

4

听众
已帮网友解决0 个问题
好评
0
贡献
5
海币
1817
交易币
0
沙发
发表于 2015-4-29 15:12:09 | 只看该作者
我只是看看这个是什么

1

积分

0

主题

2

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
4
交易币
0
板凳
发表于 2015-6-11 14:55:23 | 只看该作者
寻路?nav导航网格寻路算法 有比这更智能的?
8资深会员
1790/1800

1790

积分

1

主题

3

听众
已帮网友解决0 个问题
好评
0
贡献
1789
海币
8654
交易币
0
地板
发表于 2015-6-11 15:04:12 | 只看该作者
支持楼主,绝对顶你...谢谢!

1

积分

0

主题

2

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
3
交易币
0
5#
发表于 2015-6-13 22:34:15 | 只看该作者
很高兴看的这个帖子,支持一下!

1

积分

0

主题

2

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
2340
交易币
0
6#
发表于 2015-10-15 21:13:26 来自手机 | 只看该作者
来学习一下

8

积分

1

主题

1

听众
已帮网友解决0 个问题
好评
0
贡献
7
海币
10
交易币
0
7#
发表于 2015-11-7 01:51:37 | 只看该作者
难得给力的好帖子,顶楼主。

1

积分

0

主题

0

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
9
交易币
0
8#
发表于 2016-1-20 05:50:49 | 只看该作者
来看看  来看看  来看看  

1

积分

0

主题

0

听众
已帮网友解决0 个问题
好评
0
贡献
1
海币
4
交易币
0
9#
发表于 2016-1-22 19:05:20 | 只看该作者
看看 适不适合3D网游

12

积分

2

主题

2

听众
已帮网友解决0 个问题
好评
0
贡献
10
海币
5
交易币
0
10#
发表于 2016-4-6 14:31:47 | 只看该作者
支持楼主,感谢楼主的分享,好贴必须学习!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2024-5-5 06:21 , Processed in 0.668147 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

快速回复 返回顶部 返回列表