EDIT: Щоб уточнити, що конкретно моє питання: чи це хороший спосіб обробляти анімацію / стан анімації в ігровому двигуні з оглядом на створення вмісту / управління вмістом? Які недоліки в цьому зробити і який був би альтернативний спосіб зробити це? - Хоча на мою відповідь частково відповіли в коментарях, оскільки, здається, це саме шлях.
Я намагаюся обробляти анімації в проекті 2-ігрового хобі з двигунами , без жорсткого кодування. Стани анімації жорсткого кодування здаються мені звичайним, але дуже дивним явищем.
Невелика довідка: я працюю із сутнісною системою, де компоненти є пакетами даних і на них підсистеми діють. Я вирішив використовувати систему опитування для оновлення станів анімації.
Під анімаційними станами я маю на увазі: "ходьба_ліва", "біг_ліфт", "ходьба_право", "зйомка", ...
Моя ідея обробляти анімацію полягала в тому, щоб створити її як модель, керовану даними . Дані можуть зберігатися у XML-файлі, rdbms, ... І можуть бути завантажені на початку гри / рівня / ... Таким чином ви можете легко редагувати анімації та переходи, не потребуючи змінити код скрізь у вашому гра.
Як приклад, я зробив набір проектів визначень даних xml .
Одним з дуже важливих даних буде просто опис анімації . Анімація матиме унікальний ідентифікатор (описове ім'я). Він міститиме посилання на зображення (аркуш спрайту, який він використовує, оскільки різні анімації можуть використовувати різні спрайтові листи). Кадри в секунду для запуску анімації. Тут "повтор" визначає, чи мусить анімація працювати один раз чи нескінченно. Потім я визначив список прямокутників як кадри.
<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>
Ці стани можуть бути оброблені системою опитування . Кожна гра відмічає поточний стан ігрової сутності та перевіряє всі тригери. Якщо умова виконується, вона змінює стан суб'єкта господарювання на стан "goto".
Остання частина, з якою я зіткнулася, полягала в тому, як прив’язати дані анімації та стани анімації до сутності . Мені здавалося, найбільш логічним підходом є додавання покажчика до даних про стан машини, якими користується сутність, і для кожного стану в цій машині для того, щоб визначити, яку анімацію він використовує.
Ось приклад xml, як я б визначив поведінку анімації та графічне представлення деяких загальних об'єктів у грі, адресуючи стан анімації та ідентифікатор даних анімації. Зауважте, що і "майстер", і "орк" мають однакові стани анімації, але різні анімації. Також інша анімація може означати інший аркуш спрайта або навіть іншу послідовність анімацій (анімація може бути довшою чи коротшою).
<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.
-
Це те, що я придумав після деяких досліджень. Однак у мене виникли проблеми з обертанням голови, тому я сподівався на відгуки. Чи є тут щось, що не має сенсу, або є кращий спосіб впоратися з цими речами? Я зрозумів ідею про повторення кадрів, але мені важко зробити крок далі, і це моя спроба зробити це.