TC官方合作论坛

标题: 冷月深夜贴之鼠标漂移详解 [打印本页]

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

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

[attach]2653[/attach]

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









作者: lyf1314    时间: 2012-3-27 08:53
不错不错
作者: 开心小鱼    时间: 2012-3-27 09:03
深奥哦
作者: Abin    时间: 2012-3-27 09:18
很好的帖子啊!!   膜拜楼主啊!!!  :rose
作者: 流冰    时间: 2012-3-27 09:40
顶了再看几遍
作者: gazsummer    时间: 2012-3-27 09:51
慢慢学习
作者: cchao2627    时间: 2012-3-27 09:58
我想成会员。
作者: zx_fy    时间: 2012-3-27 10:27
受教受教
作者: wscbc1978    时间: 2012-3-27 12:39
牛人,牛帖
作者: 小西    时间: 2012-3-27 15:29
很好的帖子啊!!   膜拜楼主啊!!!:rose
作者: popo014    时间: 2012-3-27 15:36
果真很牛- -膜拜中=。=  感谢楼主分享知识
作者: ldongh    时间: 2012-3-27 18:08
谢谢楼主分享   不知道是我没弄好还是怎么搞的   老是不成功  找色找不到   请问下楼主测试过么
作者: 冷月无痕    时间: 2012-3-27 18:42
回复 12楼ldongh的帖子

我注释说明了 那只是举例 你得自己找
作者: 无处藏身    时间: 2012-3-28 13:46
写是写出来了.但是问题出现了.鼠标形状太多了...麻烦啊.不过原理知道了总是好的
作者: 无处藏身    时间: 2012-3-28 14:04
死在黎明前
作者: zx_fy    时间: 2012-3-28 14:54
14楼的真是牛,我还没闹明白呢。。。
作者: 冷月无痕    时间: 2012-3-28 15:57
回复 12楼ldongh的帖子

找图一共要截三十多张图,听说可以找鼠标特征码,你可以去试试
作者: zx_fy    时间: 2012-3-29 13:15
:-|汗!有那么多鼠标图形啊?我一直以为就四种:1是常见的蓝色小鼠、2是战斗时的匕首小鼠和风扇叶型小鼠,3及手指型小鼠;看来不光学TC是小白。。。:-|:-|
作者: showmar    时间: 2012-3-31 19:57
感谢分享,不吝授教.
不知道没次移动量为1怎么样,虽然速度慢点
作者: lyttt    时间: 2012-3-31 22:42
我遇到个情况,当用宽屏显示器玩游戏和用普屏显示器玩会有一点区别,用宽屏的经常会出现,鼠标点命令的时候,箭头不是正好点再命令上的,有时候要移动下,命令条才亮,用普屏的时候很少出现,这是不是鼠标漂移的成因呢?
作者: blue_1    时间: 2012-7-26 17:48
找到个有解释的了
作者: chw    时间: 2012-8-1 11:15
写了一段,偶尔会有问题····
作者: zuxiastu    时间: 2012-10-1 02:54
谢谢楼主的无私奉献。
作者: zuxiastu    时间: 2012-10-1 21:10
研究了一晚上。没成功。汗
作者: lfddong    时间: 2012-10-7 15:20
崇拜中……
作者: lzq5628989    时间: 2012-10-10 16:11
学习中,,在看一遍
作者: wudongdonghehe    时间: 2012-10-22 13:16
回复 4楼Abin的帖子

在我看来,你们俩都是大神,唉,神的世界啊。
作者: jxwwdt    时间: 2012-11-19 07:23
再次看冷月贴
作者: armlin    时间: 2013-2-24 15:31
好贴
作者: lidongxu    时间: 2013-3-20 09:14
很好的帖子
作者: laowantong    时间: 2013-3-21 12:18
学习
作者: cybkk    时间: 2013-4-18 19:43
大大是大
作者: dengdaijihui    时间: 2013-4-27 01:00
顶 虽然我看不懂。。。
作者: donald_tangmao    时间: 2013-5-19 00:09
看不懂..........
作者: 853692686    时间: 2013-5-29 15:43
学习了
作者: fupinggui    时间: 2013-8-30 10:32
收藏了
作者: T星人    时间: 2014-11-9 00:17
我只能膜拜了, 讲得非常深入




欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/) Powered by Discuz! X3.1