问好,
我想简单的说下过去2周我们做了什么事情。我在coolmodi研究的基础上,对金币掉落公式做了一些小小的修订,并更正了小怪的怒气/能量公式,现在怪物技能将会正确的消耗怒气/能量。 没有了Asura的帮助,我一直试图解决一个几乎困扰所有私人服务器的大问题,我对此花费了大量的时间,但是我还是失败了。这段时间以来,我几乎都是没工作几个小时就被弄得烦躁不已,然后接下来的2天我就会在我的世界或者星际争霸中度过(只要不是魔兽世界)。
许多玩家想知道许多私人服务器是如何实现和官服一样的怪物追击机制。玩家和测试人员一次又一次地注意到,在最短的时间内,怪物不会直接走向你。这是因为怪物追击机制使用了一种寻路公式,他们一直在绘制一个到玩家当前位置的路径。实际上,他们正在创建一个通往某一点的途径,而这一点就是玩家的位置。在这个过程中,怪物正在检查目标范围,一旦进入近战范围,它就会停止移动并开始攻击。
这一切听起来不错,它或多或少起作用,但并不完美。如果你在官服中玩耍,甚至看官服视频,你可以看到,如果你试图左右移动,怪物并没有直接走向你,而是走向它认为你要去的地方,这样它得到玩家路线和更短的拦截路径。据我所知,没有任何私人服务器已经实现了这个机制。
在Soulson以及其他一些测试人员的帮助下,我尝试了一些方法来实现这一点,我想我已经选择了一个足够高效的方法,但是我仍然遇到一些问题。我首先解释这个机制是如何工作的。每个单位(一个怪物或玩家)都可以被简单的看成一个变动的坐标数字。这只是一个数字,但是你可以从中看到在特定时间内该单位涌动的轨迹。看起来像这样:
所以如果我按下W和d,我会向前向右移动,所以我的角色会有0x09的移动代码,这就是数学上前进和右移的表示。 显然还有很多其他的移动代码,但就我们的目的而言,唯一重要的是向前,向后,左转,右转。 在任何时候,对于任何一个单位,我们都可以找到他的移动代码也就知道了移动方向。 这就是我们需要做的工作。
魔兽世界只有8方向的移动(是的,飞行/水下是不同的)。 你可以调整你的方向,使你可以朝任何方向前进,但是无论怎么样你仍然只有前进,后退,右转,左转,前进+右转,前进+左转,后退+右转,后退+左转。 您的行动始终都在离不开这些数学代码。
魔兽世界让我很厌烦的一点是:它用弧度代替度数。我明白这样做有暴雪自己的理由,但我个人讨厌弧度,所以我要表达的东西都是基于度数来表达的。无论在任何时候你面对的角度都是你的方向。你的移动方向将是你面对的方向加上移动的角度。如果你面向0度,按右移,那么你的移动方向是90度。如果你处于0度,你向后转身,那么你的运动方向是180度。如果你正处于30度,你按下W和E,那么你的运动方向是75度。希望你能够明白。如果没有,你只有再读一遍。重点在于,通过定位和移动代码,我们可以沿着玩家的行进方向画出一条线。
我最初的想法计算出玩家运动路线,怪物会直接跑到和玩家运动路线相交的那个点,而不是跑到玩家当前的位置。然而,这也许不可行。计算大量交叉点并找到最近的点需要庞大的数学计算。数百个同时运动的怪物,我简直不能想象该如何计算。此外,我对数学不是很擅长,我的进度很缓慢,所以我放弃了这一点。
我知道如何计算运动路线,而且我知道我希望怪物运动到哪一点。唯一的问题是,这条线有多远?我以一个简单的解决方案来解决问题,根据当时怪物离玩家的距离而定。每当怪物的AI更新时,这个数字就会被更新,每秒约两次。基本上玩家和怪物之间的距离除以2就开始了。也就是说,如果怪物在30码以外,而且你向右移动,那么怪物将沿着你所在的路线前进到你右边15码的地方。这个数字很容易调整,如果有必要,可以调整到使其感觉看起来正确。怪物并不追逐你,而是预测你的行动路线。
我运用了一个范围检查,这样如果你们之间的距离很短,怪物就会回到最开始追逐你的地方,这样可以防止怪物在你接近时很快来回移动,从而防止发生任何奇怪现象。
我启动了服务器,然而...尴尬的是我失败了。
这是我上周左右被卡住的地方。纯粹的数学问题。我落实了之前的想法,测试了我所有的解决方案。我可以看到,怪物知道玩家在哪里,我可以看到怪物跑向正确的位置。同时还有水平高度检测,以便它不会奇怪地夹在地板上。
麻烦的是,当我在游戏中尝试它时,即使控制台清楚的把目标地点B发给怪物,它仍然只是直接跑向玩家前进。这就走进了编程的怪圈——“这应该工作,但它不工作,我不知道为什么”。相当令人沮丧。我推测是不是这个运动机制产生了一些我不知道的问题,否则还有另一个运动机制也在发挥作用,而且具有更高的优先级。
我原本并不打算把这个计算机制应用到全局,仅仅只运用到计算怪物追击中,但很可能是追击机制覆盖了我的指令。现在我们所拥有的移动机制已经从Trinity移植过来了。至少它是原来的,然后阿修罗改变了一堆东西。它是高度抽象的,没有文档,所以弄清楚事情的进展是非常缓慢的,也在测试着我的理解极限。
无论如何,正如我所说,我这样做的原因是为了挑战,而且我在这里肯定面对挑战。希望我的下一篇文章,我会带来一些好东西。
好的,我的下一篇博客文章将在12月11日。一如既往,随时留下评论或提出问题。我很快与你交谈,再次感谢你对Crestfall的持续关注。