防止实体在头顶射击游戏中相互堆叠

时间:2011-09-01 00:45:52

标签: c# algorithm xna artificial-intelligence

我正在开发射击游戏,随着时间的推移,随着我在竞技场周围移动,敌人将开始叠加在彼此之上,直到他们成为一大堆单位。它看起来很傻。

AI非常简单和基本:找到玩家,向他移动,如果他在射程内就攻击他。

将它们彼此远离的最佳方法是什么,以便它们不会最终都在同一个地方?我认为植绒有点矫枉过正(因为我一次会在屏幕上有100-200个敌人,所以可能过于强烈了。)

想法?

谢谢!

1 个答案:

答案 0 :(得分:9)

您可以采取以下几种方法来解决此问题:

  1. 您可以为每个单元定义潜在字段,将“高度”或“不良”与地图上的每个位置相关联。每个单元都以尽量减少其潜力的方式移动,可能是通过朝着将其移动到一步的最低潜力的方向迈出一步。您可以定义潜在的功能,使其向玩家倾斜,导致所有单位尝试移动到玩家,但在现有单位周围也非常高,导致单位避免碰撞到彼此。这是一个非常强大的框架,在AI中一直被利用;一个着名的例子是它在Berkeley Overmind人工智能中用于星际争霸,最终赢得了人工智能星际争霸比赛。如果你采用这种方法,你可能会调整潜在的功能,让AI以许多其他有趣的方式运行,并且可以轻松支持植绒。我个人认为这是最好的方法,因为它是最灵活的。它也是更先进的寻路模型的一个很好的起点。有关AI的潜在领域的非常良好和实用的介绍,请查看this website。有关潜在领域及其应用的严格数学介绍,您可能需要查看this paper使用潜在字段调查不同的AI方法。

  2. 如果为每个敌人定义一个边界圆,则可以通过防止任何两个单位在彼此的两个半径之间来明确禁止单位堆叠在一起。任何时候两个单位太靠近,你可以阻止其中一个单位移动,或者可以让它们相互施加力量将它们分开。当两个单元相互碰撞时,您可以选择一个随机的力矢量应用于每个单元,以尝试将它们分开。这是一个比潜在领域更糟糕,更不优雅的解决方案,但如果你需要了解并运行它肯定是一个可行的选择。

  3. 你可以选择玩家周围的一组点,单位试图移动,然后让每个单位随机选择一个目标点移动到。这将导致单位在玩家周围(或你喜欢的任何形状)更薄地传播,避免你到目前为止看到的巨大质量。同样,这不如使用潜在字段那么优雅,但如果您的目标是快速完成某些工作,那么这是您可以尝试的另一个快速黑客。

  4. 希望这有帮助!