先放结果,目前已整理为一个工具类,可以 前往这里查看。
起因:前两天在一个JAVA游戏服务器开发交流群里,有个小伙伴提问MMO游戏技能命中范围的计算问题,回忆了一下我曾经做MMO游戏时的做法,当时是由客户端完成计算,服务端并没有去做这个事情;聊天发现大家都没有现成的工具类,出于我对这方面非常感兴趣,因为这让我回想起了初中做平面几何题的感觉,于是决定自己写一个。
问题分析:MMO游戏中,常见的AOE技能覆盖区域一般分为圆形、环形、扇形、矩形四种,或者这四种的叠加使用,其他的没见过,就不考虑了。要判断目标是否被技能覆盖,其实就是判断目标的位置是否处于以上四种图形的区域内,不考虑3D空间的话,这个问题可以被转换为平面直角坐标系内的角度和向量相关问题。
编程分析:在这个问题中,有几个事物,攻击者,技能覆盖类型,被判断是否被命中的目标,落实到编程中时,其实我们不需要关心攻击者的情况,只需要关注技能的起始位置、朝向、覆盖范围,目标的位置这些信息。它们的必要属性如下:
目标对象:坐标(targetX,targetY)
针对技能的覆盖范围,不同的图形有不同的参数需求,分别如下:
圆形:圆心坐标(sourceX, sourceY),圆半径(radius)
环形:圆心坐标(sourceX, sourceY),内圆半径(innerRadius),外圆半径(outerRadius)
扇形:圆心坐标(sourceX, sourceY),扇形半径(radius),技能朝向(axisAngle:扇形中轴线相对坐标系的夹角),扩展角度(extendAngle:扇形相对中轴线向两边扩展的角度)
矩形:矩形起始点(sourceX, sourceY),宽度(width),长度(length),技能朝向(axisAngle)
注1:扇形的朝向也可以选择某条边来判定,不过那样在理解上容易增加困难,我选择