这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战
过程
玩家释放技能,假设技能实体是个剑气,剑气从玩家近端移动到远端,并对沿途造成伤害
红色区域是技能范围,红框的宽就是剑气的宽,红框的长就是剑气能达到的距离
做法:将整个范围分隔为小矩形。
小矩形的长:是技能碰撞的宽
小矩形的宽,即步长:按照剑气的移动速度和位移长度 配置一个合理的值。
"合理",表示的是让玩家看到的现象是合理的:
- 剑气的话尽量窄,不要超过剑气特效的宽度
- 假设不是剑气移动而比如说范围内有落石一步一步从近端砸到远端,那就是落石的宽度
示例:
(为方便举例,总长为步长的整数倍。如果不是整数倍,那么最后一段的步长=移动终点 - 倒数第二次基 点位置)
假设总长3m,宽ab=1m,剑气(技能实体)移速6m/s,小矩形的宽为oo'=0.3m
玩家坐标 (x,y) ,玩家距离技能范围近端 d m ,技能释放的方向向量为 (m,n)
取得一个移动点,作为小矩形的基点o(p,q) = (x+d*,y+d*),o'(p',q') = (p+)
由基点可以算出小矩形的四个顶点:(0.5为范围宽的一半:oa的长)
o: (p,q) o': (p',q')=o+*(oo')
= 顺时针旋转 = (n,-m)
= 逆时针旋转 = (-n,m)
a = o+ * (oa)
b = o+ * (ob)
d = o'+ * (oa)
c = o'+ * (ob)
不管o在哪个象限,都是通过一次顺时针获取a、d坐标,一次逆时针获取到b、c坐标,上式不需要再过多考虑
【附】推导公式
最后就是判断玩家是否在这个矩形内(下节)
一次移动和检测完成,依次类推
全长通过时间为 总长/移速 = 3/6 = 0.5s
小矩形的移动检测间隔时间为 一步时间=步长/移速 = 0.3/6
次数:总长/步长
判断点在矩形内的方法
利用点积(数量积)的交集
点和四条边向量的点积同时满足>0;
因为两向量夹角范围是[0,180],而cosθ>0 表示两向量的夹角<90度
以直线da为界,的正方向均为:满足 >0 的点p所在区域
以直线ab为界,的正方向均为:满足 >0 的点p所在区域
以直线bc为界,的正方向均为:满足 >0 的点p所在区域
以直线cd为界,的正方向均为:满足 >0 的点p所在区域
四个>0同时满足,最终,点p会落在四个区域的交集,即矩形abcd内