使用A *并仍然避免碰撞?

时间:2011-04-14 11:00:01

标签: c# xna physics path-finding game-physics

我正在设计一个塔防游戏,为此我使用A *寻路算法从我的产卵区域到达目的地。

这里的问题是所有单元堆叠,看起来不太好看。有没有办法可以让他们以某种方式组成团队,如果没有足够的空间可以传播更多?

该算法可以使所有单位一次移动一个图块。

5 个答案:

答案 0 :(得分:5)

我的一位朋友曾经为你曾经听过的着名的第一人称射击游戏进行人工智能设计,讲述了他们的寻路算法如何产生假看的行为。你会在一个受限制的空间中向一群敌人扔一枚手榴弹,他们都会碰到对方试图让所有人都进入单一出口的有效路径。它显得愚蠢,打破了幻觉。

他们没有在更好的寻路上燃烧宝贵的处理器周期,而是增加了一种启发式方法,即如果一群敌人正在逃跑,并且敌人在短时间内连续两次撞到另一个敌人,则敌人不再试图逃跑而是做一只鸭子并且通常会被手榴弹杀死。这对玩家来说非常令人满意,看起来更加逼真。

也许你可以在这里做类似的事情。如果太多的单位最终走向相同的路径并且相互碰撞,并且看起来不切实际,那么你可以做一些便宜而简单的事情来检测情况并改变动画吗?

答案 1 :(得分:4)

您可以使用flock行为让它们遵循相同的常规路径但不会相互堆叠。 MS在此提供了一个XNA示例:http://xbox.create.msdn.com/en-US/education/catalog/sample/flocking

答案 2 :(得分:3)

您是否在每个时间步重新计算最短路径?

如果是:只需给瓷砖一个最大数量的单位即可。如果已满,则不再有单位占用此图块。

如果否:一个接一个地计算每个单元的路径。给每个瓷砖一个向量,告诉其他单位(后来),这个瓷砖占用了多少。将此信息放入您的A *算法中。注意:你的算法会慢很多。

我建议重新计算每一步的最短路径。

编辑1 实际上,算法的复杂性在两种情况下都是相同的,但在我看来,案例1更容易实现。

答案 3 :(得分:1)

如果你为许多爬行者占用的瓷砖添加一个惩罚,只要它们有移动的空间就可以将它们分开。

虽然不再是最快的路径。它也可能使它们更难以预测,这取决于你的目标难度可能是好的还是坏的:)

答案 4 :(得分:1)

迭代寻路怎么样?

  1. 运行路径查找算法,忽略重叠问题。这将找到最短的路径。
  2. 模拟蠕变运动。此模拟应该使用基于图块的移动运行,以便它快速。
  3. 选择在一条线上等待并因此不移动的小兵的一半(摆弄这个)。重新运行那些小兵的算法,但在他们等待的这个位置增加额外的重量惩罚。这个重量只适用于有额外重量的小兵。
  4. 重复步骤2-3,直到满足某些条件,向前一个额外的重量付出一些(小提琴)。
  5. 这种算法需要摆弄才能完全合并成有用的东西。但是,它具有使用预先计划的路径的优点,因此它不会有任何循环或爬行向后移动。它还允许您忽略诸如计时之类的事情,因此它在概念上更简单。但也可能效率低下。