Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Fondo En Sdl

Iniciado por kodiak, 21 de Septiembre de 2003, 11:30:03 PM

« anterior - próximo »

kodiak

 ¿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.  

samsaga2

 Si que es usando la funcion Blit. Asegurate hacer un SDL_DisplayFormat para optimizar las superficies (se nota mucho el cambio de velocidad).

kodiak

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   
      

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).

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.

kodiak

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.






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.