我创造了在游戏中追逐玩家的敌人,但是有一个问题。当敌人靠近玩家时,敌人太完美并且很快就会聚集在一起。这是因为他们只是在每次游戏更新时向玩家的方向移动。
我想向敌人介绍一些随机性,可能是运动角度。这是我到目前为止(我还没有优化它,因为它还没有完成,所以我知道很高的开销):
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);
如果我尝试在角度中添加一个随机数,则存在一些问题:
他们都在彼此之后如此迅速地更新,所有人的种子时间都相同
随机数在每次更新时都是如此不同,以致敌人的角度不规则地跳跃。
所以我想知道的是:大多数游戏如何解决这个问题?我该如何让敌人采取不同的路径(无法访问其他敌人的名单)?
编辑:
这是我在以下建议之后使用的代码:
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);
}
}
}
答案 0 :(得分:4)
人工智能战术(以及人类战术BTW)的很大一部分不仅是了解敌人的位置并采取行动,而且还了解和行动你的盟友。如果没有这一点,大多数最简单和最有名的演习都是不可能的(思考包围圈)。
这很大程度上归结为“如果你能避免它,就不要太靠近盟友”。
所以基本上你需要做的是以一种方式管理你的力量,它不仅被敌人吸引,而且还被一个盟友拒绝(不那么)。将它与两级导航仪相结合,你就完成了。
答案 1 :(得分:2)
大多数游戏通过让敌人相互阻挡来解决这个问题,这样他们就不会移动到同一个空间。
这可以实现为硬约束(例如,每个方格中只允许一个敌人,没有其他敌人可以进入已占用的方格)或软约束(一些隐藏的“力量”,如果他们将敌人推开彼此太靠近了。)
答案 2 :(得分:1)
中间解决方案是针对不同的AI采用不同的策略。例如一个AI住在玩家现在所在的地方,另一个住在玩家所在地的人工智能,另一个人习惯性地试图在游戏者的南边停留几个单位,除非玩家直接移动它,。 ...
这不如制定一个策略,让你的AI考虑到他们的朋友所处的位置,但是(如果写得正确),它们会有不同的行为。
答案 3 :(得分:0)
去年我不得不为我参加过的其中一门课程编写PACMAN游戏代码
我使用A-Star search algorithm作为敌人
直接运行此算法将产生完美的敌人。
诀窍是为算法的结果添加一些随机性 - 让敌人犯错误#39;随着难度水平的下降(即,与算法产生的方向不同,随着难度水平降低,能量会产生更多的错误&#39;)