РЕДАКТИРОВАТЬ: Чтобы уточнить, что именно мой вопрос: это хороший способ обрабатывать анимацию / состояние анимации в игровом движке с прицелом на создание / управление контентом? Каковы недостатки в том, чтобы делать это таким образом, и какой альтернативный способ сделать это? - Хотя на мой ответ частично ответили в комментариях, похоже, это путь.
Я пытаюсь работать с анимацией в проекте, посвященном движку 2D-игр , без жесткого программирования. Жесткое кодирование состояний анимации кажется мне обычным, но очень странным явлением.
Немного предыстории: я работаю с системой сущностей, где компоненты представляют собой пакеты данных, а подсистемы действуют на них. Я решил использовать систему опроса для обновления состояний анимации.
С состояниями анимации я имею в виду: "ходьба_лева", "ходьба_лева", "ходьба_право", "стрельба", ...
Моя идея обработки анимации состояла в том, чтобы спроектировать ее как модель, управляемую данными . Данные могут храниться в XML-файле, rdbms, ... и могут быть загружены в начале игры / уровня / ... Таким образом, вы можете легко редактировать анимацию и переходы, не изменяя код повсюду в вашем файле. игра.
В качестве примера я сделал черновой набросок определений данных, которые я имел в виду.
Одним из очень важных данных будет просто описание анимации . Анимация будет иметь уникальный идентификатор (описательное имя). Он будет содержать ссылочный идентификатор изображения (используемый им спрайт-лист, потому что разные анимации могут использовать разные спрайт-листы). Кадры в секунду для запуска анимации. Здесь «повтор» определяет, должна ли анимация запускаться один раз или бесконечно. Затем я определил список прямоугольников как фреймы.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
Данные анимации будут загружаться и храниться в пуле ресурсов анимации, и на них будут ссылаться игровые объекты, которые их используют. Это будет рассматриваться как ресурс, как изображение, звук, текстура, ...
Вторым элементом данных, который нужно определить, будет конечный автомат для обработки состояний анимации и переходов. Это определяет каждое состояние, в котором может находиться игровой объект, в какие состояния он может перейти и что вызывает изменение этого состояния.
Этот конечный автомат будет отличаться от объекта к объекту. Потому что у птицы могут быть состояния «ходьба» и «полет», в то время как у человека будет только состояние «ходьба». Однако он может быть разделен между различными объектами, потому что несколько людей, вероятно, будут иметь одинаковые состояния (особенно когда вы определяете некоторых общих NPC, таких как монстры и т. Д.). Кроме того, у орка могут быть те же состояния, что и у человека. Просто чтобы продемонстрировать, что это определение состояния может быть общим, но только для выбранной группы игровых объектов .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
Эти состояния могут обрабатываться системой опроса . Каждый тик игры захватывает текущее состояние игрового объекта и проверяет все триггеры. Если условие выполнено, оно меняет состояние объекта на состояние «Перейти».
Последняя часть, с которой я боролся, заключалась в том, как связать данные анимации и состояния анимации с сущностью . Мне показалось, что наиболее логичный подход - добавить указатель на данные конечного автомата, который использует объект, и определить для каждого состояния в этом компьютере, какую анимацию он использует.
Вот пример XML, как я бы определил поведение анимации и графическое представление некоторых общих сущностей в игре, обращаясь к состоянию анимации и идентификатору данных анимации. Обратите внимание, что и "wizard", и "orc" имеют одинаковые состояния анимации, но разные анимации. Кроме того, другая анимация может означать другой лист спрайта или даже другую последовательность анимаций (анимация может быть длиннее или короче).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
Когда объект создается, он добавляет список состояний с данными конечного автомата и ссылкой на данные анимации.
В будущем я бы использовал систему сущностей для создания целых сущностей, определяя компоненты в аналогичном формате xml.
-
Это то, что я придумал после некоторых исследований. Однако у меня возникли некоторые проблемы, и я надеялся получить обратную связь. Есть ли здесь что-то, что не имеет смысла, или есть лучший способ справиться с этими вещами? Я понял идею итерации по кадрам, но у меня возникли проблемы, чтобы сделать шаг вперед, и это моя попытка сделать это.