problema SDL

Hola el caso es que tengo un problema para actualizar la pantalla el personaje me deja un rastro :

http://www.megaupload.com/?d=LPP1F8LT

el código es este:




#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include "SDL/SDL_thread.h"


//hilo
//hacer una variable flag(true,false) y dsp decir que si se apreto en el menu alguna que sea true y que corra todo.
SDL_Rect pos2;
SDL_Surface * fondo5;
SDL_Surface * screen;
SDL_Surface * pantalla;
SDL_Rect pos3;

int start = 1;
int salir=0;
int ia_enemigo(void *unused){
while (! salir) {
if (start==1){
int b;
for(b=0;b<1000;b++){
if (b>0 && b<200)pos2.x++;
if (b>200 && b<400)pos2.x++,pos2.y--;
if (b>400 && b<600)pos2.x--;
if(b>600 && b<800)pos2.y++,pos2.x--;
if (b>800 && b<1000)pos2.y--;

SDL_BlitSurface (fondo5 , NULL, screen, &pos2);
SDL_Flip (screen);



}
}
}
}
int main(int argc, char *argv[])

{
//declaración de variables




SDL_Surface * fondo;
SDL_Surface * fondo1;
SDL_Surface * fondo2;
SDL_Surface * fondo3;
SDL_Surface * fondo4;
SDL_Surface * disparo;
SDL_Surface * frameact;
SDL_Surface * menu;
SDL_Thread * inteligencia;
SDL_Event event;
SDL_Rect pos;
SDL_Rect posd;
SDL_Rect posnave;

//inicialización de SDL

if(SDL_Init(SDL_INIT_VIDEO)<0)
{
printf("ERROR: %s \n", SDL_GetError());
return 1;
}
screen = SDL_SetVideoMode(580,470,24, SDL_SWSURFACE|SDL_DOUBLEBUF);
if (screen==NULL){
printf("Error: %s \n", SDL_GetError());
return 1;
}

inteligencia = SDL_CreateThread(ia_enemigo,(void *)NULL);

//parte logica

pos.x=0;
pos.y=0;
pos.w=56;
pos.h=81;

pos2.x=0;
pos2.y=300;
pos2.w=275;
pos2.h=325;

posd.w=45;
posd.h=20;

pos3.x=0;
pos3.y=0;
pos3.w=1024;
pos3.h=768;

fondo = SDL_DisplayFormat(SDL_LoadBMP ("pacman_central.bmp"));
fondo1 = SDL_DisplayFormat(SDL_LoadBMP ("pacman_arriba.bmp"));
fondo2 = SDL_DisplayFormat(SDL_LoadBMP ("pacman_abajo.bmp"));
fondo3 = SDL_DisplayFormat(SDL_LoadBMP ("pacman_derecha.bmp"));
fondo4 = SDL_DisplayFormat(SDL_LoadBMP ("pacman_izquierda.bmp"));
fondo5 = SDL_DisplayFormat(SDL_LoadBMP ("pacman.bmp"));
disparo = SDL_DisplayFormat(SDL_LoadBMP ("shoot.bmp"));
menu = SDL_DisplayFormat(SDL_LoadBMP ("titulo.bmp"));
pantalla = SDL_DisplayFormat(SDL_LoadBMP ("Empyrean.bmp"));
SDL_SetColorKey(fondo1,SDL_SRCCOLORKEY,SDL_MapRGB(fondo1->format,255,0,255));
SDL_SetColorKey(fondo2,SDL_SRCCOLORKEY,SDL_MapRGB(fondo2->format,255,0,255));
SDL_SetColorKey(fondo3,SDL_SRCCOLORKEY,SDL_MapRGB(fondo3->format,255,0,255));
SDL_SetColorKey(fondo4,SDL_SRCCOLORKEY,SDL_MapRGB(fondo4->format,255,0,255));
SDL_SetColorKey(fondo5,SDL_SRCCOLORKEY,SDL_MapRGB(fondo5->format,255,0,255));
SDL_BlitSurface (pantalla , NULL, screen, &pos3);///ponerlo en un hilo nuevo
SDL_Flip (screen);
SDL_BlitSurface (pantalla , NULL, screen, &pos3);///ponerlo en un hilo nuevo
SDL_Flip (screen);


//loop principal
while (! salir){

SDL_PollEvent(&event);




//si se pulso una tecla
if (event.type == SDL_KEYDOWN){


if (event.key.keysym.sym == SDLK_ESCAPE){
salir=1;

}





//disparo



if (event.key.keysym.sym == SDLK_SPACE){
posd.x=pos.x+25;
posd.y=pos.y-18;
if (frameact==fondo3){
while (posd.x<=640){
SDL_BlitSurface (disparo , NULL, screen, &posd);
SDL_Flip (screen);
posd.x=posd.x + 8;
if( posd.x > pos2.x && posd.x < ( pos2.x + pos2.w ) ) if( posd.y > pos2.y && posd.y < ( pos2.y + pos2.h ) ) salir=1;

}
}
if (frameact==fondo4){
while (posd.x>=0){
SDL_BlitSurface (disparo , NULL, screen, &posd);
SDL_Flip (screen);
posd.x=posd.x - 6;
if( posd.x > pos2.x && posd.x < ( pos2.x + pos2.w ) ) if( posd.y > pos2.y && posd.y < ( pos2.y + pos2.h ) ) salir=1;

}
}
}
//fin disparo
//direcciones de movimiento

if (event.key.keysym.sym == SDLK_RIGHT){
frameact=fondo3;
SDL_BlitSurface (fondo3 , NULL, screen, &pos);
SDL_Flip (screen);
if( pos2.x > pos.x && pos2.x < ( pos.x + pos.w ) ) if( pos2.y > pos.y && pos2.y < ( pos.y + pos.h ) ) salir=1;
pos.x=pos.x + 2;

}
if (event.key.keysym.sym == SDLK_LEFT){
frameact=fondo4;
SDL_BlitSurface (fondo4 , NULL, screen, &pos);
SDL_Flip (screen);
if( pos2.x > pos.x && pos2.x < ( pos.x + pos.w ) ) if( pos2.y > pos.y && pos2.y < ( pos.y + pos.h ) ) salir=1;
pos.x = pos.x - 2;

}


if (event.key.keysym.sym == SDLK_UP){
frameact=fondo1;
SDL_BlitSurface (fondo1 , NULL, screen, &pos);
SDL_Flip (screen);
if( pos2.x > pos.x && pos2.x < ( pos.x + pos.w ) ) if( pos2.y > pos.y && pos2.y < ( pos.y + pos.h ) ) salir=1;

pos.y = pos.y - 2;

}


if (event.key.keysym.sym == SDLK_DOWN){
frameact=fondo2;
SDL_BlitSurface (fondo2 , NULL, screen, &pos);
SDL_Flip (screen);
if( pos.x > pos2.x && pos.x < ( pos2.x + pos2.w ) ) if( pos.y > pos2.y && pos.y < ( pos2.y + pos2.h ) ) salir=1;

pos.y = pos.y + 2;

}

}
}

SDL_Flip (screen);
}




//ESPERO QUE ME PUEDAN AYUDAR GRACIAS =)
Sin mirar mucho el codigo, que se lee bastante mal si no usas un bloque de [code], tiene pinta de que no redibujas el fondo en cada frame.

O bien repintas la parte donde antes estaba el personaje, o bien el fondo entero, _antes_ de pintar el personaje, enemigos, disparos...

vamos:

> pintar fondo en la pantalla virtual
> pintar enemigos en la pantalla virtual
> pintar el personaje en la pantalla virtual
> volcar pantalla virtual a pantalla real
1 respuesta