2012-01-10 72 views
4

我创造了围绕游戏追逐玩家的敌人,但是存在问题。当敌人靠近玩家时,敌人过于完美并迅速聚合在一起。这是因为他们每次游戏更新时都会朝着玩家的方向前进。追逐玩家时,AI的敌人聚集在彼此之间

我想介绍一些随机性进入敌人,可能与运动的角度。这是我迄今为止(我还没有优化它,因为它是尚未完成,所以我知道高开销):

Angle = (float)Math.Atan2((HeroPosition - Position).Y, (HeroPosition - Position).X)// Positions are Vector2s 
GlobalForce Propellant = new GlobalForce((float)Math.Cos(Angle)/2, (float)Math.Sin(Angle)/2); 
ApplyForce(Propellant); 

如果我尝试随机号码添加到角有有几个问题:

  1. 他们都过之后对方如此迅速更新了种子的时间对于所有这些

  2. 相同随机数是在每次更新不同而使得角的敌人在不经意间跳来跳去。

所以我想知道的是:大多数游戏如何解决这个问题?我应该如何让敌人采取不同的路径(不能访问其他敌人的名单)?

编辑:

这是我下面的建议为将来的路人后使用的代码:

Angle = (float)Math.Atan2((HeroPosition - Position).Y, (HeroPosition - Position).X); 
GlobalForce Propellant = new GlobalForce((float)Math.Cos(Angle)/2, (float)Math.Sin(Angle)/2); 
ApplyForce(Propellant); 

foreach (Enemy e in OtherEnemies) 
{ 
    if (e != this) 
    { 
     if ((e.Position - Position).Length() < 64) 
     { 
      float angleBetween = MathHelper.TwoPi-(float)Math.Atan2((e.Position-Position).Y, (e.Position-Position).X); 
      GlobalForce avoidance = new GlobalForce((float)Math.Cos(angleBetween)*2, (float)Math.Sin(angleBetween)*2); 
      ApplyForce(avoidance); 
     } 
    } 
} 

回答

2

大多数游戏解决此获得由具有敌人封锁对方,让他们不要不会移动到同一个空间。

这可以作为一个硬约束(例如,每个方格只允许一个敌人,其他敌人不能移动到已经占用的方格中)或软约束(一些隐藏的“力量”将敌人分开他们彼此距离太近)。

+0

如果每个敌人都是独立的并且无法进入任何其他敌人的阵地,那么该怎么办? – annonymously 2012-01-10 09:31:53

+0

他们为什么没有访问权限?你应该能够让他们访问这些数据....也许通过一个“findNearbyUnits()”方法来搜索周围的地图区域。 – mikera 2012-01-10 09:42:28

+0

我现在决定在更新方法中传递一个对敌人列表的引用,并计算它们之间的角度,然后创建一个力量将它们分开,如果它们太靠近 – annonymously 2012-01-10 09:45:28

4

AI战术(以及人类战术BTW)的重要部分不仅是知道敌人在哪里并且采取行动,而且知道你的盟友在哪里并在其中行动。大多数最简单和最知名的演习都是不可能的(想想包围)。

其中很大一部分归结于“不要太接近盟友,如果你能避免它”。因此,基本上你需要做的是以某种方式管理你的武力,它不仅被敌人吸引,而且被盟友拒绝(不那么重要)。将它与两级导向器结合起来,就完成了。

+0

它看起来像我将不得不给每个实例的敌人列表的参考,并最终避免盟友:) – annonymously 2012-01-10 09:37:56

+0

这取决于你的用例:我怀疑你的角色会有某种检测视界,所以你可以使用检测到的盟友作为推送提供商。我认为,这会成为一个相当现实的运动模式。 – 2012-01-10 09:52:25

0

去年我不得不为课程之一编写一个吃豆游戏,我花了

我用A-Star search algorithm的敌人

运行该算法直接的将产生完美敌人。诀窍是为算法的结果添加一些随机性 - 在难度级别降低时让敌人“犯错”。走向与算法不同的方向,因为难度降低,敌人会犯更多的错误)

+0

这是一个有用的想法,但不幸的是我已经在使用转向行为 – annonymously 2012-01-10 09:41:52

1

中间解决方案是针对不同的AI有不同的策略。例如一个AI在玩家现在的位置,另一个AI在玩家去的地方,另一个习惯性地尝试在玩家的南边挂出几个单位,除非玩家正在直线移动。 ...

这不如有一个战略,你的AI考虑到他们的朋友在哪里,但(如果写得恰当),它会让他们的行为有所不同。