注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

外挂网络游戏回到指定坐标的方法  

2009-07-09 20:07:02|  分类: 外挂学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

有关网络游戏回到指定坐标的方法

无论对于2D还是3D游戏

利用按键精灵回到指定坐标(原点),原理可以用下面的来解释

首先按键精灵控制的是鼠标移动,那么在一定分辨率的情况下(如1024*768),就会建立起一个左手平面直角坐标系。

为什么是左手,因为在Y方向上,鼠标向下移动对于Y坐标是增加的。

而对于某个游戏来说,人物在游戏地图上存在一个坐标。

那么我们移动屏幕上的鼠标使人物在游戏中移动的时候必然存在一个对应关系,利用矩阵计算可以得出这种关系。不过有点复杂。

现在我们来找出一种简单的对映关系,对于一个3D游戏(2D游戏一样的道理)来说

我们将视角调成90°的俯视情况,游戏里的坐标和屏幕坐标就可以看作平面的对应。

以人物为中心,鼠标就在[512,384],此时人物的坐标为[A1,B1]

我们把鼠标移动[X,Y]到[512+X,384+Y],使人物移动,得到新的人物坐标[A2,B2]

这个时候,当鼠标指向人物的时候,鼠标就回到了[512,384]

根据示意图的分析(蓝色为游戏,黑色为屏幕)我们可以发现

从蓝色坐标[x,y]到黑色坐标[x1,y1]

可以用这个公式(用极坐标r,0)换算出来的到下面的2个关系

x1=x*cos(B-A)-y*sin(B-A)

y1=-x*sin(B-A)-y*cos(B-A)

令C=B-A

那么我们关键就是求出C的值,整个坐标的对应关系就可以得出来

过程如下:

由上面的2点[A1,B1],[A2,B2].利用公式做差,得到

(X-0)=(A2-A1)*cos(C)-(B1-B2)*sin(C)

(Y-0)=-(A2-A1)*sin(C)-(B1-B2)*cos(C)

再令a=A1-A2,b=B1-B2.得到

X=a*cos(C)-b*sin(C)

Y=-a*sin(C)-b*cos(C)

反解出cosC与sinC

得到cosC=(a*X-b*Y)/(a^2+b^2)

sinC=(-a*X-b*Y)/(a^2+b^2)

之后,我们只要不转动屏幕,游戏坐标和屏幕坐标的关系就固定了。

假设人物现在的游戏坐标是[A2,B2],要到指定坐标[A3,B3]的话

令dx=A3-A2,dy=B3-B2

那么我们还是利用上面的关系

得到鼠标需要移动的坐标[mx,my]

mx=dX*CosC-dY*SinC

my=-dX*SinC-dY*CosC

得到这个值后,用按键把鼠标移动到[512+mx,384+my]点击就可以到达指定坐标了。

其实这是一个平面的仿射变换,不过由于对应关系比较简单所以在90°的时候计算比较准备。

但是在45°的时候我还没找到好的变换公式(我已经找4个点的坐标来变换45°的坐标,但测试效果不明显),因为需要用到三维投影。不知道有没人能做出来。

当然这只是一个构想,实际应用的时候还需要添加防止鼠标超出屏幕,和判断到达指定点的程序。

实际应用的时候可以看看我这个半成品脚本(没有读坐标那块,根据游戏自己用按键得到)

下面的思想是在俯视的情况下达到,实际中可以在45°的时候通过控制鼠标调整到90°,完成移动后再调回45°

[script]

VBS dim mX1,mY1,mX3,mY3,mX4,mY4,CosC,SinC,a,b,mx,my,dx,dy

Gosub 读取坐标//子程序得到当前坐标(Maa,Mab)//

VBS mX1=Maa

VBS mY1=Mab

VBS MBX=mX1

VBS MBY=mY1

VBS X=160

VBS Y=160

//定义初始坐标

SayExpression "["+CStr(mX1)+","+CStr(mY1)+"]"

KeyPress 13 1

Delay 1000

SayExpression "在下面8秒内离开现在坐标点,以进行走回原点测试,准备好了没?"

KeyPress 13 1

//提示脚本运行

Delay 8000

Gosub 读取坐标

VBS JuLi1=sqr((Maa-MBX)^2+(Mab-MBY)^2)

//得到当前坐标与初始坐标的距离

Rem 移动

If JuLi1>20

Rem 测试角度

Gosub 读取坐标

VBS mX3=Maa

VBS mY3=Mab

//下面开始坐标测试,得到第1个点的坐标

MoveTo 512+X 384+Y

Delay 20

LeftClick 1

Delay 800

//延时0.8秒 使人物完成游戏中的坐标移动,视游戏决定时间大小

Gosub 读取坐标

VBS mX4=Maa

VBS mY4=Mab

//得到第2个坐标点的数据

VBS JuLi2=sqr((Maa-MBX)^2+(Mab-MBY)^2)

If JuLi2<20

VBS JuLi1=JuLi2

Goto 移动

EndIf

//判断是否回到初始点

VBS a=mX4-mX3

VBS b=mY4-mY3

VBS CosC=(a*X-b*Y)/((a)^2+(b)^2)

VBS SinC=(-a*X-b*Y)/((a)^2+(b)^2)

VBS dx=MBX-mX4

VBS dy=MBY-mY4

VBS mx=dx*CosC-dy*SinC

VBS my=-dx*SinC-dy*CosC

//完成坐标变换

js=1

If sqr((mx^2+my^2))>300

Rem 计数

js=js*2

mx=int(mx/2)

my=int(my/2)

If sqr((mx^2+my^2))>300

Goto 计数

Else

EndIf

EndIf

//防止鼠标超出屏幕

For js

MoveTo 512+mx 384+my

Delay 20

LeftClick 1

Delay 800

EndFor

//移动鼠标

Gosub 读取坐标

VBS JuLi2=sqr((Maa-MBX)^2+(Mab-MBY)^2)

If JuLi2<20

VBS JuLi1=JuLi2

Goto 移动

Else

Goto 测试角度

EndIf

//判断鼠标移动后,人物是否达到指定目标

Else

SayExpression "OK"

KeyPress 13 1

EndIf

//脚本结束

Sub 读取坐标

///根据游戏确定,得到当前坐标[Maa,Mab]///

Return 读取坐标

//根据游戏特点得到当前坐标

图解:

外挂网络游戏回到指定坐标的方法 - 白云飘飘 - Louis333风雨夜归人

 蓝线表示为游戏

 黑线表示为屏幕

  评论这张
 
阅读(843)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017