абстрактная реализация для сложных действий, таких как ходьба - PullRequest
1 голос
/ 18 июля 2011

О, привет. Я младший Java-разработчик, работающий в свободное время над какой-нибудь 2D-игрой на основе плиток. Сейчас я пытаюсь реализовать самые основные вещи в игровой модели - как объекты разных типов взаимодействуют друг с другом. Я надеюсь когда-нибудь добавить поддержку сети, поэтому теперь действующие объекты изменяют свое состояние синхронно - когда singleton Ticker (работает в своем собственном потоке) уведомляет подписанные объекты с помощью .tick (), заставляя их выполнять объекты команд, ранее назначенные им. Реализация простых одно-тиковых действий, таких как подбор объекта, была довольно простой, например:

abstract class Character extends AbstractActing {

    void tick() {
        action.execute();
    }

    private void pickUp(Item item) {
        inventory.add(item);
    }

    private IAction action;

    //...

    class PickUp implements IAction {
        void execute() {
            //check if allowed to do
            pickUp(item)
        }

        PickUp(Item item) {
            this.item = item;
        }

        private Item item;
    }
}

Теперь я хочу написать скелетную реализацию для более сложных действий, таких как наложение какого-либо заклинания, удар по заднице или бегство к точке на карте. Я полагаю, что объекты, представляющие эти сложные действия, будут внутри себя превращаться в очередь простых атомарных инструкций. Например, команда «Walk (Location x)» будет внутренне использовать алгоритмы поиска пути для построения очереди «DoOneStep (Direction d)» и сможет перестроить ее, если что-то случится. Проблема в том, что для выполнения одного атомарного шага потребуется больше информации, например, скорость персонажа или тип грунта. Кстати, в зависимости от скорости персонажа, я мог бы изменить реальное местоположение персонажа, а не каждый тик. Я думаю, что я должен добавить некоторый объект step-executor внутри Action, который наблюдает за объектами, связанными с вычислениями, и обновляет его состояние.

Мой квест (наконец-то!) Таков: есть ли какие-то известные шаблоны дизайна, над которыми мне нужно медитировать? Мой код становится все более непонятным и не наследуемым с каждым редактированием, может быть, я перепишу всю действующую систему?

1 Ответ

2 голосов
/ 18 июля 2011

Возможно, вы захотите использовать шаблон State (также известный как шаблон State Machine , поскольку он основан на математической теории конечного состояниямашины).Идея состоит в том, что персонаж (или любой другой тип игрового объекта, в этом отношении) всегда находится в точно одном состоянии (выбранном из заранее определенного набора возможных состояний), и что определенные события могут вызывать переходы вдругие штаты.Затем метод tick() может выполнять различные действия в зависимости от текущего состояния.Более продвинутая версия этого шаблона - иметь классы для разных состояний и использовать экземпляры классов состояний для сбора информации, например, о том, как долго вы были в этом состоянии.Таким образом, в вашем случае возможными состояниями являются Walking, PickingUp, Idle и т. Д.

На самом деле, вы почти изобрели этот шаблон сами, поскольку ваша концепция IAction по сути одно и то жекак государство.Поэтому я думаю, что вы движетесь в правильном направлении.

Редактировать: Чтобы быть более конкретным в вашей ситуации, я бы посоветовал вам просто отказаться от требования, что IAction является атомным;вместо этого это может длиться несколько тиков.IAction.execute() должен просто выполнять столько действий, сколько может быть выполнено за один тик, например, пройти небольшое расстояние по нужному пути.Само действие может, например, отслеживать, где находится целевая позиция, как далеко он продвинулся и т. Д.

(Историческая справка: оригинальный движок Unreal Engine был основан на состояниях (и я предполагаю, что более новые версиитоже) - при кодировании, например, пользовательского оружия, вы должны разделить код на один раздел для каждого возможного состояния, например Firing, Reloading, Idle и т. д.)

...