Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Elelegido on February 28, 2009, 09:29:32 AM

Title: Problema con pasar de SDL_Surface a map.
Post by: Elelegido on February 28, 2009, 09:29:32 AM
Me he estado fijando en lo que habéis discutido en el hilo de la Pango, pero me falla algo. Cuando compruebo el mapa en bennu con "map_exists" me devuelve falso y obviamente en los frames no muestra nada.

Esto es lo que he puesto:
[code language="bennu"]
   if(SDL_GetVideoSurface()->format->BitsPerPixel == 16) {
      surface = SDL_CreateRGBSurface(0, iinfo.w,iinfo.h, 16, (((Uint32)0xff) >> 3) << 11, (((Uint32)0xff) >> 2) << 5 , ((Uint32)0xff) >> 3, 0);
   } else if (SDL_GetVideoSurface()->format->BitsPerPixel == 32) {
      surface = SDL_CreateRGBSurface(0, iinfo.w,iinfo.h, 32, (Uint32)(255 << (8*2)), (Uint32)(255 << (8*1)), (Uint32)(255 << 8*0), (Uint32)(255 << 8*3) );
   }

   SDL_BlitSurface(chipset,&rect, surface,0); // chipset es una imagen cargada con IMG_Load

   SDL_SaveBMP(surface, "prueba.bmp");

   GRAPH* gr1 = bitmap_new_ex(0, surface->w, surface->h, surface->format->BitsPerPixel, surface->pixels, surface->pitch);
   GRAPH* gr = bitmap_clone(gr1);
        bitmap_destroy(gr1);
        gr->code = bitmap_next_code() ;
        grlib_add_map( fpg, gr ) ; // fpg=0.

   return (gr->code);
[/code]

El archivo 'prueba.bmp' me sale perfecto, lo que me hace pensar que el error es de lo que viene después. La surface la guardo en una pila, y le aplico SDL_FreeSurface después del return y de testear con map_exists. Eso es todo, gracias por adelantado.
Title: Re: Problema con pasar de SDL_Surface a map.
Post by: Elelegido on February 28, 2009, 03:25:17 PM
Ahora si me detecta el mapa bien con map_exists pero no me saca la imagen por la pantalla de todas formas (me la saca negro).

He probado a hacer este paso al cargar el chipset:
[code language="bennu"]
        SDL_Surface* sdl_surf, *chipset=IMG_Load("tiles.png");
   if(SDL_GetVideoSurface()->format->BitsPerPixel == 16) {
      sdl_surf = SDL_CreateRGBSurfaceFrom(chipset->pixels,0, chipset->w,chipset->h, 16, (((Uint32)0xff) >> 3) << 11, (((Uint32)0xff) >> 2) << 5 , ((Uint32)0xff) >> 3, 0);
   } else if (SDL_GetVideoSurface()->format->BitsPerPixel == 32) {
      sdl_surf = SDL_CreateRGBSurfaceFrom(chipset->pixels,0, chipset->w,chipset->h, 32, (Uint32)(255 << (8*2)), (Uint32)(255 << (8*1)), (Uint32)(255 << 8*0), (Uint32)(255 << 8*3) );
   }
   SDL_FreeSurface(chipset);
   chipset=sdl_surf;
[/code]
Y creo que esto es lo que ha producido ese efecto, o igual no, que he tocado alguna cosa más...

En cualquier caso compruebo que como cabria de esperar gr->data tiene exactamente la misma info que surface->pixels. Se me hace raro que siendo así no me cargue nada por la pantalla.

EDIT: Pero ahora los .bmp obtenidos en SDL_SaveBMP salen mal. Totalmente negros... creo que el fallo tiene que estar en por ahí, en la creación de chipset o surface, y que tendrá que ver con las máscaras, pero no tengo idea...
Title: Re: Problema con pasar de SDL_Surface a map.
Post by: SplinterGU on March 02, 2009, 02:46:42 AM
ahora mismo no tengo ni 10 minutos, pero en estos dias tendre algo de tiempo y te dare una mano...
Title: Re: Problema con pasar de SDL_Surface a map.
Post by: Elelegido on March 03, 2009, 09:02:12 AM
Ok, no problem. Cuando puedas :P
Title: Re: Problema con pasar de SDL_Surface a map.
Post by: SplinterGU on March 03, 2009, 11:34:38 AM
preguntas:

1) Version de Bennu?
2) Profundidad de colores de la pantalla?
3) Profundidad de colores de las surface?

La modificacion que posteaste que decis supones hace que funcione el map_exists, no puede ser... debes tener otro cambio... o seria bueno que pongas log e imprimas que te retorna cada funcion...