Me desaparece una parte del mapeado sin motivo aparente

Consulte acerca de programas, técnicas, algoritmos etc.

Me desaparece una parte del mapeado sin motivo aparente

Notapor Whiterat » Sab Jun 02, 2012 4:13 am

Buenas a todos,

Tras horas de dura pelea con este programita me doy por vencido y recurro a los expertos a ver si pueden echar un poco de luz sobre este pobre individuo.

De momento yo detecto dos problemas obvios, a saber:

Como ya me pasaba anteriormente (y muy bien me resolvieron en este mismo foro, gracias una vez mas) el programa funciona a tirones. Yo he pensado que quizás es por que imprimo demasiadas cosas demasiadas veces encima de la pantalla, pero bueno, solo son suposiciones. Si alguien sabe como puedo solucionar este problema de... digamos "FPS" me haría un gran favor.

Por otra parte, esta el misterioso suceso que me ha hecho estar rompiéndome la cabeza durante toda la tarde/noche. La cosa es que yo imprimo un mapa en la pantalla, y sobre este mapa imprimo dos casas. Ejecuto el programa y todo va como la seda (excepto por los tirones xD), pero al cabo de un lapso de tiempo, digamos un minuto mas o menos, las casas desaparecen por arte de magia. La cuestión es, por que desaparecen y como hacer que no lo hagan?

Muchas gracias de antemano y un saludo a toda la comunidad.

A continuación os adjunto el codigo y un zip con el programa y las imágenes (por si queréis reíros un rato de lo mal hecho que esta xD):

(No se subirlo de otra forma)
http://d01.megashares.com/dl/8kUPgFu/Codigo.zip



#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <iostream>

const int costMapa=20;

void imprimir_casa(SDL_Surface*screen, int x, int y,int horitzontal,int vertical)
{
int acasa[3][4]={2,2,2,2,
2,2,2,2,
1,1,1,1};

SDL_Surface *casa;
int files=0,columnes=0;

casa=IMG_Load("Tile.png");

SDL_Rect sCasa={0,0,64,63};
SDL_Rect dCasa={0,0,50,50};
SDL_Rect sFinestra={1,908,30,38};
SDL_Rect sPorta={94,1955,34,61};
SDL_Rect sAdorno={159,1152,33,32};

for(columnes=0;columnes<3;columnes++)
{
for(files=0;files<4;files++)
{
//Fijo las coordenadas de cada tile que forma la casa
dCasa.x=(files*63+x)-(horitzontal*63);
dCasa.y=columnes*63+y-(vertical*63);
if(acasa[columnes][files]==2)
{
sCasa.x=640;
sCasa.y=768;
}
if(acasa[columnes][files]==1)
{
sCasa.x=512;
sCasa.y=833;
}
SDL_BlitSurface(casa,&sCasa,screen,&dCasa);

//Fijo las coordenadas del tile que forma el resalto del tejado
if ((files==0 && columnes==0)||(files==0 && columnes==1) )
{
dCasa.x=files*63+x-16-(horitzontal*63);
dCasa.y=columnes*63+y-(vertical*63);
SDL_BlitSurface(casa,&sCasa,screen,&dCasa);
}
//Pongo ventanas
if((files==3 && columnes==0)||(files==3 && columnes==1) )
{
dCasa.x=files*63+x+16-(horitzontal*63);
dCasa.y=columnes*63+y-(vertical*63);
SDL_BlitSurface(casa,&sCasa,screen,&dCasa);
}
//Pongo ventana
if ((files==0 && columnes==2)||(files==3 && columnes==2))
{
dCasa.x=files*63+x+17-(horitzontal*63);
dCasa.y=columnes*63+y+7-(vertical*63);;
SDL_BlitSurface(casa,&sFinestra,screen,&dCasa);

}
//Pongo puerta;
if (files==1 && columnes==2)
{
SDL_Rect sPorta={94,1955,34,61};
dCasa.x=files*63+x+17-(horitzontal*63);
dCasa.y=columnes*63+y+2-(vertical*63);;
SDL_BlitSurface(casa,&sPorta,screen,&dCasa);

}
//Pongo flor;
if (files==2 && columnes==2)
{
SDL_Rect sPorta={94,1955,34,61};
dCasa.x=files*63+x+17-(horitzontal*63);
dCasa.y=columnes*63+y+35-(vertical*63);;
SDL_BlitSurface(casa,&sAdorno,screen,&dCasa);

}


}
}
}


void imprimir_escenario (SDL_Surface *screen,SDL_Surface *tile,int horitzontal, int vertical)
{
int files,columnes;
SDL_Rect rectOrigen = {896,32,63,63};
SDL_Rect rectDestino = {0,0,63,63};
int mapa[costMapa][costMapa]={7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,6,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,6,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,6,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,6,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,6,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,6,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,6,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,7,
7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,7,
7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,};

for (columnes=horitzontal;columnes<costMapa;columnes++)
{
for (files=vertical;files<costMapa;files++)
{

rectDestino.x=columnes*63-(horitzontal*63);
rectDestino.y=files*63-(vertical*63);
rectOrigen.x = (mapa[files][columnes]*64)+512;
rectOrigen.y = 32;
SDL_BlitSurface(tile,&rectOrigen,screen,&rectDestino);
}
}

}

int main (int argc, char *argv[])
{
SDL_Surface *screen,*ima,*tile;
SDL_Rect rDest={250,250,10,10};
SDL_Rect src={4,3,24,43};
SDL_Event event;
int done=0;
int up=0,down=0,right=0,left=0;
int horitzontal=0, vertical=0;

int m,n;
int i=0;


SDL_Init(SDL_INIT_VIDEO);
screen=SDL_SetVideoMode(630,630,24,SDL_HWSURFACE);
ima=IMG_Load("personaje.png");
tile=IMG_Load("Tile.png");
SDL_BlitSurface(ima,NULL,screen,&rDest);
SDL_Flip(screen);

while (done==0)
{
if (i<4)
i++;
else
i=0;
SDL_PollEvent(&event);
Uint8 *key=SDL_GetKeyState(NULL);

imprimir_escenario(screen,tile,horitzontal,vertical);
imprimir_casa(screen,252,63,horitzontal,vertical);
imprimir_casa(screen,944,315,horitzontal,vertical);

SDL_BlitSurface(ima,&src,screen,&rDest);
SDL_Flip(screen);


switch (event.type)
{
case SDL_KEYUP:
{
if (event.key.keysym.sym==SDLK_RIGHT)
{
right=0;
src.x=6;src.y=99;src.w=17;src.h=43;
i=0;
break;
}
if (event.key.keysym.sym==SDLK_LEFT)
{
left=0;
src.x=6;src.y=51;src.w=17;src.h=43;
i=0;
break;
}
if (event.key.keysym.sym==SDLK_UP)
{
{src.x=4;src.y=147;src.w=24;src.h=43;}
i=0;
up=0;
break;
}
if (event.key.keysym.sym==SDLK_DOWN)
{
down=0;
src.x=4;src.y=3;src.w=24;src.h=43;
i=0;
break;
}
}
case SDL_KEYDOWN:
{
if (event.key.keysym.sym==SDLK_RIGHT)
{
right=1;
if(i==0){src.x=6;src.y=99;src.w=17;src.h=43;}
if(i==1){src.x=37;src.y=99;src.w=21;src.h=43;}
if(i==2){src.x=70;src.y=99;src.w=17;src.h=43;}
if(i==3){src.x=101;src.y=99;src.w=21;src.h=43;}
break;
}
if (event.key.keysym.sym==SDLK_LEFT)
{
left=1;
if(i==0){src.x=6;src.y=51;src.w=17;src.h=43;}
if(i==1){src.x=37;src.y=51;src.w=21;src.h=43;}
if(i==2){src.x=70;src.y=51;src.w=17;src.h=43;}
if(i==3){src.x=101;src.y=51;src.w=21;src.h=43;}
break;
}
if (event.key.keysym.sym==SDLK_UP)
{
up=1;
if(i==0){src.x=4;src.y=147;src.w=24;src.h=43;}
if(i==1){src.x=37;src.y=147;src.w=21;src.h=43;}
if(i==2){src.x=68;src.y=147;src.w=24;src.h=43;}
if(i==3){src.x=102;src.y=147;src.w=21;src.h=43;}
break;
}
if (event.key.keysym.sym==SDLK_DOWN)
{
down=1;
if(i==0){src.x=4;src.y=3;src.w=24;src.h=43;}
if(i==1){src.x=37;src.y=3;src.w=21;src.h=43;}
if(i==2){src.x=68;src.y=3;src.w=24;src.h=43;}
if(i==3){src.x=102;src.y=3;src.w=21;src.h=43;}
break;
}
}
case SDL_QUIT:
{
done=1;
break;
}
}
if (right==1 && horitzontal<costMapa-10)
horitzontal+=1;
if (left==1 && horitzontal >0)
horitzontal-=1;
if (up==1 && vertical >0)
vertical-=1;
if (down==1 && vertical < costMapa-10)
vertical+=1;
}
return 0;
}
Whiterat
 
Mensajes: 3
Registrado: Sab May 26, 2012 12:25 am

Re: Me desaparece una parte del mapeado sin motivo aparente

Notapor shackra » Mié Sep 12, 2012 3:55 am

Mi japones es mejor que mi C++, así que no te puedo ayudar de mucho si me pongo a leer el codigo. Como fuera, te iba a preguntar si estabas usando screen scrolling, de no ser así, puede que sea problemas de memoria por tenes partes del mapa que no se ven, en memoria.

Ah... y para el codigo fuente te recomiendo que uses Mercurial, acá te dejo un pequeño tutorial, y tambien te invito a usar Bitbucket.org como repositorio para tu codigo fuente!

Quizas Barajas te pueda ayudar en ésto...
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Me desaparece una parte del mapeado sin motivo aparente

Notapor Barajas » Mié Sep 12, 2012 4:48 am

Bueno, olvidando una serie de detalles... (muchos detalles :roll:) , tu idea no esta del todo mal, pero... bueno, al final de la función "imprimir_escenario"

for (columnes=horitzontal;columnes<costMapa;columnes++)
{
for (files=vertical;files<costMapa;files++)
{

rectDestino.x=columnes*63-(horitzontal*63);
rectDestino.y=files*63-(vertical*63);
rectOrigen.x = (mapa[files][columnes]);//+512;
rectOrigen.y = 32;
SDL_BlitSurface(tile,&rectOrigen,screen,&rectDestino);
}
}
//esta es la linea que he agregado, y que hace la magia :)
SDL_Flip(screen);
}


eso hace que se dibuje el fondo (debes "actualizar" una superficie cada vez que haces una operación sobre ella), eso mostrara tu fondo, pero creo que no es el único error :)

Un consejo, intenta hacer código mucho más "limpio" y con un poco más de orden...
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Me desaparece una parte del mapeado sin motivo aparente

Notapor shackra » Mié Sep 12, 2012 5:01 am

Barajas escribió:Un consejo, intenta hacer código mucho más "limpio" y con un poco más de orden...

Sera por eso que estaba sin contestar desde Junio esta pregunta?

Algo que me gusta hacer cuando programo en Python es crear un modulo util.py donde coloco muchas cosas que luego usare en main.py, por supuesto, que si el proyecto es más grande, hago otros modulos con nombres más descriptivos y coloco el codigo en ellos a como corresponda.

En tú caso, Whiterat, debes crear más headers para tu proyecto, quizas uno llamado util.h ;)
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a General

¿Quién está conectado?

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