Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Q Libreria De Sdl .....

Iniciado por Lucas333, 18 de Diciembre de 2004, 01:14:06 AM

« anterior - próximo »

Lucas333

 Hola estoy haciendo unas pruebas con sdl y quiero cargar unas imagenes .tif con transparencias .El problema es que cargo un fichero cualquiera (bmp,jpg,gif....) y no tengo problemas me lo pinta en la consola, me lo muestra ,pero cuando es una imagen tif ,al q mediante el photoshop le he quitado el fondo falla no me muestra nada....creo q con el png ocurriria lo mismo por eso quiero saber si alguien conoce una libreria de sdl q carga este tipo de imagenes o si hay alguna manera de poder cargarlas  

CoLSoN2

Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Lucas333


Lucas333

 si uso esa libreria sdl_image y creo q es eso q la imagen lleva transparencias pero al pintarla con img_load...la funcion q uso para cargar la imagen es

SDL_Surface *load_sprite(const char *filename)
{
 SDL_Surface *tmp, *bmp;
 Uint32 color_key;

 tmp=IMG_Load(filename);
 if(!tmp) return 0;

 color_key=SDL_MapRGB(tmp->format, 255, 0, 255);
 SDL_SetColorKey(tmp, SDL_SRCCOLORKEY|SDL_RLEACCEL, color_key);
 bmp=SDL_DisplayFormat(tmp);
 SDL_FreeSurface(tmp);
 if(!bmp) return 0;

 return bmp;
}




y claro cuando el fichero q le paso es s.tif me falla me devuelve un 0 me falla en IMG_LOAD...
Como podria cargar una iamgen con transparencias??

Javi SJ Cervera

 Currate tu una funcion de carga manual de TGAs, que el formato está tirado.
== Jedive ==

Lucas333

 y como se hace?pq en eso me pillas en fura de juego  

nsL

 Supongo que sera mirandote las cabeceras de un TGA y viendo como estan distribuidos los pixeles y pasarlos a una SDL_Surface de SDL...

Por si te vale de algo --> Formatos

Saludos!  B)  
Yo no muero hasta la muerte -

ALRAZ

 creo que el problema es porque no le estás poniendo el SDL_SetAlpha o algo así...
yo tenía el mismo problema con los PNGs que no me mostraba transparencias...

y creo recordar que la solución fue el setalpha...
claro, esto crea otros problemillas si el modo gráfico no es 32 bpp o si en la misma función cargas imágenes sin transparencias...

es todo un lio  :huh:  

Lucas333

 ALRAZ me puedes poner el codigo q usaste tu para solucionar eso?es q no te entiendo del todo ..es que si funciona pues las paso a png y ya esta solucionado

javiel

 utiliza

bmp=SDL_DisplayFormatAlpha(tmp);

De todas formas creo que lo mejor que puedes hacer es utilizar PNG que para mi es el formato más completo. Yo estoy haciendo un juego en SDL y todas las imágenes las tengo en PNG y tienen transparencias y va de escándalo. Además te pilla los grados de opacidad en la imagen. Y ademas es un formato libre.

Lo unico que tendrás problemas al utilizar DisplayFormatAlpha, que no vas a poder utilizar SDL_SetAlpha si tiene transparecias el PNG. Para ello te vas a tener que currar una funcion, copiar la imagen en un nuevo SDL_Surface y quitar el color con ColorKey.

Saludos
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

Lucas333

 pero una cosa si el png tienes ya incorporado las transparencias le haces lo del colorkey??o solo a los q quieres quitarle un color?pq entonces para q quieres hacer en png con transparencias si luego tienes q quirarle el fondo con  colorkey?

javiel

 claramente al png no hay que hacerle el colorkey

Si quieres puedes mirar unas librerías en SDL para hacer animaciones que he hecho

http://sdl-animation.software-libre.org

Mira la documentacion. Puedes agregar un archivo XML que tiene toda la animacion. En el puedes cargar archivos PNG con transparencias. Puedes mirar el código y lo verás mas claro

Hay una demo con las tiras de bilo y nano y hay 1 archivo PNG con transparencias

saludos
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

ALRAZ

 Cómo lo solucioné yo...?

mmmm....
bueno, este código no es la cosa más inteligente; me llevó varios días hacer que funcionara bien a cualquier profundidad de color independientemente de la resolución. La tardanza fue porque el SDL_Image hace un lio con las imágenes que carga si la profundidad de color del archivo no es la misma que la de la pantalla
que si 32 sobre 16, 16 sobre 32, 32 y 32...
aún así no estoy convencido de que funcione  :P

a mi no me da problemas con PNGs  y un backbuffer de 32 bits. Te carga también bmps 24 bits
pero más de eso no he probado




//Todo esto va en un ciclo que extrae una imagen de una "biblioteca" y lo pone como archivo temporal

     Surf = IMG_Load ("img.tmp");

     //Checamos la profundidad de color de la imagen yen base a eso hacemos las adaptaciones necesarias
     switch (Surf->format->BytesPerPixel)
     {
        case 1:                   //Paletizado... esto da miedo...

           SDL_SetColorKey (Surf, SDL_SRCCOLORKEY, Color);                  //Aquí "Color" es un índice dentro de la paleta
           Acumulador [i]  = SDL_DisplayFormat(Surf);                               //Acumulador es un Arreglo de SDL_Surface *
           SDL_SetColorKey (Acumulador [i], SDL_SRCCOLORKEY, Color);
           break;

        case 2:                  //16 y 24 bpp. Esto ya se ve mejor
        case 3:

                //Pantalla es mi Buffer de video y R, G, B los que tu sabes que son color key
           SDL_SetColorKey (Surf, SDL_SRCCOLORKEY, SDL_MapRGB (Pantalla->format, R, G, B));  
           Acumulador [i] = SDL_DisplayFormat(Surf);
           SDL_SetColorKey (Acumulador [i], SDL_SRCCOLORKEY, SDL_MapRGB (Pantalla->format, R, G, B));
           break;

        case 4:                   //32 bpp: el que andabamos buscando

           SDL_SetColorKey (Surf, SDL_SRCCOLORKEY, SDL_MapRGBA (Pantalla->format, R, G, B, A));

            //Si nuestra pantalla no es de 32 bpp, de nada nos sirve usar el canal Alpha
           if (Pantalla->format->BytesPerPixel == 4)
           {
                //Sí es de 32 bits! que bien!
              SDL_SetAlpha (Surf, SDL_SRCALPHA, SDL_ALPHA_OPAQUE);
              Acumlador [i] = SDL_DisplayFormatAlpha(Surf);
           }
           else                       //Y si no es, pues ni modo :(
              Acumulador [i] = SDL_DisplayFormat(Surf);

           break;
     }


Cómo vez, (aparentemente) es cuestion de usar el display format alpha sólo cuando tanto la pantalla como la imagen son de 32 bits;  esta rutinilla también me carga las transparencias de los PNGs cuando la pantalla es de 16 bits.
La verdad no estoy seguro que esto de buenos resultados en cualquier profundidad de color.

Edit: Cuando la resolución de pantalla no es de 32 bpp, se usa el canal Alpha del Color_Key para darle transparencia a la imagen. Creo que por eso SDL te da dos funciones de color keying, una con alpha y otra sin alpha

ALRAZ

 olvidé algo muy importante!! (nooo)

Al final, luego de la última llave va esto:


     SDL_FreeSurface (Surf);

     //Aquí cierra el ciclo

Lucas333

 El problema es q no reconoce el formato tiff pero he probado con la de setAlpha y las imagenes en png y funciona de putisima madre.Gracias a todos ;)  






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.