Ver la versión completa : Ayuda SDL: IMG_Load en GP32
Mi duda es con el IMG_Load, cuando compilo para windows las imagenes cargan bien (uso la funcion DrawImagen de Puck, modificada para admitir transparencias), pero cuando voy a probarlo para la GP no se muestra nada.
Eskema me dijo que para que las imagenes se vieran en la GP hay que usar el define DATA_PREFIX, pero claro, si voy a compilar para windows me da error con eso :S
No hay algo "intermedio" que funcione para win y para la gp????
Mi duda es con el IMG_Load, cuando compilo para windows las imagenes cargan bien (uso la funcion DrawImagen de Puck, modificada para admitir transparencias), pero cuando voy a probarlo para la GP no se muestra nada.
Eskema me dijo que para que las imagenes se vieran en la GP hay que usar el define DATA_PREFIX, pero claro, si voy a compilar para windows me da error con eso :S
No hay algo "intermedio" que funcione para win y para la gp????
Yo uso SDL para gp32 y uso el IMG_Load y no hago nada especial. Ah! y no se que **** hace el DrawImagen de Puck pero hay una funcion en SDL para definir la imagen como trasparente ;)
En este ejemplo, se pone la imagen 'surface' como trasparente con el color 0xFF
SDL_SetColorKey(surface,SDL_SRCCOLORKEY | SDL_RLEACCEL, 0xFF);
Aiken :brindis:
Yo uso esto: SDL_SetColorKey(imagen, SDL_SRCCOLORKEY, SDL_MapRGB(imagen->format, 255, 255, 255)); que me lo dijo Eskema :P y es lo mismo jejeje, yo lo ke hago con la funcion de drawimage es pasarle los valores RGB, y si le pasas -1 a cualquier valor pues no pone transparencia. Pero el problema lo tengo con el IMG_Load :S que no me carga las imagenes en la GP....:( quizas sea por el makefile... no se :S
Puck2099
23/10/2005, 20:11
"Mi" DrawImage está en los ejemplos del Wiki de las SDL:
int DrawImage( SDL_Surface *surface, char *image_path, int x_pos, int y_pos )
{
SDL_Surface *image = IMG_Load ( image_path );
if ( !image )
{
printf ( "IMG_Load: %s\n", IMG_GetError () );
return 1;
}
// Draws the image on the screen:
SDL_Rect rcDest = { x_pos, y_pos, 0, 0 };
SDL_BlitSurface ( image, NULL, surface, &rcDest );
SDL_FreeSurface ( image );
return 0;
}
TRaFuGa, ¿por qué no pegas tu código aquí o adjuntas los ficheros para probarlos y ver qué pasa? :)
Saludos
Ok, te paso mi carpeta con los makefiles y tal, por si estan mal tb xD, en un principio iba a meter las funciones en un fichero .c aparte, pero nose ke pasaba ke daba problemas, y para probar las he metido en el main, total, son solo 2... xD
Yo lo que estoy intentando hacer es una "base" para empezar a hacer juegos... :P
Puck2099
23/10/2005, 20:21
Ok, te paso mi carpeta con los makefiles y tal, por si estan mal tb xD, en un principio iba a meter las funciones en un fichero .c aparte, pero nose ke pasaba ke daba problemas, y para probar las he metido en el main, total, son solo 2... xD
Yo lo que estoy intentando hacer es una "base" para empezar a hacer juegos... :P
Me lo bajo y le echo un vistazo :)
Si es q eso es pasa por copiar los ejemplos de los "pofesionales" como yo xDDD. Respecto a tu pregunta, como bien te dije por lo menos yo no he podido cargar las imagenes si pongo ("graficos/grafico.png") pero si uso la linea del make para definir un path me va perfecto tanto en win como en gp :)
Bueno, ya he conseguido mostrar una imagen en la GP32...pero sólo una!
pongo esto:
dibujarimagen(pantalla,"gpmm/graficos/fondo.bmp",x,y,-1,-1,-1);
dibujarimagen(pantalla,"gpmm/graficos/personaje.png",x2,y2,255,255,255);
Y sólo dibuja el fondo. En mi funcion es igual que la que ha puesto puck, pero le paso los valores R G y B para definir transparencias, si le paso -1 en alguno de los valores pues no hay transparencia.
Con eso sólo se muestra el fondo y al personaje le dan mucho porculio xD, ¿hay alguna solución a esto o esa funcion es para cargar una UNICA imagen, de manera que tenemos que declarar los surfaces para el resto de imagenes?
Puck, he probado tu funcion y no funciona, ¿tiene algun truco?
dibujaimagen(pantalla,"gpmm/graficos/fondo.bmp",x2,y2,-1,-1,-1);
dibujaimagen(pantalla,"gpmm/graficos/personaje.png",xp,yp,255,255,255);
SDL_Flip(pantalla);
Tan solo se muestra 1 imagen pero no las otras, ¿q problema hay?
Puck2099
24/10/2005, 02:50
Bueno, ya he conseguido mostrar una imagen en la GP32...pero sólo una!
pongo esto:
dibujarimagen(pantalla,"gpmm/graficos/fondo.bmp",-1,-1,-1);
dibujarimagen(pantalla,"gpmm/graficos/personaje.bmp",255,255,255);
Y sólo dibuja el fondo. En mi funcion es igual que la que ha puesto puck, pero le paso los valores R G y B para definir transparencias, si le paso -1 en alguno de los valores pues no hay transparencia.
Con eso sólo se muestra el fondo y al personaje le dan mucho porculio xD, ¿hay alguna solución a esto o esa funcion es para cargar una UNICA imagen, de manera que tenemos que declarar los surfaces para el resto de imagenes?
Yo llevo liado con tu programa toda la tarde sin conseguir resultados...
Lo de la segunda imagen, ¿está a 8 bits? Porque en lo que me has pasado mezclas una imagen en 8 bits con otra en 16 o 24...
Puck2099
24/10/2005, 02:52
*****, me estoy rallando... TRaFuGa, ¿has escrito un mensaje y luego borrado y escrito otro? Lo digo porque te he hecho una cita de tu mensaje y me sale que tu segunda imagen era un bmp y ahora veo que escribes un png...
no joas? xD eske lo retoco con el paint... xD
He probado a pasar el personaje a BMP de 256 colores, y aún así no funciona...
*****, me estoy rallando... TRaFuGa, ¿has escrito un mensaje y luego borrado y escrito otro? Lo digo porque te he hecho una cita de tu mensaje y me sale que tu segunda imagen era un bmp y ahora veo que escribes un png...
Es el mismo, lo ke pasa ke me ekivoke al poner el codigo como yo lo tenia. Pero bueno, seguiré probando que me acaba de decir Eskema ke a el le funciona con las iamgenes a 8 bits...
Cierto tenia una imagen a 8 y otra a 16bits y por eso no se veian, pero con las imagenes en el mismo formato funciona perfectamente. Ahora solo falta ver si se puede usar esa funcion tuya para cargar tiles ;) asias Puck
Puck2099
24/10/2005, 03:08
Cierto tenia una imagen a 8 y otra a 16bits y por eso no se veian, pero con las imagenes en el mismo formato funciona perfectamente. Ahora solo falta ver si se puede usar esa funcion tuya para cargar tiles ;) asias Puck
Si usas las 2 en 16 bits es de suponer que funcionará también.
Y las tiles yo las cargo así:
void DrawIMG (SDL_Surface * img, int x, int y, int w, int h, int x2, int y2) {
SDL_Rect dest;
dest.x = x;
dest.y = y;
SDL_Rect src;
src.x = x2;
src.y = y2;
src.w = w;
src.h = h;
SDL_BlitSurface (img, &src, screen, &dest);
}
Teniendo en cuenta que ya tienes cada mapa de tiles en una surface.
No es por nada, pero a mi me sigue sin funcionar en la GP... en win va perfectamente, pero en la GP solo carga el fondo... :quepalmo:
Puck2099
24/10/2005, 03:24
No es por nada, pero a mi me sigue sin funcionar en la GP... en win va perfectamente, pero en la GP solo carga el fondo... :quepalmo:
Yo con la imagen convertida tampoco lo consigo...
No te puedo ayudar mucho porque no cargo las imágenes desde el disco, sino desde memoria...
Puck es normal q vaya tan leeeeeeeeeeeento? a 60mhz esta pequeña demo de trafuga se arrastra
Puck2099
24/10/2005, 03:30
Puck es normal q vaya tan leeeeeeeeeeeento? a 60mhz esta pequeña demo de trafuga se arrastra
Depende, ¿la demo es el código que ha pegado trafuga? Si es así cambia el "SDL_Delay(50);" por un valor menor o directamente bórralo.
Saludos
si puck ya esta quitado y ni se mueve :(
Puck2099
24/10/2005, 03:43
si puck ya esta quitado y ni se mueve :(
Anda, pásame un zip con todo el proyecto y le echo un vistazo a ver que le pasa :)
Puck, aki tienes el zip con el base.c y las imagenes, ya he conseguido que se vea la imagen, y pasa lo miso que a Eskema, va lentisimo (yo no he kitado el sd_delay..) mira a ver que pasa...
Puck2099
24/10/2005, 04:13
Si no me equivoco el problema es porque cargas en cada ciclo las imágenes, lo que conlleva una lectura de disco (y todos sabemos lo lento que se accede a la SMC).
Voy a rehacer un poco el código y te lo pongo, a ver que tal te va ;)
¿No se pierde mucho rendimiento cargando las imagenes en memoria? pq yo las cargue desde la tarjeta con el comando y el juego iba fino, no he probado nunca eso de ponerlas en memoria, ¿puedes orientarnos?
Puck2099
24/10/2005, 04:45
¿No se pierde mucho rendimiento cargando las imagenes en memoria? pq yo las cargue desde la tarjeta con el comando y el juego iba fino, no he probado nunca eso de ponerlas en memoria, ¿puedes orientarnos?
No, al cargarlas en memoria solo ocupan memoria. Si vas sobrados así va mucho más rápido que cargándolas cada vez de disco.
Adjunto el archivo .c modificado, mirad si no va más rápido ahora ;)
Al final Eskema va a tener razon, un surface por cada imagen... la cuestion de usar la funcion dibujaimagen era para evitar eso, pero por lo visto o no se puede, o no es factible... (si lo llegamos a saber desde el principio pasamos del tema xD). Lo que nos kisimos ahorrar, nos ha salido por la culata xD
no entiendo esta parte del codigo...
SDL_Rect src;
src.x = x2;
src.y = y2;
src.w = w;
src.h = h;
SDL_BlitSurface (img, &src, surface, &dest);
Para que creas otro sdl rect????? y luego lo usas ahi????
yo no he podido cargar las imagenes si pongo ("graficos/grafico.png") pero si uso la linea del make para definir un path me va perfecto tanto en win como en gp :)
juas!! sera cosa de windows linux pero yo pongo ("graficos\\grafico.png")
si, si con doble barra invertida, al fin y al cabo la gp32 usa FAT12 que es msdos/windoze :D
Aiken
Puck2099
24/10/2005, 05:10
no entiendo esta parte del codigo...
SDL_Rect src;
src.x = x2;
src.y = y2;
src.w = w;
src.h = h;
SDL_BlitSurface (img, &src, surface, &dest);
Para que creas otro sdl rect????? y luego lo usas ahi????
Eso es para dibujar solo trozos de la imagen, si la quieres dibujar entera pones el tamaño total de la imagen, pero si lo que quieres es dibujar solo una parte de la imagen (por ejemplo porque tienes varios tiles en un solo mapa de tiles) pues le pones las coordenadas adecuadas y listo :)
D_Skywalk
24/10/2005, 17:43
La verdad que aun tengo varias dudas de como hacerlo, como visteis por alguno de mis posts. lo que hago es tener SDL_Surface por tile, lo cual es un poco bruto, pero que me permite aumentar el rendimiento de la aplicacion ya que no tiene que calcular nada simplemente bliteo surfaces completas :)
Cuento un poco mi teoria por si le vale a alguien :)
Al principio cargo todos los tiles que necesita la zona, y los cargo en una estructura de baldosas (tiles). Una vez los tengo todos cargados paso a cargar los kekos, y finalmente cargo el array con el mapa de la zona.
Cuando el personaje sale de la zona, descargo memoria y cargo el nuevo mapa de nuevo, siguiendo los pasos anteriores :=)
Como digo por ahora no he tenido problema, cargo la aplicacion a 44mhz y va sobrada, eso si, no se lo que ocupo de memoria :?
Quizas cuando haga el mapeador cree alguna estructura de sprites, para tener las coordenadas (dentro del BMP) del sprite, flags para el juego, etc...
Eskema, tienes un cargador de los mapas de que genera el Mappy?
Un Saludo
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.