现在网上的开发者提供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