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

社区服务
高级搜索
猴岛论坛辅助工具有关网络游戏回到指定坐标的方法
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
0个回复

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

楼层直达
幻想.

ZxID:1717453

等级: 贵宾
这该死的社会,逼得人在杀人和忍住不杀之间徘徊.

举报 只看楼主 使用道具 楼主   发表于: 2009-01-19 0
— 本帖被 幻想. 执行取消锁定操作(2009-01-19) —

有关网络游戏回到指定坐标的方法
无论对于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//判断是否回到初始点
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//判断鼠标移动后,人物是否达到指定目标
Else
SayExpression "OK"
KeyPress 13 1
EndIf
//脚本结束
Sub 读取坐标
///根据游戏确定,得到当前坐标[Maa,Mab]///
Return 读取坐标
//根据游戏特点得到当前坐标
示意.GIF

« 返回列表
发帖 回复