Creacion de juegos en C++. Caracteristicas de ALLEGRO

El objetivo de este Post es darles un pequeño resumen de las caracteristicas del motor de juegos ALLEGRO.

Funciones de dibujado de vectores

  • Pixeles, lineas, rectángulos, círculos, elipses, arcos, curvas de Bezier.
  • Rellenado de figuras con o sin patron
  • Poligonos: Sombreado plano y sombreado de Gouraud

Funciones de Sprites

  • Mascaras, compresion y sprites compilados
  • Bliting (copiado de areas de bitmaps). Se pueden rotar, estirara, dar sombreado Gouroud y hacer mezclados de alfas.
  • Soporta archivos BMP, LBM, PCX y TGA.

Textos

  • Diferentes tipos de codificacion y conversion (UTF-8 es la opcion predefinida)
  • Soporta Fonts hechos con BITMAP

Extras

  • Se puede dibujar sobre la pantalla o sobre un bitmap con cualquier tamaño de memoria
  • Scroll de ventanas por hardware, triple buffer para pintado de pantalla (para evitar el clipping pintados de pantalla).
  • Animaciones para formatos FLI/FLC.
En lo siguientes Posts hablaré de cada una de estas cosas he incluire un poco de ejemplos en código.
Anuncios

Creacion de juegos en C++. Explicación del código de prueba

Previamente se aprendio a configurar Visual Studio C++ Express para usar el motor de juegos ALLEGRO. Ahora veremos mas a fondo el código.

Archivo de cabecera de ALLEGRO

#include <allegro.h>

#pragma especifica las librerias adicionales de ALLEGRO. Cheque en otros ejemplos con otros compiladores y esta linea no va, no se a que se deba. Pero en Visual Studio C++ Express, tendra errores de Linker si esta es removida. Los otros ejemplos simplemente agregue la linea y casi ningun programa tuvo problemas

#pragma comment(lib, "alleg.lib")

Metodo de arranque del juego.

int main(int argc, char* argv[])
{

allegro_init es un macro que inicializar la libreria de ALLEGRO

allegro_init();

install_timer Instala el manejador de interrupciones del temporizador(timer).
Esta instruccion se debe llamar antes que los otros manejadores (de mouse, animaciones FLI, MIDis, etc…)

	install_timer();

install_keyboard debe ser llamada antes que cualquier otra rutina que sirva para la funcionalidad de entrada de datos para el teclado

	install_keyboard();

set_color_depth define la pronfundidad de los colores. Los valores pueden ser 8 (siendo el valor predeterminado), 15, 16, 24, 32.

        set_color_depth(24);

set_gfx_mode define el tipo de tarjeta gráfica que se esta usando y el tamaño de pantalla para el juego. Da click aquí para ver los tipos de modo gráfico que hay. Los siguientes dos parametros son para el ancho y alto de la pantalla (800×600 px). Los ultimos dos parametros representan el minimo de la pantalla virtual (ancho virtual y alto virtual).  Este es solo en caso de que necesites una pantalla virtual grande para el scroll por hardware o hacer paginado.

      (0,0)------------(640,0)----(1024,0)
	|                  |           |
	|  visible screen  |           |
	|                  |           |
      (0,480)----------(640,480)       |
	|                              |
	|   the rest of video memory   |
	|                              |
      (0,1024)--------------------(1024,1024)

Algo asi. Pero como este no es el caso lo pondremos en cero.

	set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);

backbuffer es estructura de un mapa de bits en ALLEGRO. Se puede crear con con el metodo create_bitmap y asi este quedara en memoria. Sus caracteristicas son las siguientes:

int w, h; – Ancho y alto en pixeles del mapa de bits.

int clip; – Es diferente a zero si el clip esta encendido (visible).

int cl, cr, ct, cb; – Puntos de clip del bitmap.

unsigned char *line[]; – Punteros que hacen referencia a las lineas que serán dibujas en el mapa de bits

SCREEN_W y SCREEN_H, son los defines globales encargados de regresar el ancho y alto de la pantalla.

	BITMAP* backBuffer = create_bitmap(SCREEN_W, SCREEN_H);

makecol Convierte un valor RGB en un formato de pixeles. Este entero que se regresa es usado como parametro en la mayoria de las rutinas.

	const int WHITE = makecol(255, 255, 255);

Una vez que el programe ejecuto todas las sentencias, pasaremos a este ciclo donde terminara si se presiona la letra escape. key es un arreglo que indica el estado del teclado. key[ALGUNA_TECLA] regresa true o false.

	while(!key[KEY_ESC])
	{

clear_bitmap hace a un mapa de bits de color negro

		clear_bitmap(backBuffer);

text_printf_ex dibuja un texto. Esta funcion se le puede dar un formato numerico (%d, %f) como la sentencia printf. Debido a la limitacion de esta función no se puede mandar a imprimir cadenas grandes.

font es un estilo de letra sencillo de 8×8 (unas de las constantes de ALLEGRO. WHITE es la constante hecha con la sentencia makecol.

8 y 32 es la posicion de X y Y.

-1 es el color del Background del texto. Recuerda, puedes poner un color rojo o verde por ejemplo, con la instrucción makecol como la constante WHITE.

		textprintf_ex(backBuffer, font, 8, 32, WHITE, -1, "Hello World!");

blit copia el area rectangular de un mapa de Bits a otro. backbuffer es el original y screen(dentro de blit) es el BITMAP destino.

screen es el puntero global de la memoria de video.

Los primero dos ceros es el punto inicial (X,Y) del mapa de bit original y los otros dos es el punto inicial del mapa de bits destino.

backbuffer->w y  backbuffer->h es el ancho y alto del bitmap original que se va a copiar.

		blit(backBuffer, screen, 0, 0, 0, 0, backBuffer->w, backBuffer->h);

rest hace esperar al timer x cantidad se ms. En este caso 1 ms.

		rest(1);
	}

destroy_bitmap elimina cualquier tipo de bitmap creado.

	destroy_bitmap(backBuffer);
	return 0;
}

END_OF_MAIN sirve para manterner compatibilidad entra varias plataformas y que no haya problemas al terminar el programa (sea Windows, Linux, etc…).

END_OF_MAIN()

Creacion de juegos en C++. Configuracion ALLEGRO

El objetivo de este tutorial es configurar el motor de juegos ALLEGRO con Visual Studio Express C++ 2008. Este tutorial es el primer paso poder crear un Video Juego en 2D.

¿Que es ALLEGRO?

ALLEGRO(Atari Low-Level Game Routines) es una biblioteca libre y de código abierto para la programación de videojuegos desarrollada en lenguaje C.

La biblioteca cuenta con funciones: para gráficos, manipulación de imágenes, texto, sonidos, dispositivos de entrada (teclado, ratón y mandos de juego) y temporizadores, así como rutinas para aritmética de punto fijo y acceso al sistema de archivos.

Configuracion de ALLEGRO con Visual Studio Express C++

Obten las librerias precompiladas binarias para Visual Studio en C++ de ALLEGRO dandoclick aqui.

1. Extrae el archivo ZIP en alguna parte de tu disco duro (yo lo hice en la raiz de mi disco C).

Folder de librerías de ALLEGRO

2. Abre Visual Studio C++ Express 2008. Ve Herramientas->Opciones

3. Una vez en opciones, da click en Proyectos y Soluciones->Directorios C++

4. Aparecera en la ventana de opcines el siguiente cuadro

5. En la opción Mostrar directorios para agregaras los siguientes directorios:

  • Archivos ejecutables > [Path_de_ALLEGRO]\bin
  • Archivos Biblioteca > [Path_de_ALLEGRO]\lib
  • Archivos de Inclusión > [Path_de_ALLEGRO]\include

6. Agrega el directorio [Path_de_ALLEGRO]\bin en tu variable de entorno PATH

7. Crea un proyecto de prueba. En Visual Studio ve a Archivo->Proyecto Nuevo

8. Selecciona WIN32 y dale un nombre a tu proyecto.

9. Da click en Aceptar y te aparecer la ventana de configuraciones. Selecciona la casilla deproyecto vacio y da terminar.

10. Agrega un archivo y ahi agregaras el siguiente codigo (despues lo analizaremos, por ahora es solo para ver que la configuracion de ALLEGRO este bien hecha).

#include <allegro.h>
#pragma comment(lib, "alleg.lib")

int main(int argc, char* argv[])
{
	allegro_init();
	install_timer();
	install_keyboard();
	set_color_depth(24);
	set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
	BITMAP* backBuffer = create_bitmap(SCREEN_W, SCREEN_H);
	const int WHITE = makecol(255, 255, 255);
	while(!key[KEY_ESC])
	{
		clear_bitmap(backBuffer);
		textprintf_ex(backBuffer, font, 8, 32, WHITE, -1, "Hello World!");
		blit(backBuffer, screen, 0, 0, 0, 0, backBuffer->w, backBuffer->h);
		rest(1);
	}
	destroy_bitmap(backBuffer);
	return 0;
}
END_OF_MAIN()

11. Compilalo y correlo y tendra que aparecer una ventana como esta.

Te preguntaras: “¿es todo? ¿una ventanita negra con Hello World?”. Por ahora es lo que hace. Esta configuración no te tomará más de 15 o 20 minutos en hacerla.