В игровом программировании (и OOP в целом), когда мы решаем использовать команду по сравнению с шаблоном разработки состояний? - PullRequest
0 голосов
/ 25 апреля 2020

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

В настоящее время я работаю над проблемой в моей кодовой базе, которая, кажется, не может хорошо обернуть голову. В настоящее время у меня есть 3 «состояния взаимодействия», в которых могут находиться мои персонажи - пассивный, рукопашный бой или дальний бой.

И есть несколько вещей, которые я считаю командами, в которых персонаж может находиться в данный момент: движение, говорение, атака и т. Д. c. Но персонаж не может атаковать в пассивном состоянии или говорить в боевом состоянии - мой вопрос заключается в том, имеют ли эти команды больше смысла в качестве команд или состояний, и я могу построить параллельный / иерархический конечный автомат?

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

Пример состояния будет привязан к символьному объекту:

public class MeleeState : InteractionState
{
    public override void HandleInput(Character character, InteractionCommands command)
    {
        base.HandleInput(character, command);

        if (command == InteractionCommands.CHANGETOPASSIVE)
        {

        }
        else if (command == InteractionCommands.CHANGETORANGED)
        {

        }
        else
        {

        }
    }
}

Пример команды :

public class Attack : Command
{

    Attack(Character aggressor, Enemy victim)
    {

    }

    public override void Execute()
    {
        base.Execute();
    }

    public override void Undo()
    {
        base.Undo();
    }

    // Update is called once per frame
    void Update()
    {

    }
}

1 Ответ

0 голосов
/ 25 апреля 2020

Я думаю , все они могут рассматриваться как состояния. То есть пассивные, ходьба, прыжки, MeleeCombat ING , RangedCombat ING могут рассматриваться как состояния.
Мы передаем команду для ходьбы, поэтому состояние персонажа меняется с состояния бодрствования с пассивные состояния. И в тех случаях, которые вы указали, мы не должны предоставлять какую-либо реализацию для атаки, когда персонаж находится в пассивном состоянии, или не говорить реализацию, когда в боевом состоянии

В определенный момент времени персонаж находится в некоторое состояние, пока не будет дана команда (RangedCombatCommand). После получения команды персонаж будет в состоянии комбат и будет выполнять RangedCombat

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