Problema de "velocidad con los frames"

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

Problema de "velocidad con los frames"

Notapor Whiterat » Sab May 26, 2012 12:39 am

Hola,
soy nuevo en esto de programar y lo he empezado mas que nada como hobby. Tras mucho pelear con tutoriales y foros (este entre otros) he conseguido hacer un mapa con una imagen que se va moviendo por el (sin cámara, sin sprites, sin nada) pero al mover la imagen a través del mapa noto que va un poco a tirones. No se si eso es por el sistema de coordenadas que uso, si por que el codigo es demasiado largo o simplemente que son imaginaciones mías. Por eso recurro a vosotros.l

El programa esta pensado para que a cada vuelta del loop se calculen las nuevas coordenadas de la imagen, se redibujen todos los tiles y se muestre todo por pantalla.

No se si es necesario decirlo pero utilizo el lenguaje C con la libreria SDL para Windows.

Muchas gracias de antemano

A continuación adjunto el código:
#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

const int ALTO_PANT = 630;
const int ANCHO_PANT = 630;
const int BPP_PANT = 24;
const int VELOCIDAD = 10;



typedef class personaje
{
public:
int x;
int y;
SDL_Surface *ima;
}Personaje;

SDL_Surface * iniciar_sdl (const char *nombreventana);
void iniciar_personaje (Personaje *personaje);
void imprimir_personaje (Personaje *personaje, SDL_Surface * screen);
void cargar_imagenes(Personaje *personaje);
void mover_personaje(Personaje *personaje);
void imprimir_imagen(SDL_Surface *screen,SDL_Surface *personaje,int x,int y);
void dibujar_mapa(SDL_Surface* screen);


int main (int argc, char *argv[])
{
SDL_Surface * screen;
SDL_Event event;
Personaje personaje;
int done=0;
int salir=0;
int repeticiones;
int i;

screen=iniciar_sdl("Programa pito");


cargar_imagenes(&personaje);
iniciar_personaje (&personaje);
imprimir_personaje (&personaje, screen);
dibujar_mapa(screen);
SDL_Flip(screen);


while(!done)
{
mover_personaje(&personaje);
dibujar_mapa(screen);
imprimir_personaje (&personaje, screen);
SDL_Flip(screen);
while (SDL_PollEvent (& event))
{
if (event.type == SDL_QUIT)
salir = 1;

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


}
}

SDL_FreeSurface(screen);
SDL_FreeSurface(personaje.ima);
SDL_Quit();
return 0;
}

SDL_Surface * iniciar_sdl (const char *nombreventana)
{
SDL_Surface * screen;

if (SDL_Init(SDL_INIT_VIDEO)<0)
std::cout << "Error: " << SDL_GetError();

screen = SDL_SetVideoMode (ALTO_PANT,ANCHO_PANT,BPP_PANT,SDL_HWSURFACE);
if (screen==NULL)
std::cout << "Error: " << SDL_GetError();

SDL_WM_SetCaption (nombreventana, NULL);
SDL_ShowCursor (SDL_DISABLE);

return screen;
}

void iniciar_personaje (Personaje * personaje)
{
personaje->x = 250;
personaje->y = 250;
}

void cargar_imagenes(Personaje *personaje)
{
personaje->ima=IMG_Load("c:/personaje.png");
if (personaje->ima == NULL)
std::cout <<"Error: " << SDL_GetError();
}

void mover_personaje(Personaje *personaje)
{
SDL_Event event;

Uint8 *key = SDL_GetKeyState(NULL);
if (key[SDLK_UP]){personaje->y-=VELOCIDAD;}
if (key[SDLK_DOWN]){personaje->y+=VELOCIDAD;}
if (key[SDLK_LEFT]){personaje->x-=VELOCIDAD;}
if (key[SDLK_RIGHT]){personaje->x+=VELOCIDAD;}

}

void imprimir_personaje(Personaje *personaje, SDL_Surface *screen)
{
int x = personaje->x;
int y = personaje ->y;
imprimir_imagen (screen,personaje->ima,x,y);
}

void imprimir_imagen(SDL_Surface *screen,SDL_Surface *personaje,int x,int y)
{
SDL_Rect rDest;
rDest.x=x;
rDest.y=y;
SDL_BlitSurface (personaje,NULL,screen,&rDest);
}

void dibujar_mapa(SDL_Surface* screen)
{
SDL_Rect rectOrigen = {704,32,63,63};
SDL_Rect rectDestino = {0,0,63,63};
int m,n;

SDL_Surface *tile=IMG_Load("C:/Tile.png");
for (m=0;m<10;m++)
{
for (n=0;n<10;n++)
{
rectDestino.x=m*63;
rectDestino.y=n*63;
SDL_BlitSurface(tile,&rectOrigen,screen,&rectDestino);
}
}
}
Whiterat
 
Mensajes: 3
Registrado: Sab May 26, 2012 12:25 am

Re: Problema de "velocidad con los frames"

Notapor kaiser » Sab May 26, 2012 8:39 am

Tu "problema" se conoce como rebote de teclado y no es que hayas hecho algo mal en el código sino que es una característica heredada del sistema operativo. Si abres un bloc de notas y pulsas la tecla "a" verás como aparece una a, luego se produce una pequeña pausa y finalmente comienzan a escribirse muchas a's muy rápido. Todo esto puede configurarse desde las opciones de teclado del sistema, por lo que no es que sea un error, es una característica incluida a propósito por los desarrolladores para facilitarnos la vida a la hora de escribir texto, pero como ves puede ser un poco molesto a la hora de jugar. Este comportamiento se aplica a todas las teclas incluidas las flechas de dirección, el espacio, el intro, el tabulador, etc.

Para evitar el rebote de teclado en tu juego debes crear cuatro flags (booleanos) llamados, por ejemplo, "arriba", "abajo", "derecha" e "izquierda". En tu código cuando detectes que has pulsado una tecla debes poner el flag correspondiente a True, y cuando detectes que la has soltado lo pones a False. A continuación mueves el personaje en función del estado de los flags y no de las teclas que estén pulsadas.

Bienvenido a la comunidad y espero seguir viéndote por aquí, a ver que juegos chulos nos traes dentro un tiempo xD.

Un saludo y espero haberte ayudado!
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Problema de "velocidad con los frames"

Notapor Whiterat » Sab May 26, 2012 3:14 pm

Muchas gracias por la aclaración Kaiser, estaba empezando a desesperar. Ahora el programa funciona perfectamente.
También dar las gracias por la celeridad y la amabilidad con la que habéis respondido. Espero poder mostrar algún proyecto pronto! Sin duda alguna con estas ayudas no va a ser dentro de mucho haha!

Un saludo y gracias una vez mas.
Whiterat
 
Mensajes: 3
Registrado: Sab May 26, 2012 12:25 am

Re: Problema de "velocidad con los frames"

Notapor shackra » Lun Sep 10, 2012 3:56 am

Kaiser, eres un genio!
Me acabas de resolver una duda que no sabia que tenia!!

gracias ;)
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