【问题标题】:Combining A* Pathfinding and Click-To-Move结合 A* 寻路和点击移动
【发布时间】:2022-07-20 16:22:09
【问题描述】:

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

我正在尝试实现一个移动系统,其中玩家头像可以通过点击移动来移动。如果是直射,头像会直接移动到鼠标按下的位置。如果鼠标按下的位置在拐角处或通过一些蛇形路径,则头像将使用 A* 算法进行寻路。这适用于使用 C++ 和 SFML 的 2d、基于图块的游戏。本质上,我是在尝试模仿 Baldur's Gate 中使用的移动系统

我想要一个非此即彼的解决方案的原因是减少覆盖整个瓷砖地图所需的寻路节点的数量,但主要是因为使用 grid_node 方法会强制化身以网格对齐方式移动,我想这样做避免。

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

在调用 A* 移动时,开始和结束位置被转换为节点并添加到节点向量中。开始和结束节点与其区域中的所有节点相邻,并且同一区域内的所有节点分别与开始/结束节点相邻。随着算法的完成,正确的路径被推入一个顶点向量,该向量被提供给化身。然后化身从一个顶点移动到另一个顶点。这个image 显示了所有“静态”节点的邻居连接,左上角是开始位置,右下角是结束位置。

我在让它工作时遇到了一些问题,虽然我对它为什么不工作以及如何修复它有一些想法,但展望未来,我预见到在寻路过程中会出现碰撞检测问题,我确信我在没有 A* 的运动过程中将需要一个完全独立的碰撞检测算法。基本上,我预计使用这种方法会出现针对每种情况的代码,这是不可接受的。

我的问题:有没有更简单、更优雅、更合适的方法来解决这个问题?

感谢您的帮助

【问题讨论】:

    标签: c++ path-finding


    【解决方案1】:

    这看起来就像您想阅读有关“转向”主题的内容。 A* 适合高级路线规划,但避开局部和可能的移动障碍物确实不是 A* 擅长的。

    我个人喜欢Understanding Steering Behaviors的介绍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      相关资源
      最近更新 更多