MMORPG游戏伤害范围判定-矩形

·  阅读 228

这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战


过程

玩家释放技能,假设技能实体是个剑气,剑气从玩家近端移动到远端,并对沿途造成伤害

红色区域是技能范围,红框的宽就是剑气的宽,红框的长就是剑气能达到的距离

image-20210430110652225.png

做法:将整个范围分隔为小矩形。

小矩形的长:是技能碰撞的宽

小矩形的宽,即步长:按照剑气的移动速度和位移长度 配置一个合理的值。

"合理",表示的是让玩家看到的现象是合理的:

  • 剑气的话尽量窄,不要超过剑气特效的宽度
  • 假设不是剑气移动而比如说范围内有落石一步一步从近端砸到远端,那就是落石的宽度

示例

(为方便举例,总长为步长的整数倍。如果不是整数倍,那么最后一段的步长=移动终点 - 倒数第二次基 点位置)

假设总长3m,宽ab=1m,剑气(技能实体)移速6m/s,小矩形的宽为oo'=0.3m

玩家坐标 (x,y) ,玩家距离技能范围近端 d m ,技能释放的方向向量为 (m,n)

取得一个移动点,作为小矩形的基点o(p,q) = (x+d*m\vec{m}​​,y+d*n\vec{n}​​),o'(p',q') = (p+oo\vec{oo'}​​)

由基点可以算出小矩形的四个顶点:(0.5为范围宽的一半:oa的长)

o: (p,q) o': (p',q')=o+oo\vec{oo'}*(oo')

oa\vec{oa} = 顺时针旋转oo\vec{oo'} = (n,-m)

ob\vec{ob} = 逆时针旋转oo\vec{oo'} = (-n,m)

a = o+oa\vec{oa} * (oa)

b = o+ob\vec{ob} * (ob)

d = o'+oa\vec{oa} * (oa)

c = o'+oa\vec{oa} * (ob)

不管o在哪个象限,都是通过一次顺时针获取a、d坐标,一次逆时针获取到b、c坐标,上式不需要再过多考虑

【附】推导公式

image-20210506172934605.png

最后就是判断玩家是否在这个矩形内(下节)

一次移动和检测完成,依次类推

全长通过时间为 总长/移速 = 3/6 = 0.5s

小矩形的移动检测间隔时间为 一步时间=步长/移速 = 0.3/6

次数:总长/步长


判断点在矩形内的方法

利用点积(数量积)的交集

点和四条边向量的点积同时满足>0;

因为两向量夹角范围是[0,180],而cosθ>0 表示两向量的夹角<90度

以直线da为界,ab \vec{ab}的正方向均为:满足abap\vec{ab}*\vec{ap} >0 的点p所在区域

以直线ab为界,bc \vec{bc}的正方向均为:满足bcbp\vec{bc}*\vec{bp} >0 的点p所在区域

以直线bc为界,cd\vec{cd}的正方向均为:满足cdcp\vec{cd}*\vec{cp} >0 的点p所在区域

以直线cd为界,da\vec{da}的正方向均为:满足dadp\vec{da}*\vec{dp} >0 的点p所在区域

四个>0同时满足,最终,点p会落在四个区域的交集,即矩形abcd内

image-20210510212635565.png

image-20210510211244670.png

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改