Я хочу создать вражеский искусственный интеллект для типа врага-снайпера в Monogame - PullRequest
0 голосов
/ 07 декабря 2018

Я уже реализовал базовое поведение последователя для другого врага

    // 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 хранит списки всех добавленных вражеских объектов.Когда я помещал поведение снайпера в класс врага, оно работало, но все враги отступали от игрока, если он находился слишком близко.

Как я мог поместить этот код в свой класс врага или как я мог уйти?это в EntityManager, но заставить его обновлять каждый кадр и правильно взаимодействовать?

Спасибо

1 Ответ

0 голосов
/ 10 декабря 2018

Если я правильно понял, ваша проблема в том, как обрабатывать различные EnemyClasses в одном ManagerClass?

У вас обычно есть класс Base-Enemy (также может быть интерфейсом, если вы не определяете логику там), который обеспечиваетосновное поведение.Кроме того, вы определяете конкретные типы врагов.Ваш класс менеджера просто обрабатывает некоторый список врагов, в то время как логика содержится в определенном классе врагов.Это простой пример наследования и полиморфизма ...

Псевдокод:

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();
}
...