kmkzk
13/12/2004, 09:39
Hola,
Escribo para ver si alguien me puede echar una manita. Programo con el SDK de gamepark y ahora me he puesto a trastear un poco con la paleta y me han surgido algunos problemas. Lo que intento hacer es poder tener varias paletas cargadas en memoria a la vez, y asi poder cambiarlas al instante. Para eso he hecho esta chapucilla:
...
#include "gpgraphic.h"
#include "defines.h"
#define GP_RGB24(r,g,b) (((((r>>3))&0x1f)<<11)|((((g>>3))&0x1f)<<6)|((((b>>3))&0x1f)<<1))
#define MAX_PAL 8
GP_PALETTEENTRY PALETTES[MAX_PAL][256]; //Datos de paleta
GP_HPALETTE HPALETTES[MAX_PAL]; //Handles a las paletas
//Cambia una entrada de la paleta actual
int SetPaletteEntry( unsigned int index, unsigned int red, unsigned int green, unsigned int blue)
{
GP_PALETTEENTRY entry = GP_RGB24(red,green,blue);
GpPaletteEntryChange ( index, 1, &entry, 0 );
}
//Inicializa
int InitPalettes(){
u8 i;
for (i = 0;i<MAX_PAL;i++)
HPALETTES[i] = GpPaletteCreate(256, (GP_PALETTEENTRY*)PALETTES[i]);
}
//Carga la paleta
int LoadPalette(int N){
GpPaletteSelect(HPALETTES[N]);
}
//Aplica la paleta al hw
int ApplyPalette(){
GpPaletteRealize();
}
...
Cuando voy a usar estar rutinas, como inicializacion, lo primero que hago es inicializar todas las paletas ('InitPalettes'), despues hago 'LoadPalette' con las que me interesen y voy creando las paletas con 'SetPaletteEntry' (las paletas son generadas en tiempo de ejecucion):
...
InitPalettes();
LoadPalette(0);
for (i=0;i<256;i++)
SetPaletteEntry(i,LOKESEA,LOKESEA,LOKESEA);
LoadPalette(1);
for (i=0;i<256;i++)
SetPaletteEntry(i,LOKESEA-i,LOKESEA-i,LOKESEA-i);
...
Una vez tenemos lo anterior montado, dibujo algo en pantalla, hago 'LoadPalette(X)' y depues 'ApplyPalette()'. La primera vez que lo hago funciona bien, pero cuando en el mismo dibujo hago 'LoadPalette(Y)' y despues 'ApplyPalette()' carga una paleta nula (supongo, todo se ve negro).
...
if (time< 100) {LoadPalette(0);ApplyPalette();}
if (time>=100) {LoadPalette(1);ApplyPalette();}
Dibuja_algo();
...
Tal vez no me aclaro muy bien con esto de las paletas, aunque he pensado que tal vez pueda ser problema de la funcion 'SetPaletteEntry'.
A ver si hay alguna mente brillante por ahi que me ilumine ;)
Un saludo!
pd:vaya lio de post, espero que alguien lo entienda
Escribo para ver si alguien me puede echar una manita. Programo con el SDK de gamepark y ahora me he puesto a trastear un poco con la paleta y me han surgido algunos problemas. Lo que intento hacer es poder tener varias paletas cargadas en memoria a la vez, y asi poder cambiarlas al instante. Para eso he hecho esta chapucilla:
...
#include "gpgraphic.h"
#include "defines.h"
#define GP_RGB24(r,g,b) (((((r>>3))&0x1f)<<11)|((((g>>3))&0x1f)<<6)|((((b>>3))&0x1f)<<1))
#define MAX_PAL 8
GP_PALETTEENTRY PALETTES[MAX_PAL][256]; //Datos de paleta
GP_HPALETTE HPALETTES[MAX_PAL]; //Handles a las paletas
//Cambia una entrada de la paleta actual
int SetPaletteEntry( unsigned int index, unsigned int red, unsigned int green, unsigned int blue)
{
GP_PALETTEENTRY entry = GP_RGB24(red,green,blue);
GpPaletteEntryChange ( index, 1, &entry, 0 );
}
//Inicializa
int InitPalettes(){
u8 i;
for (i = 0;i<MAX_PAL;i++)
HPALETTES[i] = GpPaletteCreate(256, (GP_PALETTEENTRY*)PALETTES[i]);
}
//Carga la paleta
int LoadPalette(int N){
GpPaletteSelect(HPALETTES[N]);
}
//Aplica la paleta al hw
int ApplyPalette(){
GpPaletteRealize();
}
...
Cuando voy a usar estar rutinas, como inicializacion, lo primero que hago es inicializar todas las paletas ('InitPalettes'), despues hago 'LoadPalette' con las que me interesen y voy creando las paletas con 'SetPaletteEntry' (las paletas son generadas en tiempo de ejecucion):
...
InitPalettes();
LoadPalette(0);
for (i=0;i<256;i++)
SetPaletteEntry(i,LOKESEA,LOKESEA,LOKESEA);
LoadPalette(1);
for (i=0;i<256;i++)
SetPaletteEntry(i,LOKESEA-i,LOKESEA-i,LOKESEA-i);
...
Una vez tenemos lo anterior montado, dibujo algo en pantalla, hago 'LoadPalette(X)' y depues 'ApplyPalette()'. La primera vez que lo hago funciona bien, pero cuando en el mismo dibujo hago 'LoadPalette(Y)' y despues 'ApplyPalette()' carga una paleta nula (supongo, todo se ve negro).
...
if (time< 100) {LoadPalette(0);ApplyPalette();}
if (time>=100) {LoadPalette(1);ApplyPalette();}
Dibuja_algo();
...
Tal vez no me aclaro muy bien con esto de las paletas, aunque he pensado que tal vez pueda ser problema de la funcion 'SetPaletteEntry'.
A ver si hay alguna mente brillante por ahi que me ilumine ;)
Un saludo!
pd:vaya lio de post, espero que alguien lo entienda