Существует ли общепринятая схема выполнения различных действий в игре? Способ, которым игрок может выполнять действия, а также то, что ИИ может выполнять такие действия, как движение, атака, самоуничтожение и т. Д.
В настоящее время у меня есть абстрактный BaseAction, который использует универсальные .NET для определения различных объектов, которые возвращаются различными действиями. Все это реализовано по схеме, аналогичной команде, где каждое действие отвечает за себя и делает все, что ему нужно.
Мои соображения об абстрактности таковы, что у меня может быть один ActionHandler, и AI может просто поставить в очередь различные действия, реализующие baseAction. И причина, по которой он является универсальным, заключается в том, что различные действия могут возвращать информацию о результате, относящуюся к действию (поскольку разные действия могут иметь совершенно разные результаты в игре), наряду с некоторыми распространенными реализациями beforeAction и afterAction.
Итак ... есть более приемлемый способ сделать это, или это звучит нормально?
источник
Ответы:
Я не думаю, что есть один приемлемый способ реализации этой концепции, но я действительно хотел бы поделиться тем, как я обычно справляюсь с этим в своих играх. Это что-то вроде комбинации шаблона проектирования Command и шаблона Composite .
У меня есть абстрактный базовый класс для действий, который представляет собой не что иное, как обертку вокруг
Update
метода, который вызывается в каждом кадре, иFinished
флаг, указывающий, когда действие закончилось.Я также использую шаблон составного дизайна, чтобы создать тип действий, который может содержать и выполнять другие действия. Это тоже абстрактный класс. Сводится к:
Затем у меня есть две реализации составных действий, одна для параллельного выполнения и одна для последовательного выполнения . Но прелесть в том, что, поскольку параллель и последовательность сами являются действиями, их можно объединять для создания более сложных потоков выполнения.
И тот, который управляет последовательными действиями.
При этом в месте , это просто вопрос создания реализации конкретных действий, а также с использованием
Parallel
иSequence
действий для управления потоком выполнения. Я закончу примером:Я успешно использовал эту систему для управления всем игровым процессом в графическом приключении и раньше, но, вероятно, она должна работать практически для чего угодно. Также было достаточно просто добавить другие типы составных действий, которые использовались для создания циклов выполнения и условных выражений.
источник
Draw
метод уже построен поверх состояния сущности, а изменения происходят автоматически. В рендерере с сохранением режима, таком как Flash, вы можете использовать наблюдаемый шаблон, чтобы вносить изменения в ваши объекты, распространяющиеся на экранные объекты, или устанавливать соединение вручную внутри самого объекта.Character
класса естьPosition
свойство иDraw
метод, который считывает текущее значениеPosition
и рисует там правильное изображение. В этой ситуации вам нужно только обновить значениеPosition
, чтобы результат автоматически отображался на экране.Character
естьPosition
свойство, но оно делегирует рендеринг некоторомуSprite
объекту, который автоматически рендерится графом сцены или чем-то еще. В этой ситуации вы должны убедиться, что и позиция персонажа, и позиция спрайта всегда синхронизированы, что требует немного больше работы. Тем не менее, в любом случае я не понимаю, почему менеджер действий должен иметь к этому какое-либо отношение. :)