Bienvenido a este tercer tutorial sobre SDL, en este breve post sobre el manejo de tiempo y velocidad del videojuego, para ello tomare el ejemplo anterior y solo le agregare la clase Tiempo. Este código lo he compilado en Linux y Windows y funciona perfectamente. La unica diferencia en Windows seria cambiar las cabeceras "SDL/SDL.h" por "SDL.h" etc. (Esta es la primera revisión, asi que esta sujeta a correciones, sobre todo gramática :p). Abajo dejo un enlace para descarar el ejemplo completo.
Muy bien, como deben saber cada computadora cuenta con distintos recursos, así que los mas probable es que se ejecute a distintas velocidad y no queremos eso, para ello hay que gestionar el tiempo de tal manera que la velocidad se la misma en cualquier computadora. Afortunadamente SDL no provee un función que nos facilita tomar le tiempo.
//Definicion de la clase tiempo.h, se encarga que el manejo de tiempo se el mismo en cualquier ordenador.
//Definicion de la clase tiempo.h, se encarga que el manejo de tiempo se el mismo en cualquier ordenador.
#ifndef _TIEMPO_H_
#define _TIEMPO_H_
#include "SDL/SDL.h"
//Constante para el intervalo de timpo
const int MILISEGUNDOS = 30;
//Comenzamo a definir los atributos y metodos de la clase tiempo
class Tiempo{
private:
int inicioTicks;
int transcTicks;
public:
Tiempo();
void inicio_Ticks();
int transc_Ticks();
};
#endif
#define _TIEMPO_H_
#include "SDL/SDL.h"
//Constante para el intervalo de timpo
const int MILISEGUNDOS = 30;
//Comenzamo a definir los atributos y metodos de la clase tiempo
class Tiempo{
private:
int inicioTicks;
int transcTicks;
public:
Tiempo();
void inicio_Ticks();
int transc_Ticks();
};
#endif
Como ven es muy sencilla, comenza por lo habitual definir la clase tiempo e incluir las librerias de SDL, ademas agrege un const int llamado MILISEGUNDOS que se encargara de establecer el tiempo que durara la imagen antes de sr cambiada, (recuerde que 1000 milisegundos = 1Seg). Dentro de los datos privados solo tenemos dos variables inicioTicks que se encarga de tomar el tiempo de inicio y transTicks que sera el tiempo transcurrido desde que se inicio, dentro de los datos publicos; estan el constructor y el las funciones que tomaran el tiempo.
//Incluimos la clase tiempo
#include "tiempo.h"
//Incluimos la clase tiempo
#include "tiempo.h"
//Iniciamo el consttructor de nuestra clase tiempo
Tiempo::Tiempo(){
inicioTicks = 0;
transcTicks = 0;
}
Tiempo::Tiempo(){
inicioTicks = 0;
transcTicks = 0;
}
El constructor de nuestra clase Tiempo() solo se encaraga de inicializar los valor en 0.
//Esta funciona se encarga de tomar el inicio del tiempo
void Tiempo::inicio_Ticks(){
inicioTicks = SDL_GetTicks();}
Ahora la funcion inicio_Ticks(). Con la variable inicioTicks se manda a llamar a una función propia de SDL llama SDL_GetTicks() esta se encarga de tomar el tiempo desde en momento en que SDL inicia nuestro bucle de juego.
//Toma el tiempo de inicio lo resta con el tiempo trascurrido y regresa el valor
int Tiempo::transc_Ticks(){
transcTicks = SDL_GetTicks() - inicioTicks;
return transcTicks;
}
La función tranc_Ticks() tambien es muy sencilla toma nuevamente el tiempo con SDL_GetTicks y se le resta al tiempo del inicio para saber que tanto tiempo a transcurrido, entoces esta retorna un valor con que representa el tiempo pasado.
Ahora solo queda llamar a la clase tiempo dentro del main. Re-utilizare el archivo leccion_02.cpp de la leccion anterior y solo remarcare los cambios y la llamada a la función trans_Ticks().
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "tiempo.h"
#include "personaje.h"
//Creamos un objeto de nuestra clase tiempo.
Tiempo Tiempo;
Personaje Personaje;
SDL_Event evento;
SDL_Surface *pantalla = NULL;
SDL_Surface *imagen = NULL;
int main(int arc, char* args[]){
bool quitar = false;
SDL_Init(SDL_INIT_EVERYTHING);
pantalla = SDL_SetVideoMode(360, 240, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Leccion 03",NULL);
imagen = IMG_Load ("mapa.png");
Personaje.clips();
//Control de Eventos
while(quitar == false){
//Iniciamo los tick del tiempo
Tiempo.inicio_Ticks();
Personaje.eventos();
while(SDL_PollEvent(&evento)){
if(evento.type == SDL_QUIT){
quitar = true;
}
}
SDL_BlitSurface(imagen, NULL, pantalla, NULL);
Personaje.dibuja();
//Evalua el tiempo transucurrido
if(Tiempo.transc_Ticks() < MILISEGUNDOS){SDL_Delay(MILISEGUNDOS - Tiempo.transc_Ticks());
}
SDL_Flip(pantalla);
} //Fin del control de Eventos
} //Fin del control de Eventos
//LIbera las superficies
Personaje.limpiar();
SDL_FreeSurface(imagen);
SDL_FreeSurface(pantalla);
return 0;
}
La parte de le llamada Tiempo.transc_Ticks() es muy sencilla, simplemente verifica que si el tiempo transcurrido es mayor a los milisegundos que establecimos esta hará una pausa con SDL_Delay().
SEGUNDA VERSIÓN
Aun podemos hacer las cosas mas simples si no queremos tomar el tiempo y en su vez solo pausar, entoces quitamos la clase tiempo y la sustituimos por solo SDL_delay() y le damos un valor en milisegudos que sera la pausa entre cada bucle.
//Archivo leccion_03.cpp, implementacion de la clase tiempo
//Creamos objeto de nuestra clase Personaje
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "personaje.h"
//Creamos objeto de nuestra clase Personaje
Personaje Personaje;
SDL_Event evento;
SDL_Surface *pantalla = NULL;
SDL_Surface *imagen = NULL;
int main(int arc, char* args[]){
bool quitar = false;
SDL_Init(SDL_INIT_EVERYTHING);
pantalla = SDL_SetVideoMode(360, 240, 32, SDL_SWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Leccion 03",NULL);
imagen = IMG_Load ("mapa.png");
Personaje.clips();
//Control de Eventos
while(quitar == false){
//Iniciamo los tick del tiempo
Personaje.eventos();
while(SDL_PollEvent(&evento)){
if(evento.type == SDL_QUIT){
quitar = true;
}
}
SDL_BlitSurface(imagen, NULL, pantalla, NULL);
Personaje.dibuja();
SDL_Delay(30); //Tiempo a pausar
SDL_Flip(pantalla);
} //Fin del control de Eventos
} //Fin del control de Eventos
//LIbera las superficies
Personaje.limpiar();
SDL_FreeSurface(imagen);
SDL_FreeSurface(pantalla);
return 0;
}
Anexo:
Primero creare los módulos con:
En linux si compilas usando el compilador gcc es necesario indicarle todos los archivos y librerías a utilizar, creando un makefile simplificaria las cosas, pero por el momento simplemente lo compilare desde consola.
Primero creare los módulos con:
g++ -c leccion_03.cpp personaje.cpp tiempo.cppY luego enlazare los modulos con:
g++ -o leccion_03 -lSDL -lSDL_image leccion_03.o personaje.o tiempo.oY para ejecutarlo solo basta darle doble click al ejecutable o escribir en consola:
./leccion_03
Descargar el codigo fuente: Leccion_03 Primer versión
0 comentarios:
Publicar un comentario en la entrada