结合A*寻径和点击移动



公平警告-我的问题是冗长的,没有代码。也许这不是问这个问题的最佳场合。无论如何:

我试图执行一个移动系统,其中玩家角色可以通过点击移动来移动。如果是直线射击,角色将直接移动到鼠标按下的位置。如果鼠标按下的位置是在拐角处或通过一些蛇形路径,角色将使用a *算法寻路。这是一款使用c++和SFML的2d贴图游戏。从本质上讲,我试图模仿《博德之门》中的移动系统

我想要一个非此此非的解决方案的原因是减少覆盖整个贴图所需的寻路节点的数量,但主要是因为使用grid_node方法迫使角色移动网格对齐,这是我想要避免的。

我的计划是将tilemap分割成可行走的区域,并将这些区域与A*使用的节点连接起来。如果起始位置(当前角色位置)和结束位置(鼠标按下的位置)在同一区域内,则调用点击移动函数,如果起始位置和结束位置不在同一区域内,则调用a *函数。

在调用A*移动时,开始和结束位置被转换为节点并添加到节点向量中。开始节点和结束节点与所在区域内的所有节点建立邻居关系,同一区域内的所有节点分别与开始节点和结束节点建立邻居关系。当算法完成时,正确的路径被推送到一个顶点向量中,该向量被给定给角色。然后角色从一个顶点移动到另一个顶点。该图显示了所有"静态"的邻居连接。节点,左上为起始位置,右下为结束位置。

我有一些问题得到这个工作,虽然我有一些想法,为什么它不工作以及如何修复它,展望未来,我预见到在寻径过程中的碰撞检测问题,我相信我将需要一个完全独立的碰撞检测算法在运动期间没有a *。基本上,我期望使用这种方法实现每种情况下的代码,这是不可接受的。

我的问题是:有没有一种更简单、更优雅、更合适的方法来解决这个问题?谢谢你的帮助

这听起来像是你想深入了解"转向"的主题。对于高层次的路线规划,A*是可以的,但是避免局部和可能的移动障碍确实不是A*擅长的。

我个人喜欢理解转向行为的介绍。

最新更新