/*
	En el ejemplo anterior había un problema muy importante:
	* en ordenadores lentos va lento, en ordenadores rápidos va rápido
	
	En este ejemplo solucionamos esto cambiando los bools por una velocidad y basando
	el juego en el tiempo. Así, con esta velocidad constante, y con el dato de cuánto
	tiempo ha transcurrido, nos moveremos a esa velocidad. En un ordenador lento, es 
	posible que se vea mal, ya que se verá surface dando saltos. Pero no se moverá más
	lentamente
	
*/

#include "SDL.h"

int main(int argc, char*argv[]){
	SDL_Init(SDL_INIT_VIDEO);
	
	//Cargamos la pantalla
	SDL_Surface * pantalla = SDL_SetVideoMode(640, 480, 0, SDL_SWSURFACE);
	
	//Cargamos el monigote de una imagen
	SDL_Surface * monigote = SDL_LoadBMP("ghost.bmp");
	
	//Le informamos de que su color clave es el blanco
	SDL_SetColorKey(monigote,SDL_SRCCOLORKEY,SDL_MapRGB(monigote->format,0xFF,0xFF,0xFF));
	
	//Esta va a ser la posición de nuestro monigote
	int x = 0, y = 0;
	
	//Esta va a ser la velocidad a la que pueda ir
	const int incrementoX = 200;
	const int incrementoY = incrementoX;
	
	//y esta la velocidad que llevará
	int velocidadX = 0;
	int velocidadY = 0;

	//El programa acabará cuando esta variable se convierta en true	
	bool fin = false;
	
	//Creamos una variable en la que almacenaremos el momento actual
	Uint32 momentoActual = SDL_GetTicks();
	
	//Y comienza el mainloop
	while(!fin){
		SDL_Event miEvento;
		//Mientras haya eventos en cola, los procesamos
		while(SDL_PollEvent(&miEvento)){
			switch(miEvento.type){
				//Si pulsa una flecha, modificamos su velocidad
				//Si es Q, saldremos del bucle principal
				case SDL_KEYDOWN:
						switch(miEvento.key.keysym.sym){
							case SDLK_UP: velocidadY -= incrementoY;
								break;
							case SDLK_DOWN: velocidadY += incrementoY;
								break;
							case SDLK_RIGHT: velocidadX += incrementoX;
								break;
							case SDLK_LEFT: velocidadX -= incrementoX;
								break;
							case SDLK_q: fin = true;
								break;
							default: break;
						}
					break;
				case SDL_KEYUP:
						switch(miEvento.key.keysym.sym){
							case SDLK_UP: velocidadY += incrementoY;
								break;
							case SDLK_DOWN: velocidadY -= incrementoY;
								break;
							case SDLK_RIGHT: velocidadX -= incrementoX;
								break;
							case SDLK_LEFT: velocidadX += incrementoX;
								break;
							default: break;
						}
					break;
				default : break;
			}
		}
		
		//Aquí tomamos el tiempo actual, le restamos el anterior, y lo dividimos para 
		//pasarlo a segundos (0.02 segundos, por ejemplo). Lo multiplicamos por la 
		//velocidad, lo pasamos a int, y el resultado se lo sumamos a la x y a la y
		x += (int)(velocidadX * ((SDL_GetTicks() - momentoActual)/1000.0));
		y += (int)(velocidadY * ((SDL_GetTicks() - momentoActual)/1000.0));
		//actualizamos el valor de momentoActual
		momentoActual = SDL_GetTicks();
		
		//utilizamos un SDL_Rect para seleccionar dónde va a estar el usuario
		SDL_Rect destino;
		destino.x = x;
		destino.y = y;
		
		//Pintamos la pantalla de azul
		SDL_FillRect(pantalla,0,SDL_MapRGB(pantalla->format,0,0,0xFF));
		//y pegamos el muñeco
		SDL_BlitSurface(monigote,0,pantalla,&destino);
		//mostramos los resultados
		SDL_Flip(pantalla);
	}
	
	//liberamos los surfaces
	SDL_FreeSurface(monigote);
	SDL_FreeSurface(pantalla);
	
	//y acabamos
	SDL_Quit();
	return 0;
}
