Найти в Дзене
Самоучка

Простая анимация на компьютере Спринтер

И снова здравствуйте. Давно ничего не публиковал, пришло время исправляться. На этот раз речь пойдёт про анимацию всё тех же BMP файлов. Точнее разберём GIF файл на BMP файлы и соберём уже в свой файл, со своим форматом и попробуем воспроизвести. Выбираем сохранить изображение, после чего в том же яндексе ищем какой нибудь онлайн конвертер из gif to bmp и собственно конвертируем анимацию в кучу bmp файлов. Полученный результат скачиваем и распаковываем в отдельную папку. После чего нужно загрузить все эти изображения (ну или по очереди) в графический редактор, я использую для этих целей обычно PhotoShop. У меня при конвертировании из GIF в BMP получилось 27 кадров от 0 до 26. Что же, придется попотеть, но пока собственного конвертера у меня нет. Задачи следующие: Уменьшить изображение по ширине до 320 пикселей, по высоте можно оставить столько, сколько предложит сам редактор, что бы сохранить симметрию. Затем, привести все изображения к одной палитре цветов (Индексированные цвета). ВА

И снова здравствуйте.

Давно ничего не публиковал, пришло время исправляться.

На этот раз речь пойдёт про анимацию всё тех же BMP файлов.

Точнее разберём GIF файл на BMP файлы и соберём уже в свой файл, со своим форматом и попробуем воспроизвести.

Выбираем сохранить изображение, после чего в том же яндексе ищем какой нибудь онлайн конвертер из gif to bmp и собственно конвертируем анимацию в кучу bmp файлов.

-2

Полученный результат скачиваем и распаковываем в отдельную папку.

После чего нужно загрузить все эти изображения (ну или по очереди) в графический редактор, я использую для этих целей обычно PhotoShop.

-3

У меня при конвертировании из GIF в BMP получилось 27 кадров от 0 до 26.

Что же, придется попотеть, но пока собственного конвертера у меня нет.

Задачи следующие:

Уменьшить изображение по ширине до 320 пикселей, по высоте можно оставить столько, сколько предложит сам редактор, что бы сохранить симметрию.

-4

Затем, привести все изображения к одной палитре цветов (Индексированные цвета).

-5

ВАЖНО к ОДНОЙ ПАЛИТРЕ ВСЕ ИЗОБРАЖЕНИЯ!!!

После чего все эти изображения перевернуть на один бок (на лево 90 градусов).

-6

... и так 27 раз...

Все эти манипуляции связаны с тем, что акселератор компьютера Спринтер имеет буфер в 256 байт и высота экрана у нас также равна 256 пикселам. К тому же переключение Y_PORT так же в этом случае ложиться на плечи акселератора.

Мне же останется переключать только Х координату.

В общем, после того как мы поменяли размер всем нашим изображениям, затем перевернули их на левый бок и проиндексировали все цвета к ОДНОЙ ПАЛИТРЕ (к слову важно, хоть и не обязательно выбрать кадр с наиболее подходящей палитрой цветов)! Даём нашим рукам и глазам отдохнуть, после чего приступаем к следующему действию. А именно, отделяем палитру от любого нашего сохраненного кадра и сохраняем её отдельно (помните ещё из предыдущей статьи как устроен BMP файл?), после чего уже из всех сохраненных ранее изменённых файлов сохраняем BitMap изображений. Здесь я немного решил упростить себе жизнь и написал небольшую утилиту на бейсике, которая хоть и не в автоматическом (пока) режиме, но всё же позволяет проделать эти действия менее болезненно.

-7

Данной утилитой сохраняю палитру в файл palette.pal

а кадры (bitmap) просто нумерую от 00 до 26 и так же их сохраняю. этот процесс немного быстрее предыдущего, но так же занимает какое то время.

Теперь нужно создать шапку файла и все полученные ранее файлы склеить между собой.

Шапка файла будет содержать следующую информацию: первый байт - это количество кадров, следующие два байта это ширина кадра (в нашем случае она равна 320 пикселам), затем ещё один байт - это высота кадра (сейчас она равна 180 пикселам) и номер цвета палитры для фона (нужно, когда кадр не занимает по высоте весь экран, что бы экран не очищался случайным цветом из палитры). Эту шапку я так же подготовил на бейсике и полученный файл сохранил с названием head.bin

Чтобы склеить все эти файлы между собой, можно воспользоваться командой DOS copy с параметром /b, после чего через + перечислить все склеиваемые файлы и через пробел указать имя файла в котором всё будет собрано. Я это сделал так:

copy /b head.bin+palette.pal+00+01+02+03+04+05+06+07+08+09+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26 termin.sgi

(лучше всего это сделать через bat файл, поможет избежать ошибки и не набирать строку повторно в случае таковой)

Ну что же, файл нужного содержания получен. Теперь нужно написать код, который сможет всё это вывести на экран компьютера Спринтер.

Начну с загрузки файла. files.asm

К сожалению ДЗЕН так и не научили выводить код, поэтому публикую всё так же скриншоты, с подробными комментариями.

-8
-9

В кратце, открываем файл путь к которому находится в HL перед вызовом процедуры. Считываем 1029 байт где у нас находится заголовок файла с его параметрами и палитра. После этого вычисляем сколько страниц памяти нам запросить у операционной системы, вычисляем какими частями нам в эти страницы грузить файл в память. Вычисляем это исходя из высоты кадра умноженную на 64. Соответственно грузим файл в память.

Небольшая процедура PrintLoad отображает процесс загрузки в виде символов # на экране, после имени файла. По факту показывает количество загруженных страниц. Данная функция больше нужна, что бы пользователь не подумал, что компьютер завис.

Теперь разберемся с выводом загруженного файла на экран. graphics.asm

-10

Процедуры представленные на скриншоте выше, устанавливают графический режим. Устанавливают и копируют во второй экран палитру, а так же очищают экран.

-11

Далее описаны процедуры выводящие часть кадра на экран с заданными размерами и по указанным координатам. Затем FlipBuffer - процедура позволяющая выбрать в какой экран будет отрисован данный кадр и FlipScreen какой экран в данный момент выводится на монитор. Данные две процедуры нужны, что бы избежать разрыв кадра в момент отрисовки. т.е. рисуем в один экран, показываем другой.

Ну и собственно основной код файла main.asm:

-12

здесь мы подключаем необходимые для работы библиотеки, которые были описаны в предыдущих статьях, такие как описание функций Dos. Затем перво наперво мы выводим название нашей программы на текстовый экран. Начиная с 26 строки, мы узнаём где у нас находится адрес командной строки, которая и будет принимать у нас как параметр Dos имя и путь к проигрываемому файлу. После чего выделяем полученный путь специальной функцией Dos (#47 с параметром 7) и выводим полученную информацию так же на экран, что бы показать пользователю, какой файл в данный момент загружается.

После чего собственно и загружаем сам файл в память. Когда файл загружен, узнаем высоту кадра и ищем положение по Y, что бы картинка была в центре экрана. Устанавливаем этот параметр в процедуру отрисовки, а заодно и номер палитры, которым будем очищать экран, который мы до этого прописали в заголовке файла, когда его собирали.

После этого устанавливаем графический режим 320*256 подключаем в третье окно процессора видеостраницу, устанавливаем и копируем во второй экран загруженную палитру, очищаем экран и переходим в основной цикл который будет отрисовывать нам анимацию, вызывая поочереди необходимые процедуры и опрашивая клавиатуру, что бы в любой момент можно было выйти из просмотра анимированного файла.

-13
-14

Собственно выводом занимается процедура back2:

Почему такое название? Ну в процессе экспериментов было несколько вариантов, остался только этот. Данная процедура тупо передает полученные и рассчитанные параметры в процедуру DrawSpriteVert. Ну и соответственно в цикле всё это по кругу вызывается.

Сам проигрыватель назвал sgiver.exe (придумал не сам, подсказали), а расширение просматриваемым файлам sgi (от Sprinter GIF).

В общем копируем скомпилированный файл в на образ эмулятора спринтера МАМЕ вместе с файлом анимации. Прописываем проигрыватель на горячую клавишу F3

-15
-16

И собственно запускаем просмотр:

Процесс загрузки
Процесс загрузки
Собственно анимация
Собственно анимация

Чуть позже выложу ролик с анимацией нескольких сконвертированных файлов, включая данный.

На этом на сегодня всё, всем пока.

PS...

Не смотря на то, что в заголовке анимации файла присутствует такой параметр, как width (ширина изображения), в проигрыватель данный параметр никак не реализован. Дело в том, что я почему то посчитал, что размер экрана и без того у данного компьютера небольшой, что бы и картинку делать ещё меньше.

Возможно в будущем реализуются, как и проверку на наличие файла, а так же свободной памяти под загрузку такового. На текущий момент это так же не реализовано.

Тем не менее, приложив некоторое усилие, можно сделать свои анимированные картинки и для данного компьютера.

В будущем есть планы написать конвертер gif to sgi. Но время покажет, справлюсь или нет.