Puck2099
20/06/2006, 07:03
Hola,
Como algunos sabrán, llevo cerca de una semana currando en una función que permita realizar rotaciones de sprites en SDL y por fin la tengo terminada.
Sé que existe la librería SDL_gfx, pero todas las pruebas que he realizado terminan igual, con un segmentation fault (que por otro lado en PC van perfectamente), por eso decidí hacer mi propia función.
En principio solo la iba a usar para nuestro Ambassadors, pero como creo que puede ser útil al resto de programadores, la pongo aquí a vuestra disposición.
En esta librería llamada SDL_plusplus, de momento solo he metido esta función, pero iré actualizándola con nuevas funciones interesantes a medida que las vaya necesitando.
La función está hecha para que tire en SDL (tanto en GP32, GP2X, PC...), pero sería relativamente sencillo adaptarla a las minilib o similar. Me he basado en código interno de mi port de Fenix para su realización, usando la librería de punto fijo para las operaciones matemáticas, así que es relativamente rápida (bastante más de lo que era la SDL_gfx).
¿Qué incorpora la función?
Bien, podemos hacer rotaciones (en milésimas de grados), zooms (aumentando o disminuyendo independientemente el eje X e Y), clipping (para que solo se pinte en una zona de la superficie destino), seleccionar aplicar los "efectos" a la superficie entera o solo a una zona de ella (para transferir por ejemplo solo un sprite de una tira de ellos). Por otro lado, en conjunción con estos efectos, también podemos realizar mirroring ("reflejar" la imagen como si se viera en un espejo) vertical y/o horizontal.
¿Qué no incorpora?
Pues básicamente efectos de transparencias graduales, alpha blendings, etc., aunque sí que permite usarse un color como transparente.
Por otro lado, solo están soportadas profundidades de 8 y 16 bits de color, así que no funcionará con otras.
La cabecera de la función es:
void SDL_Blitfx (SDL_Surface * dest, SDL_Rect * clip, SDL_Rect * srcrect,
int scrx, int scry, int flags,
int angle, int scalex, int scaley,
SDL_Surface * src);
Donde:
dest -> Superficie destino donde transferir la imagen transformada.
clip -> Limita la region de destino donde transferir la imagen. Si se deja a NULL se puede hacer en cualquier zona de la superficie destino.
srcrect -> Limita la region de la superficie origen que se va a transferir. Si se deja a NULL se transferirá toda la superficie.
srcx, srcy -> Coordenadas de la superficie destino donde irá el CENTRO de la imagen transformada transferida.
flags -> Se pueden usar los siguientes valores (pueden usarse conjuntamente con ORs a nivel de bits): B_NONE, B_HMIRROR, B_VMIRROR. Respectivamente significan ningún mirroring, mirroring horizontal y mirroring vertical.
angle -> Ángulo en milésimas de grado para la rotación (por ejemplo, para 90 grados valdría 90000). Para no rotar usad un ángulo de 0 grados.
scalex, scaley -> Factor de zoom a aplicar a la imagen. Sin zoom sería un 100, para el doble de tamaño 200, etc.
src-> Superficie de origen usada para la transferencia.
Adjunto las librerías con un ejemplo bastante tonto para que lo veáis en funcionamiento.
http://www.gp32wip.com/screenshots/blitfx.png
Si os resulta útil y modificáis el fuente de la librería, agradecería que publicárais vuestros cambios para que salieramos todos beneficiados :)
Ah, quería agradecerle especialmente a Uncanny su ayuda y dedicación para probar la función :)
Saludos
Como algunos sabrán, llevo cerca de una semana currando en una función que permita realizar rotaciones de sprites en SDL y por fin la tengo terminada.
Sé que existe la librería SDL_gfx, pero todas las pruebas que he realizado terminan igual, con un segmentation fault (que por otro lado en PC van perfectamente), por eso decidí hacer mi propia función.
En principio solo la iba a usar para nuestro Ambassadors, pero como creo que puede ser útil al resto de programadores, la pongo aquí a vuestra disposición.
En esta librería llamada SDL_plusplus, de momento solo he metido esta función, pero iré actualizándola con nuevas funciones interesantes a medida que las vaya necesitando.
La función está hecha para que tire en SDL (tanto en GP32, GP2X, PC...), pero sería relativamente sencillo adaptarla a las minilib o similar. Me he basado en código interno de mi port de Fenix para su realización, usando la librería de punto fijo para las operaciones matemáticas, así que es relativamente rápida (bastante más de lo que era la SDL_gfx).
¿Qué incorpora la función?
Bien, podemos hacer rotaciones (en milésimas de grados), zooms (aumentando o disminuyendo independientemente el eje X e Y), clipping (para que solo se pinte en una zona de la superficie destino), seleccionar aplicar los "efectos" a la superficie entera o solo a una zona de ella (para transferir por ejemplo solo un sprite de una tira de ellos). Por otro lado, en conjunción con estos efectos, también podemos realizar mirroring ("reflejar" la imagen como si se viera en un espejo) vertical y/o horizontal.
¿Qué no incorpora?
Pues básicamente efectos de transparencias graduales, alpha blendings, etc., aunque sí que permite usarse un color como transparente.
Por otro lado, solo están soportadas profundidades de 8 y 16 bits de color, así que no funcionará con otras.
La cabecera de la función es:
void SDL_Blitfx (SDL_Surface * dest, SDL_Rect * clip, SDL_Rect * srcrect,
int scrx, int scry, int flags,
int angle, int scalex, int scaley,
SDL_Surface * src);
Donde:
dest -> Superficie destino donde transferir la imagen transformada.
clip -> Limita la region de destino donde transferir la imagen. Si se deja a NULL se puede hacer en cualquier zona de la superficie destino.
srcrect -> Limita la region de la superficie origen que se va a transferir. Si se deja a NULL se transferirá toda la superficie.
srcx, srcy -> Coordenadas de la superficie destino donde irá el CENTRO de la imagen transformada transferida.
flags -> Se pueden usar los siguientes valores (pueden usarse conjuntamente con ORs a nivel de bits): B_NONE, B_HMIRROR, B_VMIRROR. Respectivamente significan ningún mirroring, mirroring horizontal y mirroring vertical.
angle -> Ángulo en milésimas de grado para la rotación (por ejemplo, para 90 grados valdría 90000). Para no rotar usad un ángulo de 0 grados.
scalex, scaley -> Factor de zoom a aplicar a la imagen. Sin zoom sería un 100, para el doble de tamaño 200, etc.
src-> Superficie de origen usada para la transferencia.
Adjunto las librerías con un ejemplo bastante tonto para que lo veáis en funcionamiento.
http://www.gp32wip.com/screenshots/blitfx.png
Si os resulta útil y modificáis el fuente de la librería, agradecería que publicárais vuestros cambios para que salieramos todos beneficiados :)
Ah, quería agradecerle especialmente a Uncanny su ayuda y dedicación para probar la función :)
Saludos