понедельник, 29 марта 2010 г.

2D animation system мысли вслух

    В этой статье я попробую описать идеи по поводу создания анимационной 2D системы, которые у меня возникли за несколько лет работы.

    Во-первых, нужно определиться с требованиями к системе:
  • Система должна быть построена так, чтобы минимизировать дублирование данных, особенно графических.
  • Нужно минимизировать количество связей системы с внешним миром или хотя бы локализовать точи соприкосновения и привести их к общему интерфейсу.
  • Система должна уметь работать с анимацией как зашитой в один файл, так и набором изображений.
  • Нужна возможность проигрывать часть анимации, например с 1 по 10 кадр, либо только 5 кадр.
  • Нужна возможность задавать для одной и той же анимации различные свойства, например в одном месте зациклить анимацию, а в другом она должна проиграться все один раз, в третьем она должна играться в обратном направлении.
  • Хорошо было бы добавлять на анимацию различные действия, например проигрывать звук на определенном кадре анимации, или установить какой-то флаг на нужном нам кадре анимации.
    Теперь перейдем непосредственно к реализации системы. Ниже приведена диаграмма классов, к которой я пришел в конце концов и которая, как мне кажется, вполне отвечает требованиям перечисленным выше.



    Получилось даже некоторое подобие MVC (Model View Controller) структуры.
    В качестве контроллера выступает интерфейс Player. Он предоставляет интерфейс, который позволяет контролировать проигрывание анимации, и каждый кадр Player выдает структуру FrameData, которой вполне достаточно, чтобы нарисовать текущий кадр анимации.
    Но рисовать-то как раз Player и не умеет, эта задача полностью лежит на AnimationDriver. Данный класс представляет View в моей схеме. Он умеет рисовать кадр анимации, и также он хранит настройки материала, с которым будет применена текстура анимации.
    Последней составляющей системы является класс Entity2D. Он соединяет воедино все элементы системы и одновременно является моделью (Model). Класс содержит данные о трансформации объекта, его положении в мире.

    Пробежимся немного подробнее по дереву проигрывателей анимации, посмотрим что каждый из них умеет.

    AnimationPlayer - единственный проигрыватель, который имеет доступ к ресурсу анимации. Он умеет проигрывать анимацию с заданной скоростью от первого и до последнего кадра. Также у него можно запросить количество кадров в анимации и данные FrameData о каждом кадре.

    SequenceAnimationPlayer - это проигрыватель более высокого уровня, он может содержать и проигрывать последовательность из одного или нескольких AnimationPlayer-ов. Также он может проигрывать часть анимации. Данный клас уже содержит некоторые параметры, которые помогают управлять проигрыванием анимации. Например стартовый кадр, направление проигрывания. Еще одной сильной особенностью данного проигрывателя является возможность работать с тегами для анимации.

    ChooserPlayer - данный проигрыватель содержит список проигрывателей и по заданному условию может выбирать одну из них. Разновидностью этого проигрывателя является RandomChooserPlayer, который случайным образом выбирает анимацию для проигрывания.

    StateAnimationPlayer - этот класс представляет собой анимационную машину состояний, он содержит набор состояний, между которыми может переключатся в любой момент по заданному условию. Каждое состояние StateNodeAnimationPlayer содержит другой анимационный проигрыватель. В качестве условия для перехода можно задать все что угодно, на что хватит фантазии. Например, если движок поддерживает скриптовый язык, то в качестве условий можно задавать функции написанные на этом языке. Как мне кажется, очень удобный инструмент для дизайнеров.

Пожалуй, на сегодня все. Пора заканчивать ночные посиделки. В следующий раз попробую представить первый вариант реализации этой системы. И может быть она даже будет работать :).

Всем доброй ночи.

понедельник, 22 марта 2010 г.

проверка связи

Привет всем.

Это тестовое сообщение, проверка связи.
Я настроил отправку записей в блог через почту.

Теперь хочу посмотреть на результат.

Доброй всем ночи.