-
关注Ta
-
- 注册时间 2014-10-29
- 最后登录 2016-05-06
-
- 发帖84
- 在线41小时
- 精华0
- DB768
- 威望0
- 保证金0
- 桃子0
- 鲜花0
- 鸡蛋0
-
访问TA的空间加好友用道具
|
解决鼠标飘移~~SO EASY!! 什么是鼠标飘移现象? 鼠标飘移就是 使用 MoveTo 命令想要在游戏中把鼠标移动到指定的坐标点的时候,游戏中的鼠标却诡异的随机移动到该坐标周围的点。接着给大家举个“栗子”看看到底神马是鼠标飘移 比如想要移动到图中红框的部分点击,关闭掉这个窗口 使用抓抓工具获得这个关闭按钮的坐标是 (394,100),那正常情况下的代码该如何写呢? - MoveTo 394, 100
- LeftClick 1
但是!!如果直接按照这个代码执行的话就会下面的现象 童鞋们注意到了么?不管执行代码多少次,结果游戏中的鼠标就是一直在坐标点周围 “晃悠” 就是不点击我们指定的那个点。 小编当时遇到这个问题的时候简直是抓狂了! 如果鼠标移动的位置都不准确的话,那整个脚本之后的操作基本上都无法继续下去了,难道就要放弃这个脚本么 No!!!俗话说的好 “道高一尺,魔高一丈” 经过咱们的按键工程师07 大大的研究,成功的解决了鼠标飘移的问题! 下面就让我们来看看如何处理鼠标飘移~~ 解决思路 引用 1、先用MoveTo 移动到指定坐标 2、在游戏中利用找图或者找色命令,找到游戏鼠标特征,从而得出鼠标当前位置 3、计算指定坐标和鼠标当前位置的差值 4、使用相对移动命令MoveR移动鼠标 具体步骤 引用 1、先使用移动命令移动到指定的坐标
引用 2、这时候游戏中实际的鼠标位置和目标点其实是有偏移的,我们需要先找到游戏鼠标的实际所在的位置
游戏中鼠标的样子是一把剑的形状 我们就是要通过找到这把剑的位置来确定游戏中鼠标的实际位置 但是这把剑是会一直转动的,这该如何去找呢? 其实细心的童鞋可以发现这把剑的剑柄的部分是不动的 那我们就可以通过多点找色的方式去找到这个剑柄了。 - XY = FindMultiColor(0, 0, 1024, 768, "886020", "5|3|e0d078,6|5|c09c68,3|4|887038,-1|2|584028", 1.0, 1)
- ZB = InStr(XY, "|")
- //下面这句将字符串转换成数值
- intX = Clng(Left(XY, ZB - 1)): intY = Clng(Right(XY, Len(XY) - ZB))
注意:这里得到的坐标是剑柄的位置,游戏中鼠标是根据剑尖来判定位置的,所以在实际的使用中还需要减去一些距离才能得到剑尖的坐标点。 引用 3、接着计算指定的坐标和鼠标当前坐标的差值。
- x轴的坐标差是:x - (intX-22)
- y轴的坐标差是:y - (intY-22)
代码里的22就是剑柄的坐标和剑尖的距离,intX-22 的结果就是剑尖的x坐标。intY-22 就是剑尖的y坐标。 引用 4、之后用相对移动命令去移动即可
- MoveR x - (intX-22),y - (intY-22)
完整代码 我们可以把这个计算过程定义成一个函数,这样可以在之后的脚本中很方便的去调用他 - Function 移动(x, y)
- //加入最大循环次数判断是否鼠标跑出画面
- Dim tmp1 '计数变量
- moveto x, y
- Delay 100
- //定位鼠标
- Do
- //多点找色,找鼠标剑柄,加偏色
- XY = FindMultiColor(0, 0, 1024, 768, "886020", "5|3|e0d078,6|5|c09c68,3|4|887038,-1|2|584028", 1.0, 1)
- ZB = InStr(XY, "|")
- //下面这句将字符串转换成数值
- intX = Clng(Left(XY, ZB - 1)): intY = Clng(Right(XY, Len(XY) - ZB))
- If intX >= 0 and intY >= 0 Then
- TracePrint "找到" & intX & "," & intY
- Exit Do
- Else
- TracePrint "未找到"
- tmp1 = tmp1 + 1
- End If
- Delay 10
- If tmp1 >= 20 Then
- TracePrint "无法定位鼠标位置,重置鼠标位置"
- moveto 400, 300
- Delay 300
- //重置计数变量
- tmp1 = 0
- End If
- Loop
- TracePrint "次数"&tmp1
- Delay 50
- TracePrint "坐标差:" & x - (intX-22) & "," & y - (intY-22)
- MoveR x - (intX-22),y - (intY-22)
- End Function
引用 除了这个通过计算差值的方法外,还有没有其他的方法用来解决鼠标飘移呢? 答案当然是有啦!! 而且方法比这个上面的方法要 简单粗暴! 后台移动鼠标解决飘移 后台命令的话直接就可以准确的移动操作,不需要单独的去计算差值 - Call register() //注册大漠
- hwnd = dm.GetMousePointWindow()
- dm_ret = dm.BindWindow(hwnd,"dx","windows2","dx",1) //大漠绑定窗口
- dm.moveto x,y
- dm.leftclick
- Sub register() //注册大漠
- Set ws = createobject("Wscript.Shell")
- ws.run "regsvr32 atl.dll /s"
- Set ws = nothing
- PutAttachment "G:\test", "dm.dll"
- PutAttachment ".\Plugin" ,"RegDll.dll"
- call Plugin.RegDll.Reg ( "G:\test\dm.dll")
- Set dm = createobject("dm.dmsoft")
- ver = dm.ver()
- If len(ver) = 0 Then
- MessageBox "插件注册失败,检查系统是否禁用了vbs脚本权限"
- EndScript
- End If
- End Sub
这里还需要补充一点:这个后台的方法并不是所有游戏都能适用的,只有部分游戏使用后台方式可以避免出现鼠标飘移。
具体是哪些游戏,那就只能童鞋们自己测试了。
|