Crear un videojuego con la librería Allegro (1)

Cuando era pequeño había en mi casa un ordenador llamado Commodore C64, con el cual hacia pequeños programas en basic. Pero un día cayó en mis manos un libro con información técnica. Explicaba los entresijos del hardware, así como programarlo a bajo nivel, usando ensamblador.

Lo primero que me maravilló, fue que tenía una tarjeta gráfica, o como se llamaba antes controladora de vídeo, otra de sonido. Y se podían programar directamente. Eso era la técnica que usaban juegos profesionales.

Hice algunos juegos, muy sencillos. Algunas utilidades para extraer los sprites de los juegos, y usarlo como animaciones. Mi ilusión siempre fue aprender a hacer un juego

Desde los tiempos del Commodore C64, han cambiado mucho las cosas. De los juegos en dos dimensiones, se pasó a los juegos en perspectiva ortogonal, y luego a los juegos 3D.

Pero hoy en día hay muchas herramientas para empezar en este mundillo tan complejo. Una de ella es la librería Allegro. La cual permite realizar juegos juegos en dos dimensiones. Esta librería nos permite manipular imágenes, sonido, gestionar el teclado, mandos de control, etc. Además es multiplataforma, o cross-platform, lo que permite escribir tu juego en un sistema operativo como Windows, y poder portarlo sin a otro sistema como Linux, sin tener que escribir el código de nuevo.

La librería Allegro, está escrita en C, y pensada para ser usada en programas escritos en C. Pero se puede programar en Free Pascal ya existe un Binding, esto es una serie de unidades o módulos, para poder hacer uso de esta librería desde Free Pascal.

Instalando Allegro.

Lo primero es descargar los archivos necesarios. Para ello vamos a ir a la página de Allegro, en su versión para Free Pascal: http://allegro-pas.sourceforge.net/, y pulsa en Lastest version.

Opciones de descarga

Para trabajar más cómodos, vamos a crear una carpeta llamada Allegro, en la carpeta Documentos, y dentro de esta crea un carpeta llamada lib.

Si tu ordenador tiene Windows, debes extraer el archivo allegro.pas-5.2.b.1-1-bin-win32.zip. Si tiene Linux extrae el archivo allegro.pas-5.2.b.1-1-src-pas.zip.

Verás que hay varias carpetas. Abre la carpeta Src y dentro de esta Lib. Copia todo el contenido a la carpeta Lib que acabas de crear en la carpeta Allegro, dentro de Documentos.

Ahora abre Lazarus, y crea un proyecto nuevo. Para ello vete al menú Proyecto y selecciona Nuevo Proyecto. En la ventana emergente, selecciona Programa simple.

Crear programa simple

Ahora teclea el siguiente código:

program Project1;
Uses Alegro5;
begin
  Writeln ('Primer programa con Allegro');
  Readln();
end.   

Guárdalo en una carpeta llamada Capitulo1 dentro de la carpeta Allegro.

La línea 2, indica que vamos a usar la librería Allegro5, por eso debemos indicar a Lazarus dónde se encuentra. Para ello ve al menú Proyecto y selecciona Opciones de proyecto. En la ventana que aparece Rutas.

Opciones de proyecto

Ahora, pulsa sobre el botón que tiene tres puntos dónde pone Otros archivos de la unidad. En la nueva ventana pulsa sobre el icono de la carpeta, y navega hasta que encuentres la carpeta Lib dentro de la carpeta Documentos.

Selecciona la carpeta y en la ventana Ruta del editor pulsa Añadir, luego Aceptar.

Ahora solo queda ejecutar el programa. Pulsa F9, el programa se compilará, pero al ejecutarse dará un error. Esto es porque no hemos instalado las librerías correspondientes. En Windows son archivos con extensión DLL. Los encontrarás dentro del archivo allegro.pas-5.2.b.1-1-bin-win32.zip. Abre la carpeta donde lo hayas descomprimido, y abre la carpeta Bin, dentro de esta abre la carpeta Lib y por último abre la carpeta nomonolith. Copia el contenido de todos los archivos que haya a la carpeta system32 dentro de la carpeta Windows.

Ahora vuelve a ejecutar el programa y todo debería funcionar correctamente. El vídeo siguiente muestra el proceso de instalación en Windows.

Instalación en Windows

El proceso de instalación en Linux, es parecido a Windows, pero no tenemos que copiar las librerías nosotros mismos. En tu carpeta Documentos crea una carpeta llamada Allegro. Descomprime el archivo allegro.pas-5.2.b.1-1-src-pas.zip. Encontrarás una carpeta llamadaa lib que está dentro de la carpeta src. Copia esta carpeta dentro de la carpeta Allegro que has creado anteriormente.

Ahora debemos instalar las librerías adicionales. Para ello abre la terminal de tu distribución Linux, y ejecuta el siguiente comando (en el caso que tu distribución esté basada en Debian):

sudo apt install libAllegro5* -y

Creando una ventana

Crea un proyecto nuevo, como lo hiciste antes. Necesitamos es un ventana dónde mostrarse nuestro juego. Para ello debemos indicarle a Allegro que cree un ventana.

Pero antes de nada debemos iniciar la librería Allegro. Así que la primera instrucción debe ser la orden de iniciar, después ya podemos crear una ventana del tamaño que queremos. Aunque antes vamos a darle algunas propiedades, veamos el código.

 al_init(); //Iniciar librería
 al_set_new_display_flags(ALLEGRO_WINDOWED); //La ventana con bordes
 ventana := al_create_display(800, 600);  //Crear ventana y guardar en variable Ventana   

La ventana que acabamos de crear se creará, pero como todo debe ser destruida cuando terminemos el programa. Para hacer usando el siguiente código:

 al_destroy_display(ventana);  

Nuestra ventana tiene responder al teclado, para ello debemos iniciar el teclado con la siguiente instrucción:

 al_install_keyboard;  

Ya tenemos el teclado iniciado. Ahora, debemos crear capturar los eventos que provengan del teclado. Las siguientes líneas hace lo que necesitamos:

 ColaDeEventos := al_create_event_queue;
 al_register_event_source(ColaDeEventos, al_get_keyboard_event_source);           

Primero creamos una cola, y luego le indicamos que los eventos de teclado sean asignados a nuestra cola.

Las colas también deben ser borradas, para ello usaremos el siguiente código:

 al_destroy_event_queue(ColaDeEventos);    

Ya tenemos todo lo necesario para crear nuestra ventana. Para que quede todo ordenado, creamos dos procedimientos. El primero llamado Iniciar, y el segundo llamado Finalizar. El primero lo usaremos para iniciar todo lo necesario, y el segundo para borrarlo.


  procedure iniciar();
  begin
    al_init();
    al_set_new_display_flags(ALLEGRO_WINDOWED);
    ventana := al_create_display(800, 600);
    al_install_keyboard;
    ColaDeEventos := al_create_event_queue;
    al_register_event_source(ColaDeEventos, al_get_keyboard_event_source);
  end;

  procedure Finalizar();
  begin
    //Borrar lo que hemos creado
    if Assigned(ColaDeEventos) then
    begin
      al_destroy_event_queue(ColaDeEventos);
      ColaDeEventos := nil;
    end;
    if Assigned(ventana) then
    begin
      al_destroy_display(ventana);
      ventana := nil;
    end;   

En el procedimiento Finalizar, añadí una comprobación antes de destruir la variables. La comprobación consiste en preguntar si está asignada la variable.

En el bloque principal del programa llamaremos al procedimiento Iniciar, ejecutaremos un bucle hasta que la variable Terminar, sea igual a True. Antes de entrar en el bucle asignamos el valor False a la variable.

var
  Evento: ALLEGRO_EVENT;
  Terminar: boolean;
begin
  iniciar;
  Terminar := False;
  repeat
    al_wait_for_event(ColaDeEventos, @Evento);
    case Evento.ftype of
      ALLEGRO_EVENT_KEY_DOWN:
        Terminar := True;
    end;
  until Terminar = True;
  Finalizar();
end.              

Dentro de este bucle esperaremos el a que se produzca un evento. Luego comprobaremos que este evento es del tipo ALLEGRO_EVENT_KEY_DOWN, osea que se ha pulsado una tecla, y cambiaremos el valor de la variable Terminar a True.

Aquí os dejo el código completo del programa. En el GitHub de TeisRobotics, podéis descargar el código fuente.

Saludos

program Capitulo1;

uses
  Allegro5;

var
  ventana: ALLEGRO_DISPLAYptr;
  ColaDeEventos: ALLEGRO_EVENT_QUEUEptr;


  procedure iniciar();
  begin
    al_init();
    al_set_new_display_flags(ALLEGRO_WINDOWED);
    ventana := al_create_display(800, 600);
    al_install_keyboard;
    ColaDeEventos := al_create_event_queue;
    // al_register_event_source(cola, @eveto);
    al_register_event_source(ColaDeEventos, al_get_keyboard_event_source);
  end;

  procedure Finalizar();
  begin
    //Borrar lo que hemos creado
    if Assigned(ColaDeEventos) then
    begin
      al_destroy_event_queue(ColaDeEventos);
      ColaDeEventos := nil;
    end;
    if Assigned(ventana) then
    begin
      al_destroy_display(ventana);
      ventana := nil;
    end;

  end;

var
  Evento: ALLEGRO_EVENT;
  Terminar: boolean;
begin
  iniciar;
  Terminar := False;
  repeat
    al_wait_for_event(ColaDeEventos, @Evento);
    case Evento.ftype of
      ALLEGRO_EVENT_KEY_DOWN:
        Terminar := True;
    end;
  until Terminar = True;
  Finalizar();
end.

Deja una respuesta