最近这段时间沉寂了很久的鼠标漂移话题又火热了起来!每天都有N多人在追问怎么解决梦幻鼠标漂移的问题!(特别是Q群里的无处藏身和YY里的风吹沙,这两个ID是同一个人?) 
首先!在正式进入本章话题之前,冷月照例还得叽歪一些题外话!咳...咳...我们想要解决一个问题,必须先要去了解它,知道它的原因,分析它的内容,才可能找到解决的方法!我很理解大家迫切想知道答案的心情,但是也请大家在向别人索要源码而被拒绝的时候,心态放平衡一点,要知道授人以鱼不如授人以渔,再说了,别人的辛劳成果怎么会无缘无故的拿出来分享呢?(冷月的代码一向卖得很贵滴:P ) 
 
咳...咳...扯远了,那么现在开始今天的话题,梦幻问道鼠标漂移问题的解决方法! 
还是那句话首先我们必须了解什么是鼠标漂移!好,为了让大家有个直观的认识,我们先上一张图: 
 
 
 
这一张用TC抓色器抓取梦幻西游的图,大家仔细看,在游戏窗口里,游戏的鼠标指针位置是宠物血条的一半左右位置,而抓色器上鼠标指针都快指到了宠物头像边框了! 
这就是著名的鼠标漂移了,因为游戏鼠标位置和电脑鼠标位置在屏幕上是不一样的,所以我们脚本用移动鼠标命令是不能让游戏鼠标移动到对应位置的! 
 
那么我们应该怎么解决这个问题呢?首先!通过度娘我们可以了解鼠标漂移的三个特点!(有问题找度娘!没错的!)          
一,系统鼠标(也就是电脑鼠标)与虚拟鼠标(也就是游戏鼠标)之间的漂移量(也就是差值)是随机的! 
二,虚拟鼠标的移动距离越短,差值越小 
三,越靠近游戏窗口边框,差值越大 
 
现在主流的解决鼠标漂移方案就是利用它的第二个特点,让系统鼠标坐标无限接近虚拟鼠标坐标,称作无限渐进法! 
当然,解决鼠标漂移的方法有很多,最简单犀利的当属我们TC大神"梦想飞舞"的WIN键法(点击进入原帖),我称之为"上帝之键":P  
 
好了,我们还是说回无限渐进法,首先,我们必须得到虚拟鼠标(游戏鼠标)的坐标(这里是屏幕坐标,后台的话需要换算),最准确的方法当然是读内存(如果你会的话应该就不用来看我这个贴了),还有就是大众话的找图,多点找色了!对于梦幻的鼠标指针,不但会变色,而且状态多样,有剑状的,有手指状的等等等等,(告诉你一个确切数字一共有三十多张图!),当然懂PS的可以把会变色的部份抠掉,这样就大大的减少了图片量,但是个人建议还是多点找色的好!多点找色就找鼠标上不会变色部份的几个点,不同状态的都要找! 
基本思路: 
一,获得虚拟鼠标(游戏鼠标)的当前坐标 
二,判断虚拟鼠标当前坐标与目标坐标的差值是否在我们设定的范围内!(因为是无限接近,所以我们允许一个差值) 
三,利用相对移动命令控制虚拟鼠标逼近目标坐标! 
 
 
好了,鼠标漂移分析完了,下面?下面就上代码了,很多人都说冷月上代码都不加注释的!额,我从来上的可都是纯中文代码吖!比起那些大神们的E文代码我以为大家都能看得懂了,好吧,这一次,加注释! 
代码如下: 
    功能 漂移至(目标x,目标y) 
    是否成功 
    虚鼠x,虚鼠y,过鼠x,过鼠y,实鼠x,实鼠y 
    //虚鼠x,虚鼠y就是游戏鼠标坐标通过多点找色获得 
    //过鼠x,过鼠y用来过度的鼠标坐标,实鼠x,实鼠y系统鼠标坐标 
    循环((目标x-虚鼠x)*(目标x-虚鼠x)+(目标y-虚鼠y)*(目标y-虚鼠y)>4) 
    //为什么要相乘呢?如果出现负值,乘一下就负负得正了嘛:)当然你也可以用绝对值命令 
    //这里循环的条件就是目标坐标和虚拟鼠标的坐标差值小于2就跳出循环,说明我们已经移动到位置了 
    是否成功=图像.多点找色(0,0,800,600,#c87c20,"1|1|A86c30,3|3|804c28",0.9,0,过鼠x,过鼠y) 
    如果(是否成功) 
    虚鼠x=过鼠x-22 
    虚鼠y=过鼠y-21 
    //通过多点找色获得游戏鼠标当前坐标,这只是个举例,大家根据自己的需要去得到游戏鼠标当前坐标,可以用找图,也可以找内存! 
    //有人又要问了,这里为什么要+22,+21呢?因为这里用的是找点,所以我们要通过修正求出虚拟鼠标箭头的坐标 
    否则 
    返回 假 
    //找不到虚拟鼠标,函数执行失败,返回假 
    //这里你也可以移动鼠标到一个窗口中间的位置,以防鼠标被窗口边框遮挡出现找不到鼠标的情况 
    如果结束 
    鼠标.获取坐标(实鼠x,实鼠y) 
    //得到系统鼠标坐标 
    如果(目标x>700||目标x<100||目标y>500||目标y<80) 
    //这里的条件就是所谓的边框位置了,如果目标坐标接近边框,那么我们就不能一次移动太多 
    如果(实鼠x>800||实鼠y>600) 
    鼠标.移动(目标x,目标y) 
    //这里的游戏窗口是设置在0,0的位置,800,600是游戏窗口的最大坐标 
    //如果没有设置窗口位置那么还要设置一个最小坐标防出界 
    //为什么要用系统鼠标来判断是否出界呢? 
    //因为虚拟鼠标出界时,可能会被窗口边框遮挡一部分出现找不到虚拟鼠标的情况 
    //这里的条件是如果出界了,直接移动系统鼠标到目标位置 
    辅助.等待(50) 
    否则 
    如果(虚鼠x>700||虚鼠x<100||虚鼠y>500||虚鼠y<80) 
    //判断虚拟鼠标是否进入边框区 
    鼠标.相对移动((目标x-虚鼠x)*0.92/2,(目标y-虚鼠y)*0.92/2) 
    //因为进入边框区了,所以缩小鼠标移动的距离,减少漂移差值 
    否则 
    鼠标.相对移动((目标x-虚鼠x)*0.92,(目标y-虚鼠y)*0.92) 
    //这里为什么差值要乘以0.92呢?这是为了提高准确率,这个值可以是0.5-0.99之间 
    //其实也是以前冷月老帖子里那个让人郁闷的-21,-14 
    辅助.等待(50) 
    如果结束 
    如果结束 
    如果结束 
    循环结束 
    返回 真 
    功能结束 
这段代码当然不能算得上很完善(本来通过找图色得到梦幻鼠标坐标就是个技术活),反正原理已经告诉大家了,只是给大家一个参考! 
 
总之通过不断的调试修改,我相信大家一定写出完美的梦幻鼠标漂移代码来! 
 
晕,标题写的是深夜贴,写完抬头一看,天都快亮了!洗洗睡了!<img src=-)" alt="" />  
 
 
 
 
 
 
 
 
 |