Pages - Menu

martes, 29 de abril de 2014

Tic-Tac-Toe: Añadiendo gráficos 2D, Parte I

Por fin vamos a hacer algo más que un pequeño juego de terminal. Ahora vamos a modificar nuestro pequeño Tic-Tac-Toe de manera que ahora disponga de gráficos 2D usando la biblioteca SDL en su versión 2, intentando modificar lo menos posible el código que ya teníamos.

Instalando la biblioteca

La instalación de nuestra biblioteca dependerá en gran medida de nuestra plataforma. En plataformas windows, deberéis bajaros la biblioteca de desarrollo de la página oficial (www.libsdl.org) y copiar los archivos de cabecera y las bibliotecas estáticas en las carpetas correspondientes según vuestro compilador. Nota: En estos momentos, la SDL2 tiene algunos bugs graves que impiden compilar bien en algunos casos. 
En plataformas linux, normalmente, valdrá con utilizar nuestro gestor de paquetes para instalar la biblioteca en los directorios adecuados, en caso de que no tengamos gestor de paquetes o no exista ese paquete para nuestro sistema, el proceso es similar al de windows.

Añadiendo, inicializando y liberando recursos

Para añadir las bibliotecas SDL debemos añadir la cabecera SDL.h. Hay que tener en cuenta que, para evitar que dos bibliotecas que tengan archivos con el mismo nombre se "pisen" en el momento de la instalación, lo normal suele ser instalar los archivos de cabecera en un directorio aparte o un subdirectorio del directorio de cabeceras estándar del compilador; por ejemplo, en la instalación estándar de linux, todas las cabeceras de la biblioteca SDL se guardan el el subdirectorio SDL2. Por tanto, cuando necesitemos usar la biblioteca añadiremos lo siguiente al principio del archivo:

#include <SDL2/SDL.h>

Otro aspecto a tener en cuenta a la hora de usar esta biblioteca es que en algún momento del programa, antes de usar cualquier función, hay que llamar a la función de inicialización SDL_Init(). Esta función, se encarga de la asignación de la variables globales usadas por la propia biblioteca, el arranque de subsistemas, etc.; por tanto, es importante llamarla solo una vez. A la función SDL_Init() se le debe pasar como parámetro que subsistemas debe inicializar como el subsitema de video, eventos, audio, etc.; la forma de indicarle que subsistemas queremos inicializar es mediante enmascaramiento binario usando unas constantes con el prefijo SDL_INIT_*, por ejemplo, para inicializar el sistema de vídeo y el de eventos podemos poner el siguiente fragmento de código:

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) == -1){
        std::cerr << SDL_GetError() << std::endl;
        exit(1);
}

Para más comodidad, si deseamos inicializarlos todos podemos usar el flag SDL_INIT_EVERYTHING, el cual nos inicializa todos los subsistemas. También es posible no inicializar ningún subsitema (pasando un 0) e inicializar los subsistemas más tarde con la función SDL_InitSubSystem().

Por ultimo, es importante tener en cuenta que debemos eliminar los recursos que ya no necesitemos. SDL implementa una serie de funciones que nos permiten liberar recursos que ya no usaremos, entre el que destaca la función SDL_Quit(), el cual liberar todos los recursos de la biblioteca; es importante llamarla antes de terminar el programa y tras la ultima función de la SDL que usemos.

Añadiendo una biblioteca de extensión

Aunque SDL tiene una gran funcionalidad hay ocasiones en la que no es suficiente, un ejemplo la carga de imágenes. SDL no es capaz de cargar todos los formatos de imagen, de echo, solo es capaz de cargar imágenes en formato BMP, pero existe una biblioteca de extensión para SDL que solventa este problema, es la SDL_Image.
Para usar la SDL_Image, es necesario instalarla del mismo método que la SDL. Para añadirla debemos introducir el siguiente código:

#include <SDL2/SDL_image.h>

Y dentro de nuestra aplicación, tras inicializar la biblioteca SDL:

if (IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG) == -1){
        std::cerr << SDL_GetError() << std::endl;
        exit(1);
}

Donde IMG_INIT_PNG | IMG_INIT_JPG son flags para inicializar la variables necesarias para cargar los archivos de tipo PNG y JPG.

Y al igual que la SDL tambien hay que eliminar los recursos con la funcion IMG_Quit que se tiene que llamar antes de SDL_Quit.

Compilando y Enlazando

A la hora de compilar un proyecto realizado con cualquier biblioteca externa, es necesario indicar al enlazador que necesita enlazar con la biblioteca SDL. En entornos linux, si usamos gcc añadiremos los flags -lSDL2 para SDL y -lSDL2_image para SDL_image.

No hay comentarios:

Publicar un comentario