Autor Tema: Transparencias de un BMP en SDL  (Leído 955 veces)

Desconectado servomac

  • Experto
  • ****
  • Mensajes: 378
    • Ver Perfil
    • http://
Transparencias de un BMP en SDL
« en: Marzo 31, 2004, 02:12:31 pm »
Buenas. Tengo problemas intentando hacer que del monigote que aparece en la imagen que adjunto solo se vea el tio en si, es decir, el fondo verde oscuro no se imprima en pantalla. He provado este codigo :

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>

int main()
{

   SDL_Surface *pantalla, *imagen;
   SDL_Rect Origen, Destino;
  
   SDL_Init(SDL_INIT_VIDEO);
   atexit(SDL_Quit);
  
   pantalla = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);
  
   imagen = SDL_LoadBMP("caminando_1.bmp");
  
   SDL_FillRect(imagen, NULL, SDL_MapRGB(imagen->format, 0, 0, 0));
  
   Origen.x=0; Origen.y=0;       // Mas o menos
   Destino.x=245; Destino.y=170; //  centrado  
  
   SDL_BlitSurface(imagen,&Origen,pantalla,&Destino);
   SDL_UpdateRect(pantalla, 0, 0, 0, 0);
  
   SDL_Delay(5000);
  
   SDL_FreeSurface(imagen);
  
   return 0;
}

Como podeis ver si lo compilais, este codigo no imprime nada en pantalla. En canvio, si quitamos la linia SDL_FillRect(imagen, NULL, SDL_MapRGB(imagen->format, 0, 0, 0)); imprime la imagen correctamente, as? que me gustar?a saber como puedo hacer para hacer el fondo de esta imagen transparente. ?Muchas gracias y saludos!
   
P.D: He tenido que renombrar la imagen a .jpg para que me la dejara adjuntar  :P  
Se necesita un ladr?n para coger a otro ladr?n, y eso no lo ense?a ning?n catedr?tico. (HVC)
"In a world without walls or fences, who needs Windows and Gates?"

alsaan

  • Visitante
Transparencias de un BMP en SDL
« Respuesta #1 en: Marzo 31, 2004, 04:47:59 pm »
Tienes que utilizar la funci?n SDL_SetColorKey() para definir el color transparente de la superficie

En este caso, la imagen tiene de fondo el color (0,64,0), as? que para hacer que ese color sea transparente:
Código: [Seleccionar]
SDL_SetColorKey(imagen,SDL_SRCCOLORKEY,SDL_MapRGB(imagen->format,0,64,0));
Algunas sugerencias sobre el programa:
-Utiliza "SDL.h" en lugar de <SDL/SDL.h> e int main(int argc, char **argv) en lugar de int main() para que el c?digo sea m?s portable
-Comprueba siempre que la imagen se ha cargado correctamente, porque si no es as? el programa te dar? una violaci?n de segmento cuando intentes hacer cualquier cosa con la superficie
-Has utilizado la funci?n SDL_FillRect para rellenar de negro la superficie en la que est? el monigote. Una vez que hayas definido el color transparente de la superficie esta funci?n no es necesaria
-No hace falta que definas la estructura "Origen". Como en este caso queremos pegar la figura del monigote completa basta con poner NULL en el segundo par?metro de la funci?n SDL_BlitSurface
-La imagen del monigote tiene unas lineas blancas arriba y abajo que naturalmente luego aparecen en el programa. Adjunto una versi?n recortada sin esas l?neas


Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"

int main(int argc, char **argv)
{
  SDL_Surface *pantalla, *imagen;
  SDL_Rect Destino;
 
  SDL_Init(SDL_INIT_VIDEO);
  atexit(SDL_Quit);
 
  pantalla = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE);
 
  /*Cargamos la imagen del monigote y comprobamos que se ha asignado
    correctamente a la superficie*/
  imagen = SDL_LoadBMP("caminando_1.bmp");
  if(imagen==NULL)
  {
   printf("Error cargando imagen\n");
   return(1);
  }
  
  /*Ponemos el color verde de fondo como color transparente*/
  SDL_SetColorKey(imagen,SDL_SRCCOLORKEY,SDL_MapRGB(imagen->format,0,64,0));
    
  
  Destino.x=245; Destino.y=170; // M?s o menos centrado  
  SDL_BlitSurface(imagen,NULL,pantalla,&Destino);
  SDL_UpdateRect(pantalla, 0, 0, 0, 0);
 
  SDL_Delay(5000);
 
  SDL_FreeSurface(imagen);
 
  return 0;
}


Saludos

 

Desconectado servomac

  • Experto
  • ****
  • Mensajes: 378
    • Ver Perfil
    • http://
Transparencias de un BMP en SDL
« Respuesta #2 en: Marzo 31, 2004, 09:15:18 pm »
Muchisimas gracias por esta aclaraci?n (mejor, estas aclaraciones ;)). Ahora estoy intentando implementar la detecci?n de colisiones aplicando las cajas de colision o algo as?, es decir, en lugar de hacerlo con un circulo con un rectangulo (en mi caso con un cuadrado).
Para esto he creado una funci?n un poco cutre, ya que lo de las variables del radio (que bueno, exactamente no es un radio sino la mitad de la longitud de uno de los lados del cuadrado, no s? si me explico) deberian entrar como argumento, pero en la mia estan declaradas dentro ya que por ahora es un ejemplo muy simple.

Código: [Seleccionar]
int colision(SDL_Rect personaje, SDL_Rect objeto)
{
int pixels_radio_personaje = 27, pixels_radio_objeto = 82;

if ( (personaje.x + pixels_radio_personaje) >= (objeto.x - pixels_radio_objeto) || (personaje.x - pixels_radio_personaje) <= (objeto.x + pixels_radio_objeto) || (personaje.y - pixels_radio_personaje) <= (objeto.y + pixels_radio_objeto) || (personaje.y + pixels_radio_personaje) >= (objeto.y + pixels_radio_objeto) )
   {
   return 1;
   }
else
   {
   return 0;
   }
}

Y la utilizo al final del bucle de movimiento as? :

Código: [Seleccionar]
if(colision(RectDestino,RectBola) == 1) { printf("Hay colision.\n"); }
Pero el problema es que a cada movimiento que hago me indica que hay colision, y no veo que est? mal codificado el algoritmo de detecci?n de colisi?n, asi que no se que puede ser. Si le pudierais hechar una miradita me hariais favor.

??Saludos!!

P.D : Adjunto el codigo fuente completo.
« última modificación: Marzo 31, 2004, 09:20:12 pm por servomac »
Se necesita un ladr?n para coger a otro ladr?n, y eso no lo ense?a ning?n catedr?tico. (HVC)
"In a world without walls or fences, who needs Windows and Gates?"

KruMn

  • Visitante
Transparencias de un BMP en SDL
« Respuesta #3 en: Abril 01, 2004, 02:14:12 am »
Tu problema es este: si tienes el perosonaje, antes que el objeto. Por ejemplo si tienes el personaje en la posicion 1 y  el objeto en la 80, ahi detecta que no hay colicion:
Código: [Seleccionar]
(personaje.x + pixels_radio_personaje) >= (objeto.x - pixels_radio_objeto) Pero si el personaje se encuentra despues del objeto, vamos a suponer 120, aunque no este chocando con el objeto, el detecta que esta despues de 80 y dira que hay colicion.

En esta pagina encontraras unos buenos ejemplos de coliciones:

http://www.vjuegos.org/modules.php?name=Co...showpage&pid=34

Desconectado servomac

  • Experto
  • ****
  • Mensajes: 378
    • Ver Perfil
    • http://
Transparencias de un BMP en SDL
« Respuesta #4 en: Abril 07, 2004, 12:38:50 pm »
He estado trabajando en el codigo del "juego" y he hecho algo medianamente aceptable, sobretodo en el apartado de las colisiones. Para mas informaci?n podeis mirar este post.

??Saludos y gracias a todos!!
Se necesita un ladr?n para coger a otro ladr?n, y eso no lo ense?a ning?n catedr?tico. (HVC)
"In a world without walls or fences, who needs Windows and Gates?"