[转]如何实现按键精灵的简单路点行走

来源:互联网 发布:上瘾网络剧未删减 编辑:程序博客网 时间:2024/03/29 22:23

转载自:http://hi.baidu.com/%BA%DA%D7%D3/blog/item/cccde1fe29dfad305d600850.html

 

对于一个外挂来说,实现角色在地图上的自动行走,需要包括三个要素:一是找到一条可以行走的路线,二是沿着找到的路线行走,三是在移动过程中进行越障处理。

不过对于按键精灵制作的脚本来说,第一步自动判断行走路线的问题实在过于复杂,即使你破解了加密过的地图文件,取得了地图的每个坐标点的通行,阻塞信息,另外还有个关键的问题,就是在实际行走过程中,除了场景障碍外,还有怪物,其他玩家等活动物体,他们也是一种障碍物,而按键精灵对于这种活动物体的判断,是比较薄弱的。

如果你花大功夫在按键中解决了这个问题,恭喜你的同时我会认为这是不值得的,那样的话不如用高级开发语言和工具脱离按键做成一个完整的外挂软件。

所以怎么找到可以行走的路线,本文并不会进行任何说明,有兴趣的可以去研究下 A *算法。本文所阐述的问题,是上文中提到的第二步,在已知达到目标的路线的情况下,怎样进行行走。

从A 走到 E 点,假设我们行走的路线是从 A - > B - > C - > D - > E,根据顺序依次经过 5个路点,且任意相邻两点间都是可以直线到达的。那么只要研究出如何从 A 走到 B,其他的点就可以根据相同的方法来处理。

这里主要介绍三种基本方法。


1。单步行走

现在的游戏绝大多数都是始终以人物为中心的。只要将鼠标放在行走方向上,和人物相距一个坐标的位置上不动,反复点击,就可以一步一步的走到目标。

如图,人物在位置 1时,鼠标在位置 2,点击鼠标,人物行走到位置 2 后,鼠标不动,但在画面上其实已经指向位置 3了,判断当前的坐标,如果仍未达到终点,就继续点击鼠标。这样多次循环,就能到达目的地。
这种行走方法只需知道方向就可以了,但它的每一步都必须是最小的,即一个游戏坐标长度,否则可能就会达不到或者超过目的地。


2。分步行走

单步行走的方法无疑是比较落后的,每走一步,都必须判断是否达到终点,反复判断坐标的过程肯定会增加行走时间。所以很多人使用了另外一种方法,可称之为分步行走法:根据屏幕大小,设定一个步长 Step (当然不能超过屏幕了),每次最多行走这个步长的距离,把整个路程,分开为若干步来完成。
如图,假设出发点是原点,目的地坐标为( X,Y) ,那么实际路线长度就是 X 的平方加上 Y的平方,如果这个长度比指定的步长 Step 大的话,就先走步长的距离,然后再以走到的点为出发原点,再次计算路线长度进行下一次判断;一旦判断比 Step 小,就直接走到终点。


3。分量分步行走法

现在的电脑屏幕一般是矩形的,高比宽短,再加上游戏画面下方一般有聊天输入框,选择菜单,血量显示,技能快捷等,纵向上就显得更加狭窄。上面介绍的分步行走法的步长,很大程度上都受到画面纵向高度的制约,相反在横向上,很大部分的屏幕都没有使用到。如图2中,灰色区域基本都集中在 X 轴方向上。

所以这里再介绍一种分量分步行走的方法,即分别设定 X 轴和 Y轴上的2种步长。如下图的 StepX 和 StepY,分别是横纵方向上能移动的最长的距离。在 StepY 和 StepX 形成的一个直角三角形中,假设角度为 θ。如果行走路线的角度小于 θ ,如红线路径,那么在屏幕上可以行走的最远点的坐标,就应该以 StepX 为准,再计算出此点的 Y的坐标;反之,如果大于θ ,如黄线路径,就应该以 StepY 为准,再计算出 X 的坐标。等于 θ 的情况可以归于大于或者小于进行计算。如下图:
其中 θ 角大小,可以用它的正切值 StepY/ StepX 来判断。假设出发点为原点,目的地的坐标为 X ,Y
简要代码如下:

If    StepY/StepX >= Y/X
       If StepX < X                    //与目的地的 X轴上的距离超过一个步长,计算下个移动点的坐标                  
              NextX = StepX
              NextY = StepX * Y /X
       Else                                 //与目的地的 X轴上的距离已经不超过一个步长,直接到达
               NextX = X  
               NextY = Y
       EndIf
ElseIf    StepY/StepX < Y/X
       If StepY < Y                   //与目的地的 Y轴上的距离超过一个步长,计算下个移动点的坐标                  
              NextY= StepY
              NextX = StepY * X /Y
       Else                                 //与目的地的 Y轴上的距离已经不超过一个步长,直接到达
               NextX = X  
               NextY = Y
       EndIf
EndIf

这样一来就可以更大程度的利用屏幕,提高了效率。

写在最后的话:
上面介绍的3种方法,只是比较简要的说明,都是以行走路线在第一象限的情况进行分析的,如果要实际的使用在脚本中,必须考虑到 4个象限中的不同情况,以及游戏中坐标的表示方式,如有的游戏以地图左底点为原点,有的以左顶点为原点;另外如果有玩家站在关键路点上,该怎么办,如何越障,这些都是实际编写中要考虑到的。
----------------------------------------------------------
以上为转载,- -说实话,我也看不太明白,所以先放至自己的空间再慢慢研究了,- -这些原理对锁定坐标很有帮助 
原创粉丝点击