Razón Artificial

La ciencia y el arte de crear videojuegos

[BGE] La clase App

Escrito por adrigm el 27 de septiembre de 2011 en Desarrollo Videojuegos, Programación, Proyectos | 1 Comentario.

Por fin llegamos a la clase App, con esta clase empieza a cobrar algo de sentido todo lo anterior porque une lo visto hasta ahora, crea la ventana de la aplicación, etc.

La clase App sigue, como el SceneManager, el patrón de diseño Singleton pues no tiene sentido tener más de un objeto App, cualquier intento de crear un nuevo objeto App devolverá la instancia única.

Empezamos con las variables públicas.

// Constantes
///////////////////////////////////////////////////////////////////////////
static const unsigned int DEFAULT_VIDEO_WIDTH = 640;
static const unsigned int DEFAULT_VIDEO_HEIGHT = 480;
static const unsigned int DEFAULT_VIDEO_BPP = 32;

// Variables
///////////////////////////////////////////////////////////////////////////
/// Título de la ventana
std::string title;
/// Ventana de la aplicación
sf::RenderWindow window;
/// Modo de video (Width, Height, Bpp)
sf::VideoMode video_mode;
/// Opciones de la ventana
sf::WindowSettings window_settings;
/// Estilo de la ventana
unsigned long window_style;
/// Input manager de la ventana
const sf::Input& input;
/// Log de la aplicación
std::ofstream log;
/// Puntero a Scene inicial
Scene* scene;
/// Puntero al SceneManager
SceneManager* scene_manager;

Como vemos lo primero que hacemos es declarar 3 constantes enteras con el modo de vídeo por defecto. Luego pasamos a las variables, están todas explicadas en los comentarios y se entiende su función claramente, cualquier duda podéis preguntar.

como privadas también tenemos unas cuantas.

/// Código de salida de la aplicación
int exit_code;
/// Verdadero si la aplicación se está ejecutando
bool running;
/// Archivo de log de la aplicación
std::string log_file;
/// Reloj que obtiene el tiempo pasado en cada loop
sf::Clock update_clock;
/// Almacena el tiempo pasado en cada bucle
float update_time;

Sin ninguna duda tampoco de la función que cumplen.

Antes de ver los métodos vamos a ver un esquema del ciclo de ejecución y a continuación lo explicamos.

Con la imagen a mano miramos el código de la clase.

Como siempre lo primero que se ejecuta es el constructor que inicializa variables y constantes y creo un archivo de log.

A continuación se llama a ProcessArguments que se encarga de procesar los argumentos pasados por linea de comandos, este método es opcional, pero es útil para cuando se están creando los juegos pasarle comandos que hacen determinadas acciones de pruebas. De momento no está implementado el método simplemente imprime los comandos pasados en el log. La idea es que este método lo implemente el usuario para lo que le interese.

Luego se llama a SetFirstScene que recibe una escena y la establece como la inicial, luego se verá mejor porque hacerlo aquí y así.

A continuación se llama al método Run que es el que ejecuta la aplicación, este método se encarga de llamar a los métodos PreInit, Init, Loop y cleanup.

El método PreInit aún no está implementado, se encarga de leer un archivo de configuración con las opciones de las aplicaciones y con estos datos crear la ventana.

Después se llama al Init, de momento se encarga de crear el SceneManager, se añade la primera escena a la cola y se pone como escena activa. En el futuro aquí se inicializarán también clases que lleven control de fps, etc.

Llegamos al método Loop que suele ser de los más importantes de un juego, aquí se encuentra nuestro bucle que va manejando el juego.

Lo primero que hace nuestro bucle es obtener los eventos del sistema, hay algunos por defecto que se encarga de manejar la aplicación de los que por ahora solo está implementado el de cierre y el resto de eventos se los mandamos a la escena activa.

Luego actualizamos nuestra variable de tiempo pasado en cada ciclo y reseteamos el reloj, recuerda que estas son variables privadas de la escena, pero que hay métodos para obtener este tiempo.

A continuación se llama al método Update de la escena activa y al método Draw, lo típico de todos los juegos.

Por último si recuerdas en el artículo anterior en la clase SceneManager habíamos declarado App como friend, es decir una clase amiga. Esto es que la clase App puede acceder a los miembros privados de SceneManager, la razón de esto es que si revisamos la clase SceneManager el método ChangeScene es privado, este método se encarga de cambiar el puntero de la escena activa a la indicada, si cambiáramos esto a la ligera en medio de una escena podría darnos un problema de memoria.

En lugar de eso tenemos como publico el método SetActiveScene que es el siguiente.

void SceneManager::SetActiveScene(SceneID id_scene)
{
    next_scene = id_scene;
}

simplemente le da un valor a next_scene y luego desde app controlamos el cambio de escena fuera del método update y draw y sin peligro de segmentación de memoria.

// Comprobamos cambios de escena
if (scene_manager->next_scene != "")
{
	scene_manager->ChangeScene(scene_manager->next_scene);
	scene_manager->next_scene = "";
}

tanto la variable next_scene como el método ChangeScene son privados, pero la clase App al ser friend si que puede acceder a ellos. Simplemente se encarga de comprobar si la variable next_scene no esta vacía en cuyo caso llama a ChangeScene y vuelve a vacías next_scene.

Mientras la aplicación se está ejecutando se repite este ciclo.

Por último cuando se sale del loop se entra en el Cleanup que se encarga de las funciones limpieza, llama al RemoveAllScene del SceneManager que a su vez llama al Cleanup de cada escena y luego las elimina. Por último elimina el SceneManager.

Tenemos varios métodos útiles declarados como son.

  • IsRunning – Valor booleano si la aplicación se está ejecutando o no.
  • GetUpdateTime – Devuelve el tiempo pasado en cada ciclo
  • Quit – Para la aplicación con un código de salida

Bueno esto ha sido un repaso general a la clase App. Si algo no se entiende preguntar en los comentarios. En el próximo artículo se vera todo más claro pues crearemos una aplicación de ejemplo.

Un Comentario en "[BGE] La clase App"

  1. NightZpy dice:

    Excelentes tutoriales.
    Estaré al tanto!

    Saludos y gracias!

Deja un comentario