Враги ИИ сходятся на друг друга, преследуя игрока - PullRequest
4 голосов
/ 10 января 2012

Я создал врагов, которые преследуют игрока вокруг игры, но есть проблема.Враги слишком совершенны и быстро сходятся друг с другом, когда приближаются к игроку.Это потому, что они просто двигаются в направлении игрока при каждом обновлении игры.

Я хотел бы внести некоторую случайность во врагов, возможно, с углом движения.Это то, что я до сих пор (я не оптимизировал это, поскольку это еще не сделано, поэтому я знаю о высоких накладных расходах):

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

Ответы [ 4 ]

4 голосов
/ 10 января 2012

Значительная часть тактики ИИ (так же как и тактика человека, кстати) заключается не только в том, чтобы знать и действовать в зависимости от того, где находится враг, но также и в том, чтобы знать, где находятся ваши союзники. Большинство самых простых и известных маневров невозможно без этого (подумайте об окружении).

Многое из этого сводится к тому, что "не подходите слишком близко к союзнику, если вы можете избежать этого".

Итак, в основном вам нужно управлять своей силой таким образом, чтобы она не только привлекалась противником, но и отвергалась союзником (в меньшей степени). Объедините это с двухступенчатым путеводным устройством, и все готово.

2 голосов
/ 10 января 2012

Большинство игр обходят это, когда враги блокируют друг друга, чтобы они не двигались в одно и то же пространство.

Это может быть реализовано как жесткое ограничение (например, разрешен только один враг)в каждом квадрате никакие другие враги не могут переместиться в уже занятый квадрат) или мягкое ограничение (некоторая скрытая «сила», которая раздвигает врагов, если они оказываются слишком близко друг к другу).

1 голос
/ 10 января 2012

Промежуточное решение - иметь разные стратегии для разных ИИ. например один ИИ, который находится там, где сейчас находится игрок, другой ИИ, который находится там, где движется игрок, другой, который обычно пытается вывесить несколько подразделений к югу от игрока, кроме случаев, когда игрок движется прямо к нему, ...

Это не так хорошо, как иметь стратегию, в которой ваши ИИ учитывают, где находятся его друзья, но (при правильном написании) они будут вести себя иначе.

0 голосов
/ 10 января 2012

В прошлом году я должен был написать игру PACMAN для одного из курсов, которые я прошел

Я использовал Алгоритм поиска A-Star для врагов

Запуск этогоПрямой алгоритм выдаст совершенных врагов .

Хитрость заключается в том, чтобы добавить некоторую случайность к результату алгоритма - заставить врага «делать ошибки», когда уровень сложности понижается (т.е. идти в направлении, отличном от заданного алгоритма, когда уровень сложности понижаетсяКенемей делает больше «ошибок»)

...