无论对于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°的坐标,但测试效果不明显),因为需要用到三维投影。不知道有没人能做出来。
当然这只是一个构想,实际应用的时候还需要添加防止鼠标超出屏幕,和判断到达指定点的程序。
实际应用的时候可以看看我这个半成品脚本(没有读坐标那块,根据游戏自己用按键得到) 。 |