A星寻路算法如何按角色面积大小进行寻路的实现方案,代码TypeScript版

现在网上的开发者提供A星寻路算法方案,角色是没有大小概念的,无论角色大小如何全部按只占一个路点格子计算,传统的RPG游戏寻路几乎都是这样做。

但是有些游戏却希望角色能按自己面积大小进行寻路,比如魔兽争霸,山岭巨人体型比较大,小精灵体型比较小,在一些比较窄的建筑缝隙,小精灵是可以寻路通过的,山岭巨人因体型太大寻路失败。

所以给A星寻路做按角色面积大小寻路还是有一定需求的,但是目前网上各路大神提供的A星寻路算法根本就没有这个功能,过去也有开发者在论坛发帖求按面积大小进行寻路的A星算法但是没找到答案,针对这个需求,本作者攻克了相关算法,终于把功能实现出来了,并且寻路效率还不错。


首先提供案例演示地址
https://easymapeditor-1258223435.cos.ap-guangzhou.myqcloud.com/astarfk/demo1/web-mobile/index.html

案例效果图


寻路到相同的一个点,3个大小不同的角色寻路路径会因自身的大小不同而路径不一样
备注:角色上面显示的绿色格子标记代表这个角色所占的格子面积

小角色

中角色

大角色

点击切换测试寻路按钮,可以查看寻路算法的过程


基本实现原理
A星寻路算法的基本原理就不再阐述,网上很多介绍,现在只讨论如何按面积大小进行寻路。

传统的A星算法,检测一个路点是否可通过时,是按一个一个路点进行检测,判断这个路点是否符合通过条件。按面积大小进行寻路是在传统的A星寻路的基础上做了点改进。检测路点还是继续一个点一个点地检测,但是判断是否可通过路点时,不再是只检测这个路点是否可通过,而是判断角色覆盖在这个路点及这个路点周边的其他的路点是否都能通过,能通过就检测下一个点,直到找到目标点为止。

角色的覆盖面积可以用向量来计算。
比如向量数组: [[-1,0],[1,0],[0,-1],[0,1]], 角色当前站立的路点坐标加上这个向量数组就等于角色覆盖的所有路点,算出来的覆盖面积刚好是是十字型,也就是案例里的中角色的面积。


源代码相关


代码是纯TypeScript写的,跟游戏引擎无关,所以可以直接移植到支持javascript的引擎如cocos,laya,node.js, html等。
截图里的寻路接口只要把开始坐标,目标坐标,角色半径传入即可,非常方便易用。寻路算法做了优化,效率高,可同时支持上千个角色同步寻路,帧率保持60帧。代码封装得很好,注释都写有,开发者拿来即用,可省下很多研发时间。


如何获取代码
代码在Cocos商店里有,地址链接
https://store.cocos.com/app/detail/4391
商店里的这个是个RPG框架项目,寻路系统在这个项目脚本目录的map目录下,支持按角色面积寻路

代码应用的相关项目


如果只对这个寻路算法感兴,也可以直接联系作者 QQ 583051842

12赞

牛批,666,我的宝贝

战略性mark

太完美了,厉害

看得出来up花了不少心思,也优化得很完善,点赞点赞!

mark mark

虽然很巧妙但用最大的呢个拐弯时碰到墙了,游戏里会穿模的image

算法得改下,就在a的基础上修改下
a
为:判断下一个格子是否是墙
改为:判断如果球在下一个格子的位置是否会和墙重叠即可

6666 插眼

因为角色是严格以格子为单位判断占据面积的,不是按照物体的像素面积。所以有点点穿模其实没关系。如果要严格不穿模,可以把角色的占据格子面积大于像素面积即可,在我写的代码里,占据格子面积和自身像素面积是完全独立互不干扰的。把格子面积设置得必像素面积大会造成角色可能离障碍还有点距离,但是无法走过去,魔兽争霸里的角色也是这样的设定,允许角色的占地面积稍微大于自身体积,虽然会和障碍物有点距离,但是不会影响游戏的可玩性。

比如下图占地面积比像素面积稍微大一点就能解决穿模的问题

战略mark/
支持.

战略mark

像是路径最后优化的锅,好像是优化出可以斜着走造成的问题
这样看在球走到这个点的位置明显不对啊
image

这是使用了8方向寻路,优化斜方向路线时并不能保证边缘是否有溢出障碍的,但是能保证每个覆盖的路点的中心点在可走路点范围内,这种边缘误差不会影响游戏的进行。如果选择4方向寻路,只能横竖行走就不会有这种问题。看开发者选择

如果要完全解决这种有边缘重叠也是可以做得到的,行走使用RVO导航
这个链接里的梦幻西游案例代码里有RVO算法,你运行一下测试就知道了

a*本来就不会有这个问题…就是上下左右走…
斜着来属实是奇怪
梦幻西游人家是六边形或者菱形格子可以保证斜着走没这个问题

A星寻路优化的原理是这样的,只要两点一线没覆盖任何障碍就代表能通的,有时路线会很贴近障碍边缘。这时玩家从线路通过就有可能自身某些边缘和障碍重叠,不管传统的RPG,RTS,MOBA这些游戏的寻路都是这样的,允许路线贴障碍边缘,而且角色像素的大小不一定就等于格子的大小,可以允许小于格子。玩家视觉上看得也是看像素大小,所以格子有点边缘重叠是不用太纠结的

很多情况下A星寻路是不希望只能上下左右行走的,如果梦幻西游角色只能上下左右行走那就变得很怪异了。允许斜着走才是最短的路径。

这个是地图的问题和啥路径优化不一样,你说为啥有呢么多形状的格子
就是为了解决斜着走的问题啊
算了我太纠结了
就是现在格子稀疏还好,当你改的密集了就会出现有接近一半穿模的情况,可能是我想的太多
image
image

不同形状的格子是应用不同的游戏的,不是为了解决斜着走