马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最近这段时间沉寂了很久的鼠标漂移话题又火热了起来!每天都有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="" />
|