我想为Monogame中的狙击敌人类型创建敌人AI行为

时间:2018-12-07 18:01:47

标签: c# xna monogame

我已经为其他敌人实施了基本的跟随玩家行为

    // For knife soldier, simply runs at player
    IEnumerable<int> FollowPlayer(float acceleration = 0.3f)
    {
        while (true)
        {
            if (!PlayerShip.Instance.IsDead)
                Velocity += (PlayerShip.Instance.Position - Position) * (acceleration / (PlayerShip.Instance.Position - Position).Length());

            if (Velocity != Vector2.Zero)
                Orientation = PlayerShip.Instance.Position.ToAngle();

            yield return 0;
        }
    }`

我想为狙击手实施更复杂的行为。它的前提是狙击手必须与玩家保持一定距离才能射击。 这是该代码:

public static void HandleSniperShotRange()
    {
        float acceleration = 0.2f;
        // Check whether player is within sniper range (Used for sniper behaviour)
        for (int i = 0; i < enemies.Count; i++)
        {

            if (enemies[i].IsActive && IsCollidingSniperRange(PlayerShip.Instance, enemies[i]))
            {
                enemies[i].Velocity += (PlayerShip.Instance.Position - enemies[i].Position) * (acceleration / (PlayerShip.Instance.Position - enemies[i].Position).Length());
                enemies[i].Orientation = PlayerShip.Instance.Position.ToAngle() * -1;

            }
        }

    }



private static bool IsCollidingSniperRange(Entity a, Entity b)
    {
        float radius = a.Radius + b.Radius + 120;
        return !a.IsExpired && !b.IsExpired && Vector2.DistanceSquared(a.Position, b.Position) < radius * radius;
    }

我的代码当前会在屏幕上绘制一个狙击手,但不会移动。

现在我无法将它们都放在同一个Enemy类中,因为我的EntityManager类存储了所有添加的敌方实体的列表。当我确实将狙击手行为列入敌人的职业时,它会起作用,但是如果一个人离得太近,所有敌人都会撤离玩家。

我如何将这段代码放入我的Enemy类中,或者如何将其留在EntityManager中,但是如何更新每帧并正确进行交互?

谢谢

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么您的问题是如何在一个ManagerClass中处理不同的EnemyClass?

您通常有一个基本敌人类(如果您没有在其中定义逻辑,也可以是一个接口),它提供了基本的行为。最重要的是,您可以定义特定的敌人类型。 您的经理班级只处理某种敌人清单,而逻辑则保留在特定的敌人班级中。 这是继承和多态的简单示例...

伪代码:

interface IEnemy
{
    void FollowPlayer();
}

class EnemySniper : IEnemy
{
    void FollowPlayer()
    {
        //Implement Followig Player Logic for Sniper
    }

}

class EnemyManager
{
    List<IEnemy> enemies = new List<IEnemy>();
    //Add all your enemies at gamestart or wherever

    foreach(IEnemy ie in enemies) //this needs to be called on each Update()
        ie.FollowPlayer();
}