TC官方合作论坛

 找回密码
 立即注册
查看: 13596|回复: 36

冷月深夜贴之鼠标漂移详解

[复制链接]
发表于 2012-3-27 06:23:46 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
最近这段时间沉寂了很久的鼠标漂移话题又火热了起来!每天都有N多人在追问怎么解决梦幻鼠标漂移的问题!(特别是Q群里的无处藏身和YY里的风吹沙,这两个ID是同一个人?)
首先!在正式进入本章话题之前,冷月照例还得叽歪一些题外话!咳...咳...我们想要解决一个问题,必须先要去了解它,知道它的原因,分析它的内容,才可能找到解决的方法!我很理解大家迫切想知道答案的心情,但是也请大家在向别人索要源码而被拒绝的时候,心态放平衡一点,要知道授人以鱼不如授人以渔,再说了,别人的辛劳成果怎么会无缘无故的拿出来分享呢?(冷月的代码一向卖得很贵滴:P )

咳...咳...扯远了,那么现在开始今天的话题,梦幻问道鼠标漂移问题的解决方法!
还是那句话首先我们必须了解什么是鼠标漂移!好,为了让大家有个直观的认识,我们先上一张图:

3451243.jpg

这一张用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="" />








回复

使用道具 举报

发表于 2012-3-27 08:53:20 | 显示全部楼层
不错不错
回复 支持 反对

使用道具 举报

发表于 2012-3-27 09:03:46 | 显示全部楼层
深奥哦
回复 支持 反对

使用道具 举报

发表于 2012-3-27 09:18:22 | 显示全部楼层
很好的帖子啊!!   膜拜楼主啊!!!  :rose
回复 支持 反对

使用道具 举报

发表于 2012-3-27 09:40:54 | 显示全部楼层
顶了再看几遍
回复 支持 反对

使用道具 举报

发表于 2012-3-27 09:51:15 | 显示全部楼层
慢慢学习
回复 支持 反对

使用道具 举报

发表于 2012-3-27 09:58:48 | 显示全部楼层
我想成会员。
回复 支持 反对

使用道具 举报

发表于 2012-3-27 10:27:55 | 显示全部楼层
受教受教
回复 支持 反对

使用道具 举报

发表于 2012-3-27 12:39:13 | 显示全部楼层
牛人,牛帖
回复 支持 反对

使用道具 举报

发表于 2012-3-27 15:29:05 | 显示全部楼层
很好的帖子啊!!   膜拜楼主啊!!!:rose
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-8 09:53 , Processed in 0.065739 second(s), 27 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

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