Problema en la actualizacion de superficies

Problema en la actualizacion de superficies

Notapor zeroxcol94 » Vie Jul 27, 2012 7:26 pm

hola soy yo de nuevo,ya solucione lo del minimapa pero ahora tengo un problemita, resulta que la imagen que representa al personaje en el minimapa deja un rastro de su movimiento mientras avanza,yo creo que es un problema de actualizacion. ya que estoy dibujandolo en la superficie del minimapa, no en la pantalla. si compilan el codigo fuente que les dejo, veran lo que pasa, este codigo lo tome prestado de un usuario de aqui y lo adapte a mis nececidades:

#include <stdio.h>
#include <SDL.h>

void Teclado();

SDL_Surface *pantalla;
SDL_Surface *pj;
SDL_Surface *fondo;
SDL_Surface *minimapa;
SDL_Surface *pj_minimapa;

SDL_Rect pj_r;
SDL_Rect fondo_r;
SDL_Rect minimapa_r;
SDL_Rect pj_minimapa_r;

SDL_Event evento;

bool salir = false;
char titulo[]="Prueba de minimapa 01 - zeroxcol94";
int vel = 1;
int vel_x = 0;
int vel_y = 0;
const int PANTALLA_ANCHO = 800;
const int PANTALLA_ALTO = 600;

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

SDL_Init( SDL_INIT_VIDEO );
SDL_WM_SetCaption( titulo, NULL );
pantalla = SDL_SetVideoMode(PANTALLA_ANCHO,PANTALLA_ALTO,24,SDL_HWSURFACE);
fondo = SDL_LoadBMP("fondo.bmp");
pj = SDL_LoadBMP("pj.bmp");
minimapa = SDL_LoadBMP("minimapa.bmp");
pj_minimapa = SDL_LoadBMP("pj_minimapa.bmp");

pj_r.x = 0;
pj_r.y = 0;
pj_r.w = pj->w;
pj_r.h = pj->h;

fondo_r.x = 0;
fondo_r.y = 0;
fondo_r.w = fondo->w;
fondo_r.h = fondo->h;

minimapa_r.x = 560;
minimapa_r.y = 415;
minimapa_r.w = minimapa->w;
minimapa_r.h = minimapa->h;

pj_minimapa_r.x = 0;
pj_minimapa_r.y = 0;
pj_minimapa_r.w = pj_minimapa->w;
pj_minimapa_r.h = pj_minimapa->h;

while( salir == false )
{
while( SDL_PollEvent( &evento ) )
{
Teclado();
if( evento.type == SDL_QUIT ){ salir = true; }
if(evento.key.keysym.sym == SDLK_ESCAPE ){ salir = true;}

}

pj_r.x += vel_x;
pj_r.y += vel_y;

if(pj_r.x<0)pj_r.x=0;
if(pj_r.x+50>PANTALLA_ANCHO)pj_r.x-= vel_x;
if(pj_r.y<0)pj_r.y=0;
if(pj_r.y+50>PANTALLA_ALTO)pj_r.y-= vel_y;

//Ecuacion que transforma las coordenadas reales a las cordenadas del minimapa
pj_minimapa_r.x = (pj_r.x / float(PANTALLA_ANCHO) ) *240;
pj_minimapa_r.y = (pj_r.y / float(PANTALLA_ALTO) ) *185;

SDL_BlitSurface(fondo,NULL,pantalla,&fondo_r);
SDL_BlitSurface(pj,NULL,pantalla,&pj_r);
SDL_BlitSurface(minimapa,NULL,pantalla,&minimapa_r);
SDL_BlitSurface(pj_minimapa,NULL,minimapa,&pj_minimapa_r);
SDL_Flip(pantalla);



}


SDL_FreeSurface(fondo);
SDL_FreeSurface(minimapa);
SDL_FreeSurface(pj);
SDL_FreeSurface(pj_minimapa);

SDL_Quit ();
return 0;
}

void Teclado(){

if( evento.type == SDL_KEYDOWN )
{
switch( evento.key.keysym.sym )
{
case SDLK_UP: vel_y -= vel; break;
case SDLK_DOWN: vel_y += vel; break;
case SDLK_LEFT: vel_x -= vel; break;
case SDLK_RIGHT: vel_x += vel; break;
}
}

else if( evento.type == SDL_KEYUP )
{
switch( evento.key.keysym.sym )
{
case SDLK_UP: vel_y += vel; break;
case SDLK_DOWN: vel_y -= vel; break;
case SDLK_LEFT: vel_x += vel; break;
case SDLK_RIGHT: vel_x -= vel; break;
}
}

}


la libreria grafica utilizada se llama SDL. Espero que me ayuden en este problemita. :roll: :cry: :?
zeroxcol94
 
Mensajes: 9
Registrado: Jue Jul 26, 2012 3:33 pm

Re: Problema en la actualizacion de superficies

Notapor Barajas » Sab Jul 28, 2012 12:32 am

zeroxcol94 escribió:yo creo que es un problema de actualizacion. ya que estoy dibujandolo en la superficie del minimapa, no en la pantalla


En efecto, ese es el problema...

Básicamente lo que estas asiendo es:

mientras jugar:
dibujar en pantalla fondo
dibujar en pantalla personaje
dibujar en pantalla minimapa
dibujar en minimapa personaje_minimapa


Si lo ejecutas unas veces, en pantalla siempre se redibuja el fondo y después el personaje, a la siguiente vuelta pasa lo mismo, esta borrando la imagen anterior.

Pero en el minimapa eso no ocurre, ya que nunca "borras" la imagen anterior, por eso te deja ese rastro cuando lo mueves....

intenta algo parecido a esto, aun que claro, esta escrito en pseudocodigo:

minimapa = carga minimapa

copia_de_minimapa = copiar minimapa

mientras jugar:
dibujar en pantalla el fondo
dibujar en pantalla el personaje
dibujar en pantalla la copia_minimapa
dibujar en copia_minimapa el personaje_minimapa

copia_minimapa = copiar minimapa


De esta forma "se limpia" el minimapa cada vez que lo usas, aun que si te parece bastante molesto tener que hacer una copea de la imagen cada vez...

minimapa = carga minimapa

superficie_minimapa = imagen del tamaño de minimapa

mientras jugar:
dibujar en pantalla el fondo
dibujar en pantalla el personaje

dibujar en pantalla superficie_minimapa
dibujar en superficie_minimapa el minimapa
dibujar en superficie_minimapa el personaje_minimapa


Donde lo que le ocurre a superficie_minimapa es parecido a lo que ocurre con la pantalla...
Espero que te sirva... :D
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Problema en la actualizacion de superficies

Notapor zeroxcol94 » Sab Jul 28, 2012 2:56 am

jejeje,si definitiva mente resolviste mi problema, hice lo que me dijiste cree una superficie del mismo tamaño que el minimapa y este funcionaria como una superficie base (pantalla) y luego puse todo lo demas. yo tambien tuve la idea de copiar la superficie pero la estaba haciendo mal.gracias te agradesco mucho tu ayuda.aqui dejo el codigo fuente por si alguien lo necesita. avisenme si algo les funciona mal: :D :mrgreen: :D :mrgreen:

#include <stdio.h>
#include <SDL.h>

void Teclado();

SDL_Surface *pantalla;
SDL_Surface *pj;
SDL_Surface *fondo;
SDL_Surface *minimapa;
SDL_Surface *minimapa_aux;
SDL_Surface *pj_minimapa;

SDL_Rect pj_r;
SDL_Rect fondo_r;
SDL_Rect minimapa_r;
SDL_Rect minimapa_aux_r;
SDL_Rect pj_minimapa_r;

SDL_Event evento;

bool salir = false;
char titulo[]="Prueba de minimapa 01 - zeroxcol94";
int vel = 1;
int vel_x = 0;
int vel_y = 0;
const int PANTALLA_ANCHO = 800;
const int PANTALLA_ALTO = 600;

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

SDL_Init( SDL_INIT_VIDEO );
SDL_WM_SetCaption( titulo, NULL );
pantalla = SDL_SetVideoMode(PANTALLA_ANCHO,PANTALLA_ALTO,24,SDL_HWSURFACE);
fondo = SDL_LoadBMP("fondo.bmp");
pj = SDL_LoadBMP("pj.bmp");
minimapa = SDL_LoadBMP("minimapa.bmp");
minimapa_aux = SDL_LoadBMP("minimapa_2.bmp");
pj_minimapa = SDL_LoadBMP("pj_minimapa.bmp");

pj_r.x = 0;
pj_r.y = 0;
pj_r.w = pj->w;
pj_r.h = pj->h;

fondo_r.x = 0;
fondo_r.y = 0;
fondo_r.w = fondo->w;
fondo_r.h = fondo->h;

minimapa_r.x = 0;
minimapa_r.y = 0;
minimapa_r.w = minimapa->w;
minimapa_r.h = minimapa->h;

pj_minimapa_r.x = 0;
pj_minimapa_r.y = 0;
pj_minimapa_r.w = pj_minimapa->w;
pj_minimapa_r.h = pj_minimapa->h;

minimapa_aux_r.x = 560;
minimapa_aux_r.y = 415;
minimapa_aux_r.w = minimapa_aux->w;
minimapa_aux_r.h = minimapa_aux->h;

while( salir == false )
{
while( SDL_PollEvent( &evento ) )
{
Teclado();
if( evento.type == SDL_QUIT ){ salir = true; }
if(evento.key.keysym.sym == SDLK_ESCAPE ){ salir = true;}

}

pj_r.x += vel_x;
pj_r.y += vel_y;

if(pj_r.x<0)pj_r.x=0;
if(pj_r.x+50>PANTALLA_ANCHO)pj_r.x-= vel_x;
if(pj_r.y<0)pj_r.y=0;
if(pj_r.y+50>PANTALLA_ALTO)pj_r.y-= vel_y;

//Ecuacion que transforma las coordenadas reales a las cordenadas del minimapa
pj_minimapa_r.x = (pj_r.x / float(PANTALLA_ANCHO) ) *240;
pj_minimapa_r.y = (pj_r.y / float(PANTALLA_ALTO) ) *185;

SDL_BlitSurface(fondo,NULL,pantalla,&fondo_r);
SDL_BlitSurface(pj,NULL,pantalla,&pj_r);

SDL_BlitSurface(minimapa_aux,NULL,pantalla,&minimapa_aux_r);
SDL_BlitSurface(minimapa,NULL,minimapa_aux,&minimapa_r);
SDL_BlitSurface(pj_minimapa,NULL,minimapa_aux,&pj_minimapa_r);

SDL_Flip(pantalla);


}


SDL_FreeSurface(fondo);
SDL_FreeSurface(pj);
SDL_FreeSurface(minimapa_aux);
SDL_FreeSurface(minimapa);
SDL_FreeSurface(pj_minimapa);

SDL_Quit ();
return 0;
}

void Teclado(){

if( evento.type == SDL_KEYDOWN )
{
switch( evento.key.keysym.sym )
{
case SDLK_UP: vel_y -= vel; break;
case SDLK_DOWN: vel_y += vel; break;
case SDLK_LEFT: vel_x -= vel; break;
case SDLK_RIGHT: vel_x += vel; break;
}
}

else if( evento.type == SDL_KEYUP )
{
switch( evento.key.keysym.sym )
{
case SDLK_UP: vel_y += vel; break;
case SDLK_DOWN: vel_y -= vel; break;
case SDLK_LEFT: vel_x += vel; break;
case SDLK_RIGHT: vel_x -= vel; break;
}
}

}
zeroxcol94
 
Mensajes: 9
Registrado: Jue Jul 26, 2012 3:33 pm


Volver a Videojuegos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado