PDA

Ver la versión completa : Rutinas para sprites RLE en GP32



theNestruo
16/04/2006, 20:34
¡Hola amigos!

Aquí os adjunto unas rutinas para generar y pintar sprites RLE en la GP32. Probablemente los algoritmos valgan también para la GP2X si tienen la pantalla rotada internamente como la GP32.

En el ZIP adjunto teneis la parte Win32; es deicr, el ejecutable (y su código fuente, que sé que os gusta enredar) para convertir ficheros .tga en los .rle que procesa el resto del código.
Para convertir una imagen:
tga2nrlespr imagen.tga imagen.rle número_de_sprites_que_contiene

El código de mi "graphics.c", ya dentro el proyecto de GP32, es el siguiente:
http://muer.njoerdba.com/paste/view.aspx?id=1a383cc2-2d53-42d5-b973-745af91c8b4a
Por supuesto, sacad las declaraciones de los tipos al .h y crear los prototipos de las funciones que querais utilizar también en el .h
Por cierto, pasad de las funciones LoadImage(), DrawImage(), etc., que son para otro formato de fichero (se me ha olvidado quitarlas antes de pegarlas en el Stuart's sumptuous paste site). Las que os interesan son las LoadSprite(), DrawSprite(), etc.

Para cargar un sprite le pasais un puntero a struct stSprite, la cadena con el nombre de la imagen (habreis llamado mucho antes a GpFatInit() y GpRelativePathSet()) y el color a partir del cual puede cargar (por ejemplo, si se pasa un 8 y la imagen tiene 3 colores, se utilizarán las entradas 8, 9 y 10 de la paleta).

Sed buenos.

Nés.

Puck2099
16/04/2006, 20:36
Hostiaaaaas, ¿dónde te metes theNestruo? Ya te echábamos de menos :)

A ver si seguimos sabiendo de ti :)

Segata Sanshiro
16/04/2006, 21:01
Esto sí que es un pedazo de regreso xD

Aiken
17/04/2006, 18:50
supongo que la gracia de usar tu librerias rle, es no tener que usar SDL (por ejemplo) no?

se puede editar rle directamente con photochoop? sino, quizas podrias adaptar tus librerias para usar PCX (que internamente usan rle y se pueden editar) ;)

de hecho hasta que empece a usar SDL, yo usaba PCX para los sprites con la gp32 :D

Aiken

theNestruo
21/04/2006, 01:25
supongo que la gracia de usar tu librerias rle, es no tener que usar SDL (por ejemplo) no?
No exactamente; la gracia de usar sprites RLE es que se pintan más rápido. ;) El truco reside en que no haya que mirar pixel a pixel si es transparente o no.


se puede editar rle directamente con photochoop? sino, quizas podrias adaptar tus librerias para usar PCX (que internamente usan rle y se pueden editar) ;)
Hombre, supongo que se podrá, pero no creo que puedan abrir NRLE (Nestruo RLEs) xD. El caso es que el formato que genera/utiliza el código que os he mostrado no es un RLE al uso. Éste está diseñado no para ahorrar espacio (como los RLE de los PCX, por ejemplo), sino para que se dibuje muy rápidamente en la GP32. A saber:
- Los datos van de abajo a arriba y de izquierda a derecha, como la pantalla de la GP32; esto reduce y simplifica los cálculos para obtener el pixel que se ha de pintar.
- La compresión RLE no se hace por colores: se hace por transparencia. En cada bloque RLE el primer bit del primer byte puede...
...ser un 0. Si los demás bits son 0, se ha acabado la línea (la columna, realmente) y se puede pasar a la siguiente. En otro caso, los otros siete bits indican cuántos píxeles se han de saltar.
...ser un 1, que indica que se han de pintar tantos píxeles seguidos como indiquen los siete bits restantes más uno (para aprovechar el valor 0); aquí se utiliza mi antiguo FastMemoryCopy()
Como puedes ver, aunque toda la columna sean píxeles del mismo color, eso no se comprime en RLE; lo haría más lento.


Aiken
Nestruo

Por cierto, si algiuen se pregunta cuál fue mi entrada en la GBAX2005 (creo que se menciona dentro de tga2nrle), que no se vuelva loco: aún no ha llegado a su primera versión beta... xD

Aiken
21/04/2006, 01:36
...ser un 1, que indica que se han de pintar tantos píxeles seguidos como indiquen los siete bits restantes más uno (para aprovechar el valor 0); aquí se utiliza mi antiguo FastMemoryCopy()
Como puedes ver, aunque toda la columna sean píxeles del mismo color, eso no se comprime en RLE; lo haría más lento.



Umh con lo de rle rotados, para un blit mas rapido ya lo pillo ;)

Aiken