Trabajar con capas sdl

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

Trabajar con capas sdl

Notapor migueleitorone » Jue Feb 03, 2011 1:41 am

Buenas noches, estaba haciendo pruebas con sdl y he pensado en mostrar las imagenes por capas, capa1 para el fondo del juego, y capa2 para los personajes y objetos e ir actualizando las dos capas por cada pasada del game looop.
He probado con este codigo, el problema es que me crea la segunda capa con un fondo negro y me tapa la primera, hay alguna forma de hacer que me cree la segunda capa en trasnparente? O como lo haceis vosotros para tener el fondo independiente de los personajes y los objetos?

Código: Seleccionar todo
SDL_Surface * capa1 = SDL_SetVideoMode(200, 200, 32, SDL_NOFRAME | SDL_HWSURFACE);
SDL_BlitSurface(fondo, NULL, capa1, NULL);
SDL_Surface* capa2 = SDL_SetVideoMode(200, 200, 32, SDL_NOFRAME | SDL_HWSURFACE);
SDL_BlitSurface(personaje, NULL, capa2, NULL);
SDL_BlitSurface(objeto, NULL, capa2, NULL);
SDL_Flip(capa1);
SDL_Flip(capa2);


graciass
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Trabajar con capas sdl

Notapor Geo » Jue Feb 03, 2011 5:56 am

SDL_SetVideoMode no crea superficies cada que la llamas, cada llamada a SDL_SetVideoMode establece el modo de video para toda la aplicación, y siempre devuelve un puntero a la superficie de video que se muestra en pantalla. Es decir, cada que utilizas la función SDL_SetVideoMode estableces o cambias el modo de video de toda la aplicación.

Si deseas tener dos superficies diferentes para dibujar sobre ellas, puedes crearlas con SDL_CreateRGBSurface.
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

Re: Trabajar con capas sdl

Notapor migueleitorone » Jue Feb 03, 2011 7:30 am

aah entonces no es que se tape lo de la capa1 sino que estoy reiniciando la ventana no?
Voy a mirarme esa funcion que me has dicho aver si puedo hacer lo que queria, gracias geo :D
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Trabajar con capas sdl

Notapor pablo9891 » Mié Feb 09, 2011 9:04 pm

No estoy demasiado interiorizado acerca de la funcion que te estan recomendando, particularmente utilizo una sola superficie y una vez que hago eso, voy colocando todas las imagenes sobre la misma superficie
pablo9891
 
Mensajes: 32
Registrado: Lun Dic 28, 2009 2:48 am

Re: Trabajar con capas sdl

Notapor migueleitorone » Jue Feb 10, 2011 2:27 am

era lo que estaba haciendo hasta ahora pero va mejor trabajar con capas, asi cada movimiento de tu personaje, por ejemplo, no afecta en la imagen del mapa. Bueno, almenos ahora pienso que va mejor, no se como se trabajara mas profesionalmente xdd.
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Trabajar con capas sdl

Notapor migueleitorone » Jue Feb 10, 2011 4:03 am

buff llevo toda la noche probando movidas y no logro hacer lo que queria, tengo el mismo problema que al principio: Creo la capa2 con SDL_CreateRGBSurface, pero me crea una surface pintada de negro que me tapa la capa1. He estado buscando en google y parece que no es facil crear una superficie transparente. Alguien me ayuda? No puede ser tan dificil T_T
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Trabajar con capas sdl

Notapor .teri » Jue Feb 10, 2011 1:40 pm

Si creas una capa con SDL_CreateRGBSurface si no me equivoco es que no tiene un canal alpha. Acuérdate de convertirlo al formato de la pantalla y ya le das transparencia, color clave o ambas cosas según lo que te interese. También estaría bien que escribieses cómo estas creando la superficie.
.teri
 
Mensajes: 38
Registrado: Dom Oct 01, 2006 4:41 pm

Re: Trabajar con capas sdl

Notapor migueleitorone » Vie Feb 11, 2011 1:27 am

La funcion la estoy usando asi, antes que nada aclarar esto: "fondo" es la surface donde esta la imagen de fondo, agujero_amarillo.png es una imagen de un balazo en la pared, y capa2, donde quiero ir almacenando todos esos balazos:

Código: Seleccionar todo

        SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, NULL, NULL, NULL, 0);
   
   SDL_Surface * agujero_a = IMG_Load("agujero_amarillo.png");
   
   SDL_Rect rect;
   rect.x = 300;
   rect.y = 300;

   SDL_BlitSurface(agujero_a, NULL, capa2, &rect);

   
   SDL_BlitSurface(fondo, NULL, screen, NULL);
   SDL_BlitSurface(capa2, NULL, screen, NULL);
   SDL_Flip(screen);


Quiza esto sirva de algo, con estos parametros en la funcion:
Código: Seleccionar todo
SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, NULL, NULL, NULL, 0);

el resultado es este:
Imagen

con estos otros parametros:
Código: Seleccionar todo
SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, 255, 255, 255, 255);

el resultado es este:
Imagen

Aver si alguno me ilumina, que he probado mil convinaciones con los parametros y, o no logro que se vean las trasparencias, o me cambia el color de la imagen :s
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Trabajar con capas sdl

Notapor carlostex » Vie Feb 11, 2011 1:45 am

Hay dos cosas que se me hacen raras, en dos de las llamadas a SDL_BlitSurface no le pasas el parámetro de la ubicación donde lo colocará, no se si SDL lo ponga por default en 0, y la otra es que si declaras una superficie de 32 bits, tienes que definir colores de 32 bits, así que la segunda forma con la que inicializas la superficie sería la correcta.
Para que usas las capas? Es decir, por que no usas una sola superficie y vas copiando las cosas haí, lo que puedes hacer son capas virtuales, defines en que capa quieres que se dibuje cada imagen, al copiar todo primero empiezas por lo que tengas en la capa 1 y así te vas con las demás, mientras mas superficies grandes y de mas canales mas lento será el copiado y mas memoria usarás.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Trabajar con capas sdl

Notapor migueleitorone » Vie Feb 11, 2011 2:38 am

carlostex escribió:Hay dos cosas que se me hacen raras, en dos de las llamadas a SDL_BlitSurface no le pasas el parámetro de la ubicación donde lo colocará, no se si SDL lo ponga por default en 0,

Si, el default es 0, por eso no lo pongo. Bueno, eso creo, pero diria que si no defino la posicion en donde lo quiero simplemente lo pone en las cordenadas 0.0.

carlostex escribió:y la otra es que si declaras una superficie de 32 bits, tienes que definir colores de 32 bits, así que la segunda forma con la que inicializas la superficie sería la correcta.

Te refieres a esta?
Código: Seleccionar todo
SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, 255, 255, 255, 255);

Por que es incorrecta? 255, 255, 255, 255 es un color mas de los que acepta con 32 bits no?

carlostex escribió:Para que usas las capas? Es decir, por que no usas una sola superficie y vas copiando las cosas haí

Lo de las capas es mas que nada por organizacion, y para no tener que estar actualizando todo todo el rato. En este caso, lo que queria hacer era una mirilla que fuera disparando y marcando cada disparo en la imagen de fondo.
Por tanto tendria 3 capas:
capa1 : imagen de fondo
capa2 : imagenes disparos
capa3 : imagen mirilla

Entonces, si muevo la mirilla, solo tendria que cambiar la capa 3, si disparo, solo tengo que añadir una imagen a la capa 2 y al final de cada loop actualizar la pantalla pasandole las capas por orden. Nose, me parece una manera bastante mas intuitiva que sin usar capas.

lo que puedes hacer son capas virtuales, defines en que capa quieres que se dibuje cada imagen, al copiar todo primero empiezas por lo que tengas en la capa 1 y así te vas con las demás,

Bueno eso es lo que quiero hacer, pero no se como xddddd

gracias por vuestro tiempo :D
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España

Re: Trabajar con capas sdl

Notapor carlostex » Vie Feb 11, 2011 4:23 am

migueleitorone escribió:Te refieres a esta?

Código: Seleccionar todo
SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, 255, 255, 255, 255);


Por que es incorrecta? 255, 255, 255, 255 es un color mas de los que acepta con 32 bits no?

Digo que es correcta, por que una imagen de 32 bits tiene 4 canales(si se trabaja con canales de 8 bits siendo este el caso)

Si actualizas una capa al final vas a tener que copiar todas a la superficie, por que sdl únicamente copia la superficie declarada cuando pediste el video al hacer flip, y de hecho es mayor el gasto de copiar 3 superficies de 1000 x 1000 px que copiar solo las imágenes. Hay dos formas de hacer esto, una la que te digo, que te ará mas fácil la organización para la pc va a ser lo mismo, y la otra es actualizar los rectángulos que cambiaron, para eso existe la función updaterect que únicamente envía al vídeo el rectángulo que le hayas dicho lo que va a ahorrar tiempo. Yo trabajo con 32 bits y de hecho es mas rápido que en otro formato la razón es que el procesador puede mover los 32 bits de un solo golpe, así que mi recomendación es que intentes implementar eso de las capas virtuales será mas rápido.

Para hacer lo de las capas vituales se me viene a la mente usar mapas, pues mantienen ordenada una lista y son sumamente rápidas al agregar objetos, definirías como clave el numero del mapa donde quieres que valla y el contenido sería un apuntador a tu clase actor o lo que hayas definido que tenga una función draw que copie la imagen de tu actor a una superficie, así, en el bucle recorres todo el mapa y vas llamando a la función drawn, el mapa es solo para invocar la función eso no te debe afectar en como tengas declarada tu clase o con las propiedades de tu actor, ya sea un enemigo, un disparo etc, por eso separo lo que es actores del sistema que maneja gráficos.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Trabajar con capas sdl

Notapor .teri » Vie Feb 11, 2011 11:38 am

Código: Seleccionar todo
SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, 255, 255, 255, 255);

Código: Seleccionar todo
SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, NULL, NULL, NULL, 0);

:S ¿Esto qué es??
Tendrías que dar formato de esta forma. Debería de funcionar:
Código: Seleccionar todo
SDL_Surface * capa2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 1000, 1000, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);


Y ya conviertes la superficie al formato de la pantalla. Debe de funcionar.
.teri
 
Mensajes: 38
Registrado: Dom Oct 01, 2006 4:41 pm

Re: Trabajar con capas sdl

Notapor migueleitorone » Mar Feb 15, 2011 6:08 am

perfecto era por eso, pense que simplemente habia que pasarle enteros :S.

muchas gracias chicos ya puedo seguir con esto :D
migueleitorone
 
Mensajes: 88
Registrado: Mié Ago 18, 2010 2:59 pm
Ubicación: Barcelona, España


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron