PDA

Просмотр полной версии : Скрипт PBM - СПРАЙТ



SfS
27.04.2018, 20:05
Написал скрипт для преобразования PBM в спрайт в формате C-файлов. Скрипт не быстрый, но рабочий.

https://github.com/salextpuru/sdcc-noinit/blob/master/scripts/pbm2sprmov0

Как работает? Очень просто.

Например, есть файл moln.pbm.

Если нам нужен монохромный спрайт - то пишем:


./pbm2sprmov0 moln.pbm 4

Если нам нужен спрайт желтый INK черный PAPER - то пишем:


./pbm2sprmov0 moln.pbm 4 6

Теперь о параметрах:
moln.pbm - это имя входного файла. Тут всё ясно.

4 - количество фаз движения спрайта, содержащихся в файле. Предполагается, что все фазы движения - одинаковы по размеру.

6 - цвет. В нашем примере - желтый. Если он не задан, то спрайты будут создаваться без атрибутов. Если задан - то будут добавлены атрибуты.

После того, как скрипт отработает, появятся два файла: moln.c и moln.h.
В них будет информация о спрайте, его размеры, цвет (или его отсутсвие). Отдельно - каждая фаза спрайта и массив указателей на фазы.

Как все это работает смотрим тут: https://github.com/salextpuru/sdcc-noinit/tree/master/apps/demo17_1

Файл moln.pbm выглядит так: 65170

В нем 4 фазы (то есть 4 одинаковых картинки расположенных ВЕРТИКАЛЬНО).

Размеры одной фазы скрипт вычисляет сам исходя из размеров, заданных в PBM-файле и количества фаз.

В итоге получаем файл moln.h:



/**
@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 */


и файл moln.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,};



Дальше просто подключаем к С-программе и используем как хотим. Пример процедуры вывода спрайтов тут: https://github.com/salextpuru/sdcc-noinit/blob/master/apps/demo17_1/main.c


Ну и простой и в общем-то бесполезный демчик того, что получилось: 65171