Duda sobre SDL_Surface*

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Duda sobre SDL_Surface*

Notapor sofoke » Vie Feb 20, 2009 3:10 am

Tengo una duda quiero crea unos efectos usando SDL_ttf y fuentes claro...
pero me preguntaba si puedo hacer que una array, digamos asi:
Código: Seleccionar todo
char[] = "HOLA";

y como crear un array de SDL_Surface*, digamos asi:
Código: Seleccionar todo
SDL_Surface* mensaje[10];

Por que segun parece no puedo...
ahora no lo quiero hacer asi:
Código: Seleccionar todo
SDL_Surface* Uno, Dos, Tres;

por que quiero crear arrays de texto sin definir su tamaño y hacerlo mediante reserva dinamica de memoria y sobre la ejecucion aplicar una superficie a cada letra del array de caracteres...
Espero me haya dado a explicar...
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Respuesta

Notapor Raito » Vie Feb 20, 2009 5:02 pm

Una solución poco profesional pero simple para usar array de surface es hacer una estructura/clase con un miembro surface.

Ej:

Código: Seleccionar todo
typedef struct{
   SDL_Surface *surface;
}surface_t;

//luego haces el arreglo ya dimensionado o si lo preferís lo dimensionás luego

surface_t array_surface1[ n ];

// o

surface_t *array_surface2 = new surface_t[ n ];

//entonces desde este ejemplo se puede utilizar varias surfaces como array

array_surface1[ 0 ].surface  = IMG_Load( "image0.png" );
array_surface1[ 1 ].surface  = IMG_Load( "image1.png" );
...
array_surface1[ N ].surface  = IMG_Load( "imageN.png" );



Nota: Si utilizaras una clase en cambio de una estructura podrías hacer una sobrecarga del operador '=' para decir que devuelva su miembro SDL_Surface*

Espero que te sirva
"The bird of Hermes is my name eating my wings to make me tame."
Avatar de Usuario
Raito
 
Mensajes: 7
Registrado: Jue Feb 19, 2009 8:07 pm
Ubicación: Argentina

Re: Duda sobre SDL_Surface*

Notapor Geo » Dom Feb 22, 2009 6:03 am

sofoke escribió:Tengo una duda quiero crea unos efectos usando SDL_ttf y fuentes claro...
pero me preguntaba si puedo hacer que una array, digamos asi:
Código: Seleccionar todo
char[] = "HOLA";

y como crear un array de SDL_Surface*, digamos asi:
Código: Seleccionar todo
SDL_Surface* mensaje[10];

Por que segun parece no puedo...
ahora no lo quiero hacer asi:
Código: Seleccionar todo
SDL_Surface* Uno, Dos, Tres;

por que quiero crear arrays de texto sin definir su tamaño y hacerlo mediante reserva dinamica de memoria y sobre la ejecucion aplicar una superficie a cada letra del array de caracteres...
Espero me haya dado a explicar...

¿Con qué compilador estás trabajando? ¿Tienes problemas al compilar?
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Notapor sofoke » Lun Feb 23, 2009 1:05 am

el codigo que hice prueba es sumamente sencillo:
Código: Seleccionar todo
#include <iostream>
#include <cstdlib>
#include <SDL/SDL.h>

using namespace std;

int main( int argc, char *argv[] ){
   SDL_Surface* mensaje[10];
   for( int cont = 0; cont < 10; cont++ )
      SDL_FreeSurface( mensaje[ cont ] );
   return 0;
}

y el error que me tira (es el ya famoso):
Código: Seleccionar todo
Violación de segmento

No se si sea yo o el compilador...
ahora estoy tratando como me comentavan mas arriba
typedef struct{
SDL_Surface *surface;
}surface_t;
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México

Notapor Geo » Lun Feb 23, 2009 4:29 am

Bien, un array de SDL_Surface es perfectamente posible.

El problema con tu ejemplo es que intentas liberar memoria no reservada anteriormente, si pruebas reservando antes verás la diferencia:
Código: Seleccionar todo
#include <iostream>
#include <cstdlib>
#include <SDL/SDL.h>

using namespace std;

int main( int argc, char *argv[] ){
   SDL_Surface* mensaje[10];

  for( int cont = 0; cont < 10; cont++ )
    mensaje[ cont ] = SDL_CreateRGBSurface( SDL_SWSURFACE, 10, 10, 8, 0, 0, 0, 0 );

   for( int cont = 0; cont < 10; cont++ )
      SDL_FreeSurface( mensaje[ cont ] );

   return 0;
}
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Notapor sofoke » Jue Feb 26, 2009 6:30 am

for( int cont = 0; cont < 10; cont++ )
mensaje[ cont ] = SDL_CreateRGBSurface( SDL_SWSURFACE, 10, 10, 8, 0, 0, 0, 0 );

Tienes razon el error radicaba en esa seccion... Ya que yo no incluia ninguna que se encargara de reservarla...
Muchas gracias a ambos por las respuestas me ayudan mucho...
...cuando lo popular no es suficiente...
Gnu-Linux-y-Más
Avatar de Usuario
sofoke
 
Mensajes: 102
Registrado: Jue May 24, 2007 8:10 pm
Ubicación: México


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado