Animation parser for ZX Spectrum

Опять запилятор, спросит кто-то с затаенной радостью, кто-то с неприкрытой злобой. Не совсем. Как уже кое-кто сказал, это кастрированный запилятор: никакой автосборки, никакого автоподключения музыки, скроллов, анализаторов и т.п. Только парсинг. Парсер слегка оптимизирован, по сравнению с предыдущей версией. Вот отличия от печально известного Zapilyator™:
  • Нулевой кадр анимации исключен из проекта. На крупных анимациях можно получить неплохую экономию памяти.
  • Возможность отключения задержек между кадрами. Кодер сам решает, когда вызывать очередной кадр.
  • Отключение смены страниц памяти. Все кадры должны находиться в одной странице, или же кодер переключает страницы сам.
  • Возможность тонкой настройки распределения памяти. Может пригодиться, если необходимо использовать несколько анимаций в одной задаче.
  • Уникальное пространство имен каждой анимации для объединения нескольких штук в один проект.

Адрес страницы: 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 и настройки парсера, а я уже буду смотреть.

37 комментариев

avatar
avatar
Можно добавить в GIF-файл информацию о цвете по методу Перцовский-Какос

А что за метод?
avatar
Берется пачка цветных scr-файлов. Отрезается атрибутная информация и приклеивается ниже пикселей в виде 1-битной графики. Получается размер каждой картинки 256x212. Всё это склеивается в GIF-файл, который можно скормить парсеру. Написано это было до того, как появилась нативная поддержка SCR-файлов. Сейчас проще запаковать эту пачку SCR в ZIP-архив и залить в парсер.
avatar
Немного непонятно. Я писал утилиту, которая сканирует атрибуты и выводит на экран. И вот еще что: а реально ли втиснуть страницу 2? Понятно, что память может быть занята, но вдруг влезет?..
avatar
Сам парсер настроен на адрес #4000. Изменить на #c000 оно вроде бы один байт поменять, да. Но придется кучу PHP-кода переписывать. Но. Если использовать метод memsave, то достаточно один байт заменить в ресурсе каждого фрейма.

А так, читай выше. «Возможность тонкой настройки распределения памяти.» Не проблема зарезервировать нужные куски оперативки под экран.
avatar
ох, я уж думал что будет stand Alone версия…
  • VBI
  • +1
avatar
«Дай человеку удочку, а не рыбу». Хороший шаг :)
avatar
И гигантский прыжок для всего прогрессивного сообщества! :)
avatar
VBI , moroz1999 да в принципе и раньше никому не мешало скачать скрипты, поставить PHP, поколдовать с командной строкой… много чему полезному можно будет научиться. а кто не осилил — тот не осилил :)
avatar
Режим «128k» добавляет в плеер код, переключающий страницы. Кроме того, в этом режиме можно задать ограничения на использование памяти в каждой из страниц. Это может пригодиться при объединении нескольких анимаций в один проект

Супер! То что нужно!
avatar
Мы его теряем
avatar
неа, на конфу не собираюсь пока :)
avatar
«А ведь придется...»
avatar
Нулевой кадр анимации исключен из проекта. На крупных анимациях можно получить неплохую экономию памяти.
А чего бы его не сжимать лазеркомпактом?

Кадры не должны быть оптимизированы. Т.е. каждый кадр должен храниться внутри файла отдельным битмапом.
Не user friendly как-то.

GIF-файл должен быть черно-белый, в идеале — однобитный. Черный цвет — пиксели, белый — фон.
То есть цвет не поддерживается?
А жаль!
Было бы интересно попробовать использовать проект для межуровневых анимаций в игре.
avatar
А чего бы его не сжимать лазеркомпактом?
Потому что это не запилятор. Кодер-то на что?

То есть цвет не поддерживается?
А жаль!
Было бы интересно попробовать использовать проект для межуровневых анимаций в игре.
Поддерживается. ZIP-архив с SCR файлами.
avatar
Простейший способ инвертировать черно-белую гифку в бело-черную. В обратную сторону работает тоже.
gifsicle.exe --change-color #ffffff #000000 --change-color #000000 #ffffff %1 -o %~n1-i.gif
  • nyuk
  • +2
avatar
Я поясню. Вот например делаю я игру. Художник сразу же во флеше делает мультики. Графика там спектрумовская. Флеш исключительно для анимаций и таймлайна. Можно конечно разбить все на спрайты написать движок. А можно (бы) в лоб сконвертировать чем-то вроде сабжа и проиграть как аниму.
Вообще удивительно что и скриптового спрайтового движка для таких вещей на спектруме тоже до сих пор нет.
avatar
да движков то чуть ли не десятки. AGC самое оно и есть скриптовый спрайтовый движок. и всяких анимационных комплексов много
avatar
AGC? На PC или online редактор есть? Каких комплексов? Animator 95 года от Величутина? Возможно я немного отстал. Называй пожалуйста сразу названия.
avatar
Так на спектруме или на PC?
avatar
На PC. Если вы кодите в SJAsm то почему художник должен возится с AGC в эмуляторе?
avatar
вот если честно очень лениво мне погуглить и вспоминать давние обсуждения
про ACG был материал если не ошибаюсь в одном из недавних «За рулем»
про анимационные комплексы было много разговоров на ZXPKRU еще в эпоху первого запилятора
я накачал тогда их целую пачку, с Virtual TRDOS и ZXPress, и сравнивал на тестовой аниммации
в основном они полнокадровые, возможно в Animator 95 и/или чем то еще стареньком вроде есть работа со спрайтами, потом еще делали сжиматели анимации
avatar
sjasm компилит и собирает, кодить-то хоть в чём и хоть где можно, всё дело в удобстве. А вот у художника смотря какая цель стоит и что он хочет получить в итоге. Никто не запрещает использовать любые утилиты на любой платформе.

Мне кажется тут какое-то недопонимание цели и средств.
avatar
По моему мысль понятная, вижу это так: Человек хочет делать скажем анимационные вставки в игре: раскрыть сюжет, повысить привлекательность, мультик за 999 очков показать наконец. «по правильному» тут надо кодить и кодить, отлаживать и отлаживать. Проблемма в том что этот кодинг, мало того что рутинный, он сильно отвлекает от кода игры и вообще творческого процесса, пожирает временные ресурсы. Хочется мышкой надвигать и получить мультик как например в xevious 128. А тулзов для этого реально полноценных практически нет. Да и делать их — труд тяжкий.
Я одно время мечтал сделать запилятор с полноценным таймлайном, как в видеоредакторах…
avatar
блин нет не xevious. такая желтая игрушка, в изометрии, основной экран шестиугольниками оформлен по краям там такие штуковины виде шариков на длинных ножках еще… не вспомню название
avatar
Amaurote
avatar
Ой спасибо!
вот тут пример анимации игровой, хотя ее конечно проще кодом сделать, по кадрам умучишься загонять, но лучьше бы вообще атвоматизировать:
www.youtube.com/watch?v=K-M_a4VbuWk
кстати на атари все попроще:
www.youtube.com/watch?v=iariVjOGzwg
avatar
Почему на PC не сделать в любой удобной\доступной программе? Прогнав через парсер получишь аниму.
Ну или на спектруме покадрово, если уж сильно хочется.
avatar
Так парсер цвет умеет только в scr. Значит цепочка софта удлиняется минимум на bmp2scr.
А ведь в играх часто еще есть сопроводительный текст, скажем как в Fire and Ice.
Кстати, а где подробности о методах сжатия анимации в сабже?
avatar
Так парсер цвет умеет только в scr. Значит цепочка софта удлиняется минимум на bmp2scr.
Думал о цветных GIF. Упирается всё в написание собственного (очередного) аналога bmp2scr. Я не готов.

Кстати, а где подробности о методах сжатия анимации в сабже?
Ну в методе «fast» и описывать нечего. Там просто заполнение адресов через ld. Достаточно открыть исходник любого фрейма и всё станет понятно.

А вот метод «memsave» похитрее. Там два блока: блок команд и блок данных. Данные — это собственно байты, которые выкидываются на экран. А в командах каждый байт делится на собственно операцию (три бита) и числовой параметр (5 бит). Таким образом получается 8 команд с параметром от 0 до 63. И еще есть текущий адрес экрана.

Общий принцип такой. Берется очередная команда — выполняется. При необходимости берется следующий байт из блока данных. И так пока не пройдем весь блок.

Описание операций я потерял вместе с умершим винчестером, но по исходникам можно восстановить. Если интересно. Основные команды, это выкинуть текущий байт на экран N раз со сдвигом указателя экрана, увеличить указатель экрана на N байт (short jump), увеличить указатель экрана на N*256 байт (long jump). Остальные не помню.
avatar
Думал о цветных GIF. Упирается всё в написание собственного (очередного) аналога bmp2scr. Я не готов
Так и не надо bmp2scr. Надо же обратную конверсию спектрумовского изображения из пикселей в scr. А для этого уже есть pxl2scr by introspec.
avatar
Кстати да. Любой начинающий скриптолог напишет обвязку, чтобы одним кликом делать GIF -> ZIP-архив с SCR
avatar
а такие программы есть ли? чтобы монохромный спрайт да с масочкой да подвигать. Это конечно утопия, но это же совсем другое дело иметь софт, оптимизированный под формат.
avatar
Люди, покайтесь очнитесь! BGE+плагины и graphicsgale перекрывают на 146% вообще все потребности по манипуляциям с zx-графикой. Умейте пользоваться тем, что уже есть. А есть не мало! Для бге есть хороший плагин для анимации, работа с масками вообще в полуавтоматическом режиме, ротации, перемещение произвольной области попиксельно (правда своеобразно и через плагин, но все же), про graphicsgale даже и не говорю, разберитесь хоть чуть чуть, ёпта.
avatar
Ну разве кто спорит, можно конечно. Нарисовать. Но мы говорим не про создание графики — мы говорим про создание анимации, причем в духе — задал перемещения спрайтов, тексты, даже эффекты какие, нажал кнопку — получил исходник для компиляции в составе своей проги.
Запилятор — пример такой идеологии, в получаемый код можно и своих эффектов добавить, правда, мало кто это сделал.
Но ему нужно еще последовательность кадров создать, а при этом возникает масса рутинных процессов для которых даже скрипт не напишешь…
avatar
Я одно время мечтал сделать запилятор с полноценным таймлайном, как в видеоредакторах…
Я тоже. Даже есть начатый и заброшенный проект. Около процента-двух всей работы сделано было. :-)
avatar
Nyuk, очень крутая вторая серия. Буду пользоваться.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.