YouTube Link
Para comenzar:
- Nivel de dificultad: Media.
- Lenguaje: ANSI C/C++.
- Herramientas: SaturnOrbit, Gimp.
Vamos a volver a utilizar el ejemplo S_2_2. Personalmente voy a tomar, el mismo que subi de otro tutorial.
Para poner todo a punto antes de comenzar debes pasar por aca.
Luego debemos agregar a la lista de librerías la DEFHUFF (algorítmos de compresión de Huffman) sino no nos va a compilar, porque no reconoce las funciones.
Se debe incluir el .O (parecido .dll de Windows) ya que la librería es propietaria de su autor y ya está compilada.
El VDP2 es el segundo procesador para mostrar scrolls en movimiento ó rotacion. Además es el encargado de pasar la imagen de hacia la salida de video.
Tenemos varios tipos de Backgrounds:
- Estáticos y Scroll : NBG0,NBG1,NBG2,NBG3.
- De Rotación: RBG0,RBG1.
En este tutorial vamos a levantar una imagen compresa que esta en el CD y pintarla en el NBG1.
Primero creamos una carpeta dentro de nuestro proyecto con el nombre de backgrounds.
Vamos a preparar la imgen, no todo esta permitido! la imagen debe ser de 15bits con o sin compresión. Se le pueden poner transparencias (en investigación).
Ademas no se pueden pasar de ciertas caracteristicas en la resolución.
Tengo una imagen en RGB con una resolución 320x240 pixeles, abró algun editor gráfico. En mi caso GIMP, la guardo como TGA y ademas tildo la opcion de compresión RLE (Run-Length Encoding). Obtengo Fondo1.TGA, la copiamos dentro de la carpeta backgrounds
Ahora tengo que transformarla a formato Saturn con el BGCON que se encuentra en C:SaturnOrbitToolsBGCON .
Necesitamos hacer llamar a esta utilidad, pasandole un .txt con ciertas configuraciones.
Para hacer las cosas más faciles vamos a hacer un batchfile (.bat) para que llame a esta utilidad y nos olvidemos de tantas rutas.
COPY C:SaturnOrbitSET_COF.BAT .TMP.BAT
CALL TMP.BAT
DEL TMP.BAT
BGCON.EXE TGA2DHUF.TXT
MOVE FONDO1.BIN "C:/S_2_2/cd/FONDO1.BIN"
pause
CALL TMP.BAT
DEL TMP.BAT
BGCON.EXE TGA2DHUF.TXT
MOVE FONDO1.BIN "C:/S_2_2/cd/FONDO1.BIN"
pause
Guardamos esto, con el nombre BACKCONV.BAT dentro de la carpeta backgrounds.
Luego el archivo de configuraciones.
CD 15
IF TGA
IM BITMAP
CMP DHUFF
RGBHI ON
TRANS -1
OF BIN
L fondo1.tga
S fondo1.bin
IF TGA
IM BITMAP
CMP DHUFF
RGBHI ON
TRANS -1
OF BIN
L fondo1.tga
S fondo1.bin
Lo guardamos como TGA2DHUF.TXT en la carpeta backgrounds y ejecutamos el .bat. Por ultimo comprobamos que este la imagen fondo1.bin en la carpeta cd del proyecto.
Vamos con el proceso del código.
Como lógica lo primero que debemos es activar el CD .
#include <SEGA_GFS.H>
#define OPEN_MAX (Sint32)5
#define DIR_MAX (Sint32)25
// keep this info global
GfsDirTbl gfsDirTbl;
GfsDirName gfsDirName[DIR_MAX];
Uint32 gfsLibWork[GFS_WORK_SIZE(OPEN_MAX)/sizeof(Uint32)];
// number of files in current directory
Sint32 gfsDirN;
void init_CD()
{
GFS_DIRTBL_TYPE(&gfsDirTbl) = GFS_DIR_NAME;
GFS_DIRTBL_DIRNAME(&gfsDirTbl) = gfsDirName;
GFS_DIRTBL_NDIR(&gfsDirTbl) = DIR_MAX;
gfsDirN = GFS_Init(OPEN_MAX, gfsLibWork, &gfsDirTbl);
}
#define OPEN_MAX (Sint32)5
#define DIR_MAX (Sint32)25
// keep this info global
GfsDirTbl gfsDirTbl;
GfsDirName gfsDirName[DIR_MAX];
Uint32 gfsLibWork[GFS_WORK_SIZE(OPEN_MAX)/sizeof(Uint32)];
// number of files in current directory
Sint32 gfsDirN;
void init_CD()
{
GFS_DIRTBL_TYPE(&gfsDirTbl) = GFS_DIR_NAME;
GFS_DIRTBL_DIRNAME(&gfsDirTbl) = gfsDirName;
GFS_DIRTBL_NDIR(&gfsDirTbl) = DIR_MAX;
gfsDirN = GFS_Init(OPEN_MAX, gfsLibWork, &gfsDirTbl);
}
Luego debemos activar el VDP2 con las configuraciones necesarias.
Desactiva y activa la salida de video.
slTVOff(); slTVOn();
Asignamos un la prioridad en la que se verán los fondos. Siendo 7 el del frente.
slPriorityNbg0(7);
slPriorityNbg1(6);
slBitMapNbg1(COL_TYPE_32768, BM_512x256, (void *)VDP2_VRAM_A0);
Esta funcion es la mas importante, le pasamos los parametros de los colores posibles y el tamaño que va a crear en memoria. Pero como nuestra imagen es 320x240, la va a estirar. Si algo haces mal, la imagen se va a mostrar distorcionada.
Activamos ambos backgrounds.
slScrAutoDisp(NBG0ON|NBG1ON);
El NBG0 sirve para todas las funciones de slPrint
void init_VDP2()
{ //Desactivamos la salida de video.
slTVOff();
//Pintamos el fondo negro por si las dudas. ;)
slBack1ColSet((void *)BACK_CRAM, CD_Black);
//Asignamos un la prioridad en la que se verán los fondos. Siendo 7 el del frente.
slPriorityNbg0(7);
slPriorityNbg1(6);
// paleta: COL_TYPE_16, COL_TYPE_256, COL_TYPE_2048
// rgb: COL_TYPE_32768, COL_TYPE_1M
// bitmap sizes(BM_HxV): BM_512x256, BM_512x512, BM_1024x256, BM_1024x512
slBitMapNbg1(COL_TYPE_32768, BM_512x256, (void *)VDP2_VRAM_A0);
//Posicionamos el fondo.
slScrPosNbg1(toFIXED(0.0), toFIXED(0.0));
//Activamos ambos backgrounds
slScrAutoDisp(NBG0ON|NBG1ON);
//Activamos la salida de video.
slTVOn();
}
{ //Desactivamos la salida de video.
slTVOff();
//Pintamos el fondo negro por si las dudas. ;)
slBack1ColSet((void *)BACK_CRAM, CD_Black);
//Asignamos un la prioridad en la que se verán los fondos. Siendo 7 el del frente.
slPriorityNbg0(7);
slPriorityNbg1(6);
// paleta: COL_TYPE_16, COL_TYPE_256, COL_TYPE_2048
// rgb: COL_TYPE_32768, COL_TYPE_1M
// bitmap sizes(BM_HxV): BM_512x256, BM_512x512, BM_1024x256, BM_1024x512
slBitMapNbg1(COL_TYPE_32768, BM_512x256, (void *)VDP2_VRAM_A0);
//Posicionamos el fondo.
slScrPosNbg1(toFIXED(0.0), toFIXED(0.0));
//Activamos ambos backgrounds
slScrAutoDisp(NBG0ON|NBG1ON);
//Activamos la salida de video.
slTVOn();
}
Y por ultimo cargamos la imagen a la memoria con la función.
loadBG()
Les dejo el código para que lo vean.