XNA AI: управление врагами на экране - PullRequest
1 голос
/ 17 января 2011

У меня есть два класса, Человек и Монстр.

оба имеют Свойство с именем MoveBehavior

У человека есть HumanMoveBehavior, а у Monster есть MonsterMoveBehavior

Я хочу, чтобы HumanMoveBehavior переместилсяВдали от Monsters и MonsterMoveBehavior, чтобы переместить TOWARD Humans.

Проблема, с которой я столкнулся, заключается в том, куда мне поместить код для перемещения?

В классе Человек / Монстр?

Используя этот подход, у меня был метод Move (), который берет список всех сущностей в игре, решает, является ли он монстром или человеком, использующимметод с именем GetListOfOpponents (список всех спрайтов) и затем запускающий GetNearestOpponent (список оппонентов);

Но это выглядит очень грязно.

Должен ли я иметь SpriteController, который решает, куда перемещаются спрайты?Я не уверен, где мне нужно положить этот код :(

Спасибо!

Ответы [ 2 ]

5 голосов
/ 17 января 2011

Можно подумать о AIManager, который просто говорит:

foreach(GameObject go in m_myObjects) // m_myObjects is a list of all objects that require updating
{
    go.Update(); // standard GameObject function
}

После этого каждый класс должен заботиться о своем фрагменте кода. Так что обновление работает в самом классе.

Итак, Человек говорит:

// just a class which is a gameObject and also has moving behaviour
// do the same with monster
public class Human : GameObject, IMoveBehaviour
{
    public override Update()
    {
        GoMove();
    }

    public void GoMove()
    {
        // human specific logic here
    }
}

// This interface describes that some movement 
// will happen with the implementing class
public interface IMoveBehaviour
{
    void GoMove();
}

Используя интерфейс, вы можете сделать определенный язык частью класса, и вам не нужно ТАКЖЕ создавать какой-то класс, который будет обрабатывать это для вас. Конечно, это возможно. Но в реальной жизни человек / монстр движется, а не какой-то предмет, который он несет.

UPDATE

Ответ на комментарий. Поскольку есть AIManager, или даже полный GameObjectManager, было бы неплохо сохранить все GameObjects, вы можете попросить AIManager указать место, куда вы не могли бы пойти.

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

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

0 голосов
/ 30 января 2011

То, как Valve справился с этим для сущностей в Half Life 2, я думаю, является одним из лучших способов. Вместо того, чтобы давать каждому ИИ свои собственные отдельные методы Move и вызывать их, он просто вызывает метод Think () и позволяет объекту решать, что ему нужно делать.

Я бы согласился с тем, что говорит Marnix, и реализовал AIManager, который проходит через каждый активный ИИ в игровом мире, вызывая метод Think () для каждого. Я бы не рекомендовал сопрягать ваш класс Human с IMoveBehavior просто потому, что было бы лучше абстрагировать его в абстрактный класс WorldEntity.

У вас могут быть невидимые сущности, которые управляют такими вещами, как автосохранение, триггеры, освещение и т. Д., Но некоторые будут иметь положение в мире. Это те, у кого будет вектор, идентифицирующий их положение. Пусть метод ИИ Think () вызовет собственный метод move (), но оставит его закрытым. Единственный, кому нужно думать о перемещении, - это сам ИИ.

Если вы хотите побудить ИИ выйти за пределы метода Think), я бы предложил какой-то императив, такой как система планирования действий, ориентированных на цели (GOAP). Джефф Оркин написал об этой фантастической концепции, и она использовалась в играх, таких как F.E.A.R. и Fallout 3. Это может быть немного излишним для вашего приложения, но я подумал, что это интересно.

http://web.media.mit.edu/~jorkin/goap.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...