Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: kodiak en 21 de Septiembre de 2003, 11:30:03 PM

Título: Fondo En Sdl
Publicado por: kodiak en 21 de Septiembre de 2003, 11:30:03 PM
 ¿Qué rutina hay que usar para poner un decorado en SDL? Yo tanto usando la que uso para mostrar sprotes normales como usando SDL_BlitzImage() , se me relentiza muchísimo. Todo ello sin scroll, solo para poner decorado a un pong.  
Título: Fondo En Sdl
Publicado por: samsaga2 en 22 de Septiembre de 2003, 09:31:44 AM
 Si que es usando la funcion Blit. Asegurate hacer un SDL_DisplayFormat para optimizar las superficies (se nota mucho el cambio de velocidad).
Título: Fondo En Sdl
Publicado por: kodiak en 24 de Septiembre de 2003, 03:14:08 AM
Cita de: "samsaga2"Si que es usando la funcion Blit. Asegurate hacer un SDL_DisplayFormat para optimizar las superficies (se nota mucho el cambio de velocidad).
Lo hago, el código es más o menos así: (load_sprite hace un DisplayFormat() )

.
.
.

SDL_BlitSurface(load_sprite("fondo.bmp"),NULL,screen,NULL);
draw_sprite(screen, load_sprite("bola.bmp"), x, y);
draw_sprite(screen, load_sprite("pala.bmp"), pala1x, pala1y);
draw_sprite(screen, load_sprite("pala.bmp"), pala2x, pala2y);
.
.
.


si hago
SDL_Surface *fondo=load_sprite("fondo.bmp");
main()
{
.
.
SDL_BlitSurface(fondo,NULL,screen,NULL);
draw_sprite(screen, load_sprite("bola.bmp"), x, y);
draw_sprite(screen, load_sprite("pala.bmp"), pala1x, pala1y);
draw_sprite(screen, load_sprite("pala.bmp"), pala2x, pala2y);
....

me da un fallo de acceso a memoria   
      
Título: Fondo En Sdl
Publicado por: samsaga2 en 24 de Septiembre de 2003, 08:12:26 AM
 Estas volviendo a cargar la imagen en cada frame? No me extraña que te vaya lento entonces. La opcion buena es la segunda que pones, si te fallo de acceso a memoria es que estas haciendo algo mal (a lo mejor cargas bien la imagen pero le envias al blit el puntero que no toca).
Título: Fondo En Sdl
Publicado por: kodiak en 25 de Septiembre de 2003, 01:50:04 AM
Cita de: "samsaga2"Estas volviendo a cargar la imagen en cada frame? No me extraña que te vaya lento entonces. La opcion buena es la segunda que pones, si te fallo de acceso a memoria es que estas haciendo algo mal (a lo mejor cargas bien la imagen pero le envias al blit el puntero que no toca).
Pues no hago nada raro, hago el load_sprite() que devuelve un puntero a SDL_Surface y lo asigno al puntero fondo, y después me da el fallo. Pongo aquí el código de loadsprite y drawsprite(q por cierto ya hacía el blitz  (nooo) ) que saqué de un tutorial.

SDL_Surface *load_sprite(const char *filename)
{
   SDL_Surface * tmp, *bmp;
   Uint32 color_key;
   tmp=SDL_LoadBMP(filename);
   if(!tmp) return 0;
   color_key=SDL_MapRGB(tmp->format, 0, 0, 0);
   SDL_SetColorKey(tmp, SDL_SRCCOLORKEY|SDL_RLEACCEL, color_key);
   bmp=SDL_DisplayFormat(tmp);
   SDL_FreeSurface(tmp);
   if(!bmp) return 0;
   return bmp;
}


// Dibuja un sprite en screen
void draw_sprite(SDL_Surface *screen, SDL_Surface *sprite, int x, int y)
{
   SDL_Rect rect;
   rect.x=x;
   rect.y=y;
   SDL_BlitSurface(sprite, 0, screen, &rect);
}



Y eso, que no entiendo porqué da el fallo de acceso a memoría. Saludos y muchas gracias.
Título: Fondo En Sdl
Publicado por: kodiak en 02 de Octubre de 2003, 06:33:57 PM
Cita de: "kodiak"
Cita de: "samsaga2"Estas volviendo a cargar la imagen en cada frame? No me extraña que te vaya lento entonces. La opcion buena es la segunda que pones, si te fallo de acceso a memoria es que estas haciendo algo mal (a lo mejor cargas bien la imagen pero le envias al blit el puntero que no toca).
Pues no hago nada raro, hago el load_sprite() que devuelve un puntero a SDL_Surface y lo asigno al puntero fondo, y después me da el fallo. Pongo aquí el código de loadsprite y drawsprite(q por cierto ya hacía el blitz  (nooo) ) que saqué de un tutorial.

SDL_Surface *load_sprite(const char *filename)
{
   SDL_Surface * tmp, *bmp;
   Uint32 color_key;
   tmp=SDL_LoadBMP(filename);
   if(!tmp) return 0;
   color_key=SDL_MapRGB(tmp->format, 0, 0, 0);
   SDL_SetColorKey(tmp, SDL_SRCCOLORKEY|SDL_RLEACCEL, color_key);
   bmp=SDL_DisplayFormat(tmp);
   SDL_FreeSurface(tmp);
   if(!bmp) return 0;
   return bmp;
}


// Dibuja un sprite en screen
void draw_sprite(SDL_Surface *screen, SDL_Surface *sprite, int x, int y)
{
   SDL_Rect rect;
   rect.x=x;
   rect.y=y;
   SDL_BlitSurface(sprite, 0, screen, &rect);
}



Y eso, que no entiendo porqué da el fallo de acceso a memoría. Saludos y muchas gracias.
He hecho otra función para cargar el fondo(pero sin hacer las transparencias)  y ya no me da error de acceso a memoria, y me va bien. Gracias.