Написал скрипт для преобразования PBM в спрайт в формате C-файлов. Скрипт не быстрый, но рабочий.
https://github.com/salextpuru/sdcc-n...ts/pbm2sprmov0
Как работает? Очень просто.
Например, есть файл moln.pbm.
Если нам нужен монохромный спрайт - то пишем:
Если нам нужен спрайт желтый INK черный PAPER - то пишем:Код:./pbm2sprmov0 moln.pbm 4
Теперь о параметрах:Код:./pbm2sprmov0 moln.pbm 4 6
moln.pbm - это имя входного файла. Тут всё ясно.
4 - количество фаз движения спрайта, содержащихся в файле. Предполагается, что все фазы движения - одинаковы по размеру.
6 - цвет. В нашем примере - желтый. Если он не задан, то спрайты будут создаваться без атрибутов. Если задан - то будут добавлены атрибуты.
После того, как скрипт отработает, появятся два файла: moln.c и moln.h.
В них будет информация о спрайте, его размеры, цвет (или его отсутсвие). Отдельно - каждая фаза спрайта и массив указателей на фазы.
Как все это работает смотрим тут: https://github.com/salextpuru/sdcc-n.../apps/demo17_1
Файл moln.pbm выглядит так:
В нем 4 фазы (то есть 4 одинаковых картинки расположенных ВЕРТИКАЛЬНО).
Размеры одной фазы скрипт вычисляет сам исходя из размеров, заданных в PBM-файле и количества фаз.
В итоге получаем файл moln.h:
и файл moln.cКод:/** @file moln.h Spite name: moln* W(chars): 3 H(CHARS):2 PHASES: 4 Phase's size: bytes Sprite size: bytes Color: 06 */ #ifndef moln_H_DEFINED #define moln_H_DEFINED #include <stdint.h> #include <spr0.h> extern const Sprite0* const moln[4]; // Sprite phases extern const Sprite0 moln_0; // Sprite phase 0 extern const Sprite0 moln_1; // Sprite phase 1 extern const Sprite0 moln_2; // Sprite phase 2 extern const Sprite0 moln_3; // Sprite phase 3 #endif /* moln_H_DEFINED */
Дальше просто подключаем к С-программе и используем как хотим. Пример процедуры вывода спрайтов тут: https://github.com/salextpuru/sdcc-n...emo17_1/main.c/**
@file moln.c
Spite name: moln*
W(chars): 3 H(CHARS):2
PHASES: 4
Phase's size: bytes
Sprite size: bytes
Color: 06
*/
#include "moln.h"
// Phase 0
const Sprite0 moln_0 = {
.sz = 54 + sizeof(Sprite0),
.w = 3,
.h = 2,
.datap ={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x40,0xc0,0x00,0xa1,0xe3,0x00,
0x13,0x77,0x00,0x0e,0x3e,0x00,0x04,0x1c,
0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
06,06,06,06,06,06,}
};
// Phase 1
const Sprite0 moln_1 = {
.sz = 54 + sizeof(Sprite0),
.w = 3,
.h = 2,
.datap ={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x00,0x41,0xc0,0x20,0xe3,0xc0,
0x11,0x37,0x00,0x0a,0x1e,0x00,0x04,0x0c,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
06,06,06,06,06,06,}
};
// Phase 2
const Sprite0 moln_2 = {
.sz = 54 + sizeof(Sprite0),
.w = 3,
.h = 2,
.datap ={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x00,0x41,0xc0,0x00,0xe3,0xe0,
0x01,0x37,0x70,0x0a,0x1e,0x30,0x04,0x0c,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
06,06,06,06,06,06,}
};
// Phase 3
const Sprite0 moln_3 = {
.sz = 54 + sizeof(Sprite0),
.w = 3,
.h = 2,
.datap ={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x40,0xc0,0x00,0xa1,0xe0,
0x01,0x13,0x70,0x02,0x0e,0x3c,0x00,0x04,
0x1c,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
06,06,06,06,06,06,}
};
// Sprite phases
const Sprite0* const moln[4]={&moln_0,&moln_1,&moln_2,&moln_3,};
Ну и простой и в общем-то бесполезный демчик того, что получилось: demo17_1spr-basic.tap.7z