|
发表于 2012-7-24 14:04:10
|
显示全部楼层
河南省郑州市
//解决漂移问题3种方法:
//第一种,采用渐近的方法,就是不停的把虚拟坐标向目标移动
//第二种,鼠标在小范围内移动漂移会很小,可以采用每次小步的向目标移动并且修正方向
//第三种,有人说虚拟鼠标和系统鼠标连线上有个焦点,距离焦点的远近就会成比例的漂移
//我试过第一和第三种方法,因为我觉得第二种会很慢,如果第三种的规律找到了,将会是一步解决漂移,
//可是我研究了很久,仍然不行,我就采用第一种方法了
//大家在论坛上用的词语“虚拟鼠标”我理解为梦幻西游的鼠标,下面写到的时候不要误解哦
//当目标坐标在边界很近大约<5个坐标距离时漂移很难解决,还会失败在边界不停的跳
Sub 飘移
MoveTo x,y
Rem 仍然飘移
VBS Dim m,n,a,b
VBSCall FindPic(xMin,yMin,xMax,yMax,"a29g.bmp",0.9,m,n)
//在边界内查找虚拟鼠标的位置,求边界的方式不同,我用的也是找图,然后通过加加减减得到边界的坐标
//我用找图来找虚拟鼠标的,梦幻的鼠标是动态的,我把动的部分挖掉了,这个作图很重要做不好会影响下面
If m>=0 and n>=0
If (m-x) *(m-x)+(n-y)*(n-y)<4
//x,y是目标坐标,如果虚拟鼠标和目标坐标误差在允许的范围内就跳出循环,既漂移解决了
Goto 漂移解决
Else
VBSCall GetCursorPos(a,b)
//系统坐标位置,下面是看看如果按照虚拟鼠标和目的坐标之间的向量移动系统鼠标会不会出边界,
//其实这句话的功能是防止虚拟鼠标在梦幻窗口但是,系统鼠标却不在,造成鼠标直接移到屏幕角了
//如果出界就不按向量来移动,直接移动到目的坐标,等待下次从新移动
If a+x-m>xMin and a+x-m<xMax and b+y-n>yMin and b+y-n<yMax
MoveR x-m,y-n
Delay 70
//延时是必要的,因为我的笔记本电脑屏幕有延迟,如果不延时,找图时会出错,根据个人屏幕可以改动
Else
MoveTo x,y
EndIf
EndIf
Else
//下面是在找不到虚拟鼠标的情况下,通过把系统鼠标向屏幕内移动再次找到虚拟鼠标
//这种情况是应对虚拟鼠标图形半出界的情况的,就是鼠标图形被边界遮了一半导致读不出虚拟鼠标的位置
//我做的虚拟鼠标图是22*22的,用30可以把最出界的都移进屏幕
VBSCall GetCursorPos(a,b)
If a-xMin<30
MoveR 30,0
EndIf
If xMax-a<30
MoveR -30,0
EndIf
If b-yMin<30
MoveR 0,30
EndIf
If yMax-b<30
MoveR 0,-30
EndIf
EndIf
Goto 仍然飘移
Rem 漂移解决
Return
//使用的时候需要先把边界找到,可以在脚本的最开始得出来xMin,xMax,yMin,yMax的值
//使用例如:x=100
// y=100
// goSub 飘移
//下面是位师傅的脚本
Sub 飘移
rem 开始
x1=3
y1=22
x2=643
y2=502
Rem 鼠标位子
//下面这几行都是求虚拟鼠标的坐标的,采用找点的方法,我自己试验了很多次,找不到了
//可能是梦幻不断跟新的结果,可以自己再抓色做一下,x1,x2,y1,y2是梦幻窗口的边界
//我觉得不应该设置成固定的,窗口移动的就会找不到了
VBSCall FindColor(x1,y1,x2,y2,"c87c20",x3,y3)
If x3>0 and y3>0
IfColor x3+1,y3+1,A86c30,0
IfColor x3+3,y3+3,804c28,0
x3=x3-19-3
y3=y3-18-3
//因为是找点,通过修正求出虚拟坐标箭头的坐标
Else
x1=x3+1
y1=y3+1
//这里好像是把查找鼠标的面积减小就会找的更快吧
Goto 鼠标位子
EndIf
Else
x1=x3+1
y1=y3+1
Goto 鼠标位子
EndIf
Else
Goto 鼠标位子
EndIf
Rem 鼠标位子计算
//下面是如果虚拟鼠标和目标坐标的距离在纵横坐标上大于50,就大致向目标方向移动
//移动的纵横距离可以改成10,20,50等,改的越大,移动的距离越远,每小步的漂移也越大,
//这里移动的方向都是45度角的倍数,也就是我上面提到的第二种方式,小步走,漂移小吧
//这样一直循环到纵横距离不大于50的时候结束
x5=x-x3
y5=y-y3
VBS x4=Abs(x-x3)
VBS y4=Abs(y-y3)
//Abs是用来求绝对值的,这样就方便了下面这一句,括号中的可以直接写成x5,y5
//如果不用上面这句求绝对值也可以把下面这句改成if x5>50 or x5<-50 or y5>50 or y5<50
If x4>50 or y4>50
If x5>10
//想移动快点可以把这里的10全改成20,30,50之类的
x5=10
EndIf
If x5<-10
x5=-10
EndIf
If y5>10
y5=10
EndIf
If y5<-10
y5=-10
EndIf
MoveR x5,y5
VBSCall GetCursorPos(x3,y3)
Goto 鼠标位子计算
EndIf
//下面是如果虚拟鼠标在误差范围内就表示解决漂移,程序结束
If x4<4 and y4<4
Else
//当虚拟鼠标和目标距离允许范围之外,继续循环去找虚拟鼠标的位置
MoveR x5,y5
Delay 100
//开始的时候我也不理解延时,觉得会使脚本速度减慢,后来发现是必要的
Goto 鼠标位子
EndIf
Return |
|