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;
}