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