Skip to content

Ejemplo de programación con Gosu

11 enero 2010

¿Alguna vez has usado la librería SDL? Si es así, probablemente conoces lo tedioso que puede llegar a ser cualquier operación por simple que parezca. Simplemente para poder dibujar una imagen en pantalla tienes que utilizar hasta tres tipos de datos diferentes. Con Gosu eso no pasa.

He hecho un pequeño ejemplo de una imagen para que veáis lo potente que puede llegar a ser con tan pocas líneas de código.

Toda aplicación de Gosu se basa en la clase Gosu::Window. Lo normal es crear una clase que derive de ella, así que eso haremos. El constructor de Gosu::Window recibe como parámetros el tamaño de la ventana, si queremos que se vea en pantalla completa, y el periodo del refresco en milisegundos (que es la inversa de la frecuencia. Si queremos 24fps, 1/24fps = 41ms). Lo normal es dejar el valor por defecto.

Ahora lo lógico es implementar una serie de métodos que nos ofrece Gosu para llevar a cabo el Game Loop. En cada iteración, se ejecutaría un método update() en el que iría la lógica del juego: Cálculos, respuestas, etc. Seguidamente se ejecutaría el método draw(), en el que haríamos aparecer las imágenes en pantalla. Finalmente, para lanzar la aplicación desde el main() llamaremos al método show().

Con estos tres métodos podemos hacer un pequeño ejemplo no interactivo – ya veremos la respuesta a la entrada del usuario en otro post.

#include <Gosu/Gosu.hpp>
#include <iostream>

using namespace std;

class MiVentana : public Gosu::Window
{
public:
    MiVentana(): Window(640, 480, false){ 

    }

    void update(){

    }

    void draw(){

    }
};

int main(){
    MiVentana ventana;
    ventana.show();
}

Añadiendo imágenes

La clase Gosu::Image también nos lo pone fácil. Es la clase que se utiliza de manera general para mostrar imágenes, y su funcionamiento es muy sencillo. El constructor más básico recibe, por un lado, un objeto Gosu::Graphics, que representa el sitio donde vamos a pintar, en nuestro caso la pantalla; podremos acceder a él mediante el método graphics() de nuestra clase MiVentana.

Por otro lado, recibe la cadena con la ruta de la imagen – ¡ojo! no recibe una cadena cualquiera, sino una std::wstring, que es como una string clásica pero utilizando caracteres anchos. En nuestro caso bastará con pasar la cadena escribiendo una L delante, aunque a la hora de hacer conversiones podemos tener algún quebradero de cabeza – nada que no nos resuelva la librería boost.

Una vez tengamos nuestra imagen instanciada, podemos usar su método draw() para pintarla. Esta función recibe varios parámetros: la posición (x,y,z), el escalado horizontal y vertical, y el modificador de color, entre otras cosas. Actualizamos el correspondiente código:

class MiVentana : public Gosu::Window
{
    Gosu::Image miImagen;
public:
    MiVentana(): Window(640, 480, false),
		 miImagen(graphics(), L"logo.png"){ 
	cout << "* Constructor" << endl;
    }

    void update(){
	// Lógica
    }

    void draw(){
	// Dibujado
	miImagen.draw(100, 100, 1, // x, y, z
		      1, 1); // xscale, yscale
    }
};

int main(){
    MiVentana ventana;
    ventana.show();
}

Compilando

Ahora, para probar el programa, primero debemos descargar y compilar Gosu. Por desgracia no es una librería lo suficientemente popular como para encontrarse en los repositorios de las distribuciones, pero su compilación no tiene mayor complicación.

Primero, descarga la última versión del código fuente y descomprímela en el directorio de tu proyecto. Se debería generar un directorio llamado gosu. Comprueba que tienes las dependencias necesarias instaladas, puedes ver cuáles son en el wiki del proyecto. Si usas una distribución basada en Debian, puedes escribir el siguiente comando en la terminal para instalar las dependencias:

sudo apt-get install g++ libgl1-mesa-dev libpango1.0-dev libboost1.40-all-dev libsdl-mixer1.2-dev

En la página oficial se indica el paquete libboost-dev, pero bajo mi experiencia y según me contaron en el canal de IRC de la librería, es mejor instalar libboost1.40-all-dev, así no nos dejamos ninguna dependencia por ahí suelta.

Una vez pasado este trago de instalaciones interminables, entramos en el directorio gosu y de ahí al directorio linux y lo típico, ./configure && make. Se generarán unas librerías en gosu/lib. Además, en gosu/bin se creará un ejecutable gosu-config que funciona igual que pkg-config.

Para compilar nuestro ejemplo, la línea a utilizar sería algo así:

g++ -Igosu `./gosu/bin/gosu-config --libs --cxxflags` -o programa codigoFuente.cpp gosu/lib/libgosu.a

Pequeño toque final

Simplemente para cerrar el programa de manera más ordenada y armónica, añadid este método a la clase MiVentana:

void buttonDown(Gosu::Button btn)
	{
	    if (btn == Gosu::kbEscape)
		close();
	}

¡Trivial!

No comments yet

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: