Теория анимации. Добрый день, вечер, ночь, утро... В общем, добрые сутки, дорогие игроделы. Сегодня мы займёмся очень интересным занятием – рассмотрим платформу для анимационного воспроизведения, или просто – анимацию. Я вам поведаю, из чего состоит красивая, движущаяся картинка и как её проиграть. И так, начнём... У нас нет киноплёнки! Или из чего состоит анимация. Анимация, как и киноплёнка, состоит из кадров (frame). Эти кадры располагаются в памяти компьютера и определяются по идентификационным номерам (ID). Каждый кадр имеет последовательный номер (см-те Рис. 1.). Рис. 1. Расположение кадров в памяти. Что бы получить движение в кино, киноплёнка прокручивается со скоростью 24 кадр/секунда. В анимации движение происходит немного по-другому: кадры заменяются с определённым интервалом (interval). Интервал измеряется в миллисекундах (1000 мс. = 1 сек.). Замена кадра происходит по возрастанию ID. Если ID кадра = 0, то следующий 1 кадр; если ID кадра = 1, то следующий 2 кадр; и так далее. С таким же успехом можно создать движение в обратную сторону, уменьшая порядковый номер. На рисунке сбоку приведена GIF анимация, которая демонстрирует принцип замены кадров, увеличивая порядковый номер на один с интервалом в 200 мс. Теория кода. Я не буду приводить конкретный код программы, а рассмотрю его в виде псевдокода, либо расскажу. И первое, что попадает мне под «микроскоп» – это система загрузки изображения. В примере, который приложен к статье, рассматривается динамичная система загрузки. Суть её заключается в том, что бы создавать объекты в памяти, а указатели хранить в некотором массиве. В примере, в качестве массива, я использую обычный STL класс vector. Так же, для упрощения, можно использовать фиксированный массив картинок. Но это уже зависит от фантазии, нужды и способностей программиста. В самом начале создаётся по средствам оператора new объект TBitmap. Так же, с таким же успехом, можно создать объект BitMap, используя WinApi. Но это не главное. В результате создания объекта, оператор new возвращает адрес памяти, где расположился объект. Этот адрес есть тридцатидвухразрядное число. Используя метод приведения типа (cast), превращаем указатель в число. А получившееся число можно запихнуть в вектор. Для получения указателя проводим действия в обратном порядке. Хочу сделать одно замечание: в конце функции, где загружаются объекты в память, не надо вписывать оператор удаления объекта с созданным объектом. Минимум к чему приведёт эта ошибка – к вылету программы. И так, мы загрузили картинки, и теперь пришло время проиграть анимацию. Я в этой статье, и в примере, привожу упрощённый алгоритм управления воспроизведением. Головное управление производится увеличением некоего счётчика на единицу, пока значение счётчика не сравняется со значением интервала. В случае если интервал и счётчик сравнялись, счётчик устанавливается в нуль, а значение порядкового номера кадра, либо увеличивается, либо уменьшается на один. Когда порядковый номер кадра доходит до последнего кадра, либо до нуля, то он устанавливается в нуль, или в номер последнего кадра соответственно. Это всё, на псевдокоде, будет выглядеть так: Если счётчик == интервалу, то: Счётчику присваивается нуль. Если реверс == истине, то: Уменьшить ПосКадр на один; Если ПосКадр меньше нуля, то: ПосКадру присваивается ID_Последнего_кадра. В противном случае: Увеличить ПосКадр на один; Если ПосКадр больше ID_Последнего_кадра, то: ПосКадру присваивается нуль. В противном случае: Увеличить счётчик на один. В заключение. Я упомянул выше, что к статье приложен работоспособный пример. В заключении я его немного опишу. Пример платформы анимации написан на C++ Builder 6. В архиве примера представлен исходный код, 5 картинок в формате BMP, и бинарный, независимый от C++ Builder код (приложение). Скриншот: Надеюсь, что эта статья кому ни будь, поможет. С уважением BOOM... Скачать пример... |