NAV导航网格寻路(7) -- 代码和一些优化
这篇是转的文章,原文 http://blianchen.blog.163.com/blog/static/131056299201031293039882/
这里发不了源码,本系列完整源码可以到http://bbs.9ria.com/thread-49841-1-1.html下。
看下图,最优路径应该是从上面绕过中间阻挡区,而实际寻路产生的路径确是下面。这是由于,在网格面积过大或有某边长度过长时,由于a*中的花费是计算网格的两边中点距离而不实际的路径长度,所以产生的路径偏差较大。所以在一般的网格生成算法中都会加入网格最小面积和最大面积的限制,如果生成的网格小于最小面积时则抛弃,如果大于最大面积则拆分。
一般地图中都会产生孤岛,如下图,两个阻挡区域交叉,合并后在中间深红色区域产生孤岛。按照上面介绍的剪裁算法,中间孤岛多边形会以逆时针方向存储(其他顺时针),因此在这一步能够判断出是否生成孤岛。对于生成的孤岛,如果游戏允许人物可以通过瞬移等方式进入孤岛,那么孤岛也需要生成nav网格,不过孤岛的nav网格和其他区域的网格最好能分成不同区域,这样在寻路时就可以优化(起点和终点不在同区域,可直接确定为不能通过)。