Animation parser for ZX Spectrum
Опять запилятор, спросит кто-то с затаенной радостью, кто-то с неприкрытой злобой. Не совсем. Как уже кое-кто сказал, это кастрированный запилятор: никакой автосборки, никакого автоподключения музыки, скроллов, анализаторов и т.п. Только парсинг. Парсер слегка оптимизирован, по сравнению с предыдущей версией. Вот отличия от печально известного Zapilyator™:
Адрес страницы: http://nyuk.retropc.ru/animation_parser_zx
Подготовку цвета и битности удобно делать в программе Gifsicle (Windows, Linux, FreeBSD, MacOS, DOS). Вот пример командного файла, который я когда-то писал (не спрашивайте, зачем там три прохода):
Можно добавить в GIF-файл информацию о цвете по методу Перцовский-Какос. Информация с атрибутами добавляется вниз картинки. У Какоса была для этого специальная утилита. Этот метод добавления цвета можно считать устаревшим, т.к. можно использовать в качестве источника цветные SCR-файлы.
Frame delay. Если отключить эту опцию, то в генерируем плеере не будет обработки задержек между кадрами. Задержки должен выставлять сам кодер. Экономия 12 байт на плеере, плюс 1 байт на каждый кадр анимации. Ну ускорение на несколько десятков фреймов.
С включенным «Frame delay» можно указать паузу между фреймами. Если выбрать опцию «Take from GIF», то можно получить различное время показа для разных кадров.
Memory model. Режим «48k» предполагает, что все кадры находятся в едином адресном блоке. Если это не так, то кодер должен сам переключать страницы, т.к. в плеере смена страниц отсутствует. Тем самым экономится 7 байт на плеере, плюс 1 байт на каждый кадр анимации. Ну и небольшое ускорение по тактам.
Режим «128k» добавляет в плеер код, переключающий страницы. Кроме того, в этом режиме можно задать ограничения на использование памяти в каждой из страниц. Это может пригодиться при объединении нескольких анимаций в один проект.
fast. Каталог с анимацией, оптимизированной по скорости. Объем данных при этом получается очень большой.
res — каталог с ресурсами.
player-fast-axxx.asm – плеер.
test-animation.asm – простейшая тестовая программа.
memsave. Каталог с этой же анимацией, но оптимизированной уже по объему. Скорость отрисовки в этом случае сильно падает. Внутренняя структура каталога такая же, как и в предыдущем случае.
diff. Список разниц между кадрами. Каждый файл – отдельный кадр. Внутри файла смещение относительно начала экрана и байт, который кладется по этому адресу. Может пригодится для ручной дальнейшей обработки. Например, можно написать свой парсер.
Не думаю, что мне удалось избавиться от всех багов. Так что, пробуйте, тестируйте. В случае ошибки высылайте мне исходный GIF и настройки парсера, а я уже буду смотреть.
- Нулевой кадр анимации исключен из проекта. На крупных анимациях можно получить неплохую экономию памяти.
- Возможность отключения задержек между кадрами. Кодер сам решает, когда вызывать очередной кадр.
- Отключение смены страниц памяти. Все кадры должны находиться в одной странице, или же кодер переключает страницы сам.
- Возможность тонкой настройки распределения памяти. Может пригодиться, если необходимо использовать несколько анимаций в одной задаче.
- Уникальное пространство имен каждой анимации для объединения нескольких штук в один проект.
Адрес страницы: http://nyuk.retropc.ru/animation_parser_zx
Подготовка источника: GIF
- Размер картинки желательно привести к 256x192. Можно больше, но тогда влезет только левая верхняя часть картинки. Можно меньше, тогда на спектруме картинка будет прижата в левый верхний угол экрана.
- GIF-файл должен быть черно-белый, в идеале — однобитный. Черный цвет — пиксели, белый — фон.
- Кадры не должны быть оптимизированы. Т.е. каждый кадр должен храниться внутри файла отдельным битмапом.
Подготовку цвета и битности удобно делать в программе Gifsicle (Windows, Linux, FreeBSD, MacOS, DOS). Вот пример командного файла, который я когда-то писал (не спрашивайте, зачем там три прохода):
gifsicle.exe --colors 256 %1 -o _1.gif
gifsicle.exe --unoptimize _1.gif -o _2.gif
gifsicle.exe --colors 2 _2.gif -o _3.gif
del _1.gif
del _2.gif
rename _3.gif %~n1-unoptimized.gif
Можно добавить в GIF-файл информацию о цвете по методу Перцовский-Какос. Информация с атрибутами добавляется вниз картинки. У Какоса была для этого специальная утилита. Этот метод добавления цвета можно считать устаревшим, т.к. можно использовать в качестве источника цветные SCR-файлы.
Подготовка источника: SCR
Кадры должны хранится в стандартных спектрумовских экранах 6912 или 6144 и запакованы в ZIP-архив. В архив можно добавить файл durations.txt, в котором описать порядок следования кадров и продолжительность показа каждого. Формат не помню, но если интересно – могу уточнить. Без этого файла кадры будут рассортированы по имени файла.Настройка парсера
GIF/ZIP file. Поле выбора файла для загрузки.Frame delay. Если отключить эту опцию, то в генерируем плеере не будет обработки задержек между кадрами. Задержки должен выставлять сам кодер. Экономия 12 байт на плеере, плюс 1 байт на каждый кадр анимации. Ну ускорение на несколько десятков фреймов.
С включенным «Frame delay» можно указать паузу между фреймами. Если выбрать опцию «Take from GIF», то можно получить различное время показа для разных кадров.
Memory model. Режим «48k» предполагает, что все кадры находятся в едином адресном блоке. Если это не так, то кодер должен сам переключать страницы, т.к. в плеере смена страниц отсутствует. Тем самым экономится 7 байт на плеере, плюс 1 байт на каждый кадр анимации. Ну и небольшое ускорение по тактам.
Режим «128k» добавляет в плеер код, переключающий страницы. Кроме того, в этом режиме можно задать ограничения на использование памяти в каждой из страниц. Это может пригодиться при объединении нескольких анимаций в один проект.
Результат
Нажимаем Parse, ждем какое-то время и скачиваем архив с результатом. Содержимое архива:fast. Каталог с анимацией, оптимизированной по скорости. Объем данных при этом получается очень большой.
res — каталог с ресурсами.
player-fast-axxx.asm – плеер.
test-animation.asm – простейшая тестовая программа.
memsave. Каталог с этой же анимацией, но оптимизированной уже по объему. Скорость отрисовки в этом случае сильно падает. Внутренняя структура каталога такая же, как и в предыдущем случае.
diff. Список разниц между кадрами. Каждый файл – отдельный кадр. Внутри файла смещение относительно начала экрана и байт, который кладется по этому адресу. Может пригодится для ручной дальнейшей обработки. Например, можно написать свой парсер.
Не думаю, что мне удалось избавиться от всех багов. Так что, пробуйте, тестируйте. В случае ошибки высылайте мне исходный GIF и настройки парсера, а я уже буду смотреть.
39 комментариев
А что за метод?
А так, читай выше. «Возможность тонкой настройки распределения памяти.» Не проблема зарезервировать нужные куски оперативки под экран.
Супер! То что нужно!
Не user friendly как-то.
То есть цвет не поддерживается?
А жаль!
Было бы интересно попробовать использовать проект для межуровневых анимаций в игре.
Поддерживается. ZIP-архив с SCR файлами.
Вообще удивительно что и скриптового спрайтового движка для таких вещей на спектруме тоже до сих пор нет.
про ACG был материал если не ошибаюсь в одном из недавних «За рулем»
про анимационные комплексы было много разговоров на ZXPKRU еще в эпоху первого запилятора
я накачал тогда их целую пачку, с Virtual TRDOS и ZXPress, и сравнивал на тестовой аниммации
в основном они полнокадровые, возможно в Animator 95 и/или чем то еще стареньком вроде есть работа со спрайтами, потом еще делали сжиматели анимации
Мне кажется тут какое-то недопонимание цели и средств.
Я одно время мечтал сделать запилятор с полноценным таймлайном, как в видеоредакторах…
вот тут пример анимации игровой, хотя ее конечно проще кодом сделать, по кадрам умучишься загонять, но лучьше бы вообще атвоматизировать:
www.youtube.com/watch?v=K-M_a4VbuWk
кстати на атари все попроще:
www.youtube.com/watch?v=iariVjOGzwg
Ну или на спектруме покадрово, если уж сильно хочется.
А ведь в играх часто еще есть сопроводительный текст, скажем как в Fire and Ice.
Кстати, а где подробности о методах сжатия анимации в сабже?
Ну в методе «fast» и описывать нечего. Там просто заполнение адресов через ld. Достаточно открыть исходник любого фрейма и всё станет понятно.
А вот метод «memsave» похитрее. Там два блока: блок команд и блок данных. Данные — это собственно байты, которые выкидываются на экран. А в командах каждый байт делится на собственно операцию (три бита) и числовой параметр (5 бит). Таким образом получается 8 команд с параметром от 0 до 63. И еще есть текущий адрес экрана.
Общий принцип такой. Берется очередная команда — выполняется. При необходимости берется следующий байт из блока данных. И так пока не пройдем весь блок.
Описание операций я потерял вместе с умершим винчестером, но по исходникам можно восстановить. Если интересно. Основные команды, это выкинуть текущий байт на экран N раз со сдвигом указателя экрана, увеличить указатель экрана на N байт (short jump), увеличить указатель экрана на N*256 байт (long jump). Остальные не помню.
покайтесьочнитесь! BGE+плагины и graphicsgale перекрывают на 146% вообще все потребности по манипуляциям с zx-графикой. Умейте пользоваться тем, что уже есть. А есть не мало! Для бге есть хороший плагин для анимации, работа с масками вообще в полуавтоматическом режиме, ротации, перемещение произвольной области попиксельно (правда своеобразно и через плагин, но все же), про graphicsgale даже и не говорю, разберитесь хоть чуть чуть, ёпта.Запилятор — пример такой идеологии, в получаемый код можно и своих эффектов добавить, правда, мало кто это сделал.
Но ему нужно еще последовательность кадров создать, а при этом возникает масса рутинных процессов для которых даже скрипт не напишешь…
А что такое bfox mod и чем он отличается фундаментально?