1

我编写了一个小游戏引擎,具有基于图块的地图和用于寻路的 A* 算法。但是我有一个问题,当 2 个物体碰撞并阻挡一个航点时。他们来自相反的方向,所以他们不能再移动,也永远不会到达下一个航路点。我想到了一些可能的解决方案,例如

  • 可移动物体不能与其他可移动物体碰撞
  • 重新计算标记被阻止图块的路径
  • 只需计算到下一个自由航点的路径,将每个带有可移动物体的图块标记为阻塞

我真的不想做第一种可能性,这对于一个不像动作游戏的引擎来说有点破旧。如果地图上有很多可移动的物体,最后两种可能性可能会变得非常慢。你觉得我应该怎么做?顺便说一句,第一种可能性在“要塞”中实现,其他两种可以在任何较新的策略游戏中找到。

4

1 回答 1

1

当然,没有一个正确的答案,但我可以分享我对类似问题所做的事情:

我同意在这一点上通过看起来很老派。但是,如果您的对象小于导航网格,您可以使用边界框避免碰撞,而不会实际使路径无效。相对于较大的路径,使碰撞避免较小且局部。

如果这对您的游戏不起作用,添加块通常是最好的方法。如果担心寻路成本,可以等到发生碰撞,临时加“块”,重新寻路。另一种方法是定期插入块并重新路径。这可以提供看起来自然的路径,并避免看起来很奇怪的“移动前相互碰撞”。

成本很大程度上取决于您的 A* 算法。如果算法不缓存结果,则块没有增量成本,您可以尽可能频繁地运行 A*。例如:每帧运行一次 A* 并保留一个 A* 任务队列。

如果您的算法确实缓存了结果,请尝试对 A* 计算进行分组,以便在移动块之前进行多次求解。

于 2011-01-18T18:51:14.587 回答