Está en la página 1de 14

TUTORIAL ALLEGRO

Escrito en francs por: Emeric Poupon Traduccin libre por: Ernesto Casteln Chvez

Introduccin
Para comenzar, debo precisar que es necesario un correcto conocimiento de C/C++ y que Allegro debe ya estar correctamente instalado. Durante todo el tutorial, los prototipos de las funciones propias de Allegro sern mostradas en negritas. /* Los comentarios se mostrarn en un azul verdoso muy caracterstico */ Los tipos de variables en marrn (int, float, ) incluyendo los tipos de variables especficos de Allegro (BITMAP, DATAFILE, ) Las estructuras de control en azul (if, else, while, {}, ) Los nmeros en rojo (0, 1, 324, 4, ) Los comandos del preprocesador en verde (#define, #include) Las cadenas de caracteres en gris -

1. Para que sirve Allegro?


Vayamos directo al grano: Qu es Allegro? Es una librera que dispone de todo lo necesario para programar un juego de video. En otras palabras, Allegro nos brinda una solucin para gestionar grficos, sonido, el teclado, el ratn, los temporizadores en fin, todo lo que necesite! Originalmente Allegro fue creada por Shawn Hargreaves, para Atari ST, luego pas rpidamente a DOS. Las primeras versiones de la librera datan de principios de 1996: no naci ayer! Rpidamente, los programadores de Allegro orientaron su programacin hacia una librera multiplataforma. Ahora se puede usar Allegro para DOS (DJGPP, Watcom), Windows (MSVC, Mingw32, Cygwin, Borland), Linux (consola), Unix (X), BeOS, QNX, MacOS (MPW). Ya lo ha de haber comprendido, la gran fuerza de Allegro reside en el hecho de que es soportada por un gran nmero de Sistemas Operativos (SO). Concretamente, puede compilar sus programas bajo cualquier compilador (de los mencionados arriba) sin cambiar una sola lnea de cdigo. De alguna manera, Allegro seleccionar, solito, los controladores correctos segn el SO. Por ejemplo un programa bajo Windows utiliza la aceleracin DirectDraw, mientras que bajo Linux puede disfrutar de los controladores X11. De la misma manera para DirectSound y DirectInput para Windows. En contraparte, lo 3D no es el fuerte de esta librera: ninguna aceleracin material ser dada: nada de

Direct3D. Sin embargo OpenGL es muy bien soportado, gracias a un pequeo parche de Allegro (AllegroGL). Mencionamos tambin que es una librera gratuita y libre, y por tanto el cdigo fuente esta disponible.

2. Allegro: Ejemplo de aplicacin


Un juego que utilice Allegro puede ser una aplicacin de Windows, en ese caso, DirectX 7.0 (mnimo) ser necesario para el funcionamiento del juego. Allegro puede estar en un DLL (alleg42.dll) o puede, tambin, estar esttico, en cuyo caso el cdigo de Allegro utilizado se encontrar en el ejecutable (es el caso para DOS). Les aseguro que en los otros SO tambin podrn escoger una compilacin esttica dinmica, as que no se preocupen. Para ver un ejemplo, tienen a su disposicin el demo oficial (en la carpeta allegro/demo) que reagrupa en un solo programa algunas caractersticas muy interesantes de la librera. No olvide linkear le librera correctamente, o si no, obtendr un mar de errores. (Consulte los archivos de ayuda en cada compilador). Tampoco olvide que tiene a su disposicin toda una gama de ejemplos muy prcticos. Es, de hecho, gracias a ellos que aprendi a servirme correctamente de Allegro. Todas las descripciones de las funciones estan disponibles en el archivo de ayuda generado en la instalacin de Allegro (/docs/html/allegro.html). Estn muy bien explicadas y es muy til para descubrir todas las funciones de Allegro. En fin, si realmente quiere descubrir todo el potencial de esta librera, puede ir al depsito oficial de los juegos Allegro: www.allegro.cc

3. Las bases de Allegro: un primer programa


Comencemos un pequeo programa bsico que nos servir de ejemplo. Para comenzar hay que incluir el archivo de cabecera de la librera, cuyo nombre es allegro.h. Cuidado! Por el momento no hay necesidad de incluir WinMain ni windows.h, olvdese de todo lo que concierne a un solo SO. /* Incluimos el archivo de cabecera de Allegro */ #include <allegro.h> /* Y comenzamos con la funcin main */ int main() { Muy importante, antes de hacer lo que sea con la librera, hay que llamar la funcin de inicializacin. /* Funcin general de inicializacin */ allegro_init(); Perfecto! Allegro est inicializado! Ahora, si instalramos el teclado y el ratn sera mucho ms prctico

/* Inicializa el teclado */ install_keyboard(); Si la funcin tuvo xito, devuelve 0, sino, devuelve un nmero negativo. Podemos considerar que no vale la pena verificar el resultado puesto que las probabilidades de error son mnimas. /* Inicializa el ratn */ install_mouse(); Aqu, la cosa se pone ms interesante: si la funcin fracasa, devuelve -1, sino, devuelve el nmero de botones del ratn que Allegro puede manejar. Es importante efectuar una verificacin puesto que los usuarios de DOS no necesariamente tienen un controlador de ratn que funcione Entonces podemos escribir: /* Si la funcin fracasa, entonces */ if(install_mouse() == -1){ /* Mostramos el mensaje de error */ allegro_message(Error! %s, allegro_error); /* Y salimos del programa */ return -1; } /*Ahora, sabemos que el ratn funciona correctamente */ En este punto me dirn: Qu es allegro_message? Y allegro_error? Aqu el prototipo de allegro_message: void allegro_message(char *msg, ); Esta funcin utiliza el mismo formato de salida que la funcin printf. Es, por lo tanto, muy cmoda de utilizar. Cuidado, esta funcin slo debe ser utilizada en modos no grficos! Slo la puede utilizar si no ha inicializado el modo grfico, o si pas explcitamente en modo texto. En este caso, por ejemplo, no hemos iniciado an el modo grfico, podemos entonces usar la funcin sin problemas. En los So que trabajan en modo texto o consola, como DOS y Unix, los mensajes aparecern, normalmente, en la consola. Para Windows y BeOS, esto mostrar un cuadro de dilogo con un botn OK abajo. Tendr como ttulo el nombre del ejecutable del programa. Esta funcin es muy practica para sealar errores, independientemente del SO. extern char allegro_error[ALLEGRO_ERROR_SIZE]; Es la cadena de caracteres usada por algunas funciones Allegro, como set_gfx_mode o install_mouse. Sirve para reportar los errores que pudieron surgir en la inicializacin. Si el usuario quiere saber la naturaleza del error, la cadena allegro_error contiene la descripcin del problema: no queda ms que

mostrarla (con allegro_message por ejemplo). ALLEGRO_ERROR_SIZE, para no enredarlo, sencillamente es el tamao de la cadena de caracteres. Bueno, ya tenemos el ratn y el teclado. Acaso no es genial? Solamente que sera mejor pasar al modo grfico... para comenzar, hay que definir el nmero de colores que se usarn en el modo de vdeo. En es decir por cuntos bits estar codificado cada pxel (8, 15, 16, 24 o 32 bits). Cuanto ms alto sea el nmero de bits, ms amplia ser la paleta de colores disponible. Por ejemplo para 16 bits, tiene derecho a 2^16 = 65,536 colores, para 24 bits 2^24 igual 16,777,216 colores. El caso de los colores de 8 bits es ms particular, lo dejaremos de lado por el momento. /* Establecemos el nmero de colores para el modo grfico. Por el momento ser 16 bits lo cual ser lo suficientemente amplio para nuestra pantalla. Tiene la ventaja de ser muy expandido y por lo tanto fcilmente soportada por otras tarjetas de vdeo espacio */ set_color_depth(16); Ahora pasaremos al modo grfico propiamente dicho. Para ello utilizaremos la siguiente funcin: set_gfx_mode(GFX_AUTODETECT,640,480,0,0); Pero ahora, cmo diablos utilice esta funcin? He aqu su prototipo: int set_gfx_mode(int card, int width, int height, int v_width, int v_height); Comenzaremos por lo fcil, la funcin devuelve cero en caso de xito, sino, devuelve un nmero negativo. int card no es muy descriptivo, es el ndice del modo grfico que queremos utilizar. Aqu estn los diferentes valores que debemos escribir (las definiciones estn en alguna parte de allegro.h): - GFX_AUTODETECT. No nos ocupamos de nada, dejamos que Allegro escoja el mejor controlador. Se pondr en modo ventana si la resolucin no est disponible en pantalla completa y si el SO lo soporta. - GFX_AUTODETECT_FULLSCREEN. Forzamos a Allegro a escoger un controlador de pantalla completa - GFX_AUTODETECT_WINDOWED. Forzamos a Allegro a escoger un controlador en modo ventana - GFX_TEXT. Es muy til para regresar al modo texto, en ese caso, podemos poner cero para las dimensiones de la pantalla. Naturalmente, existen otros valores, pero son ms especficos para cada SO (por lo tanto tendremos que evitar usarlos), regresaremos a ello ms tarde, por el momento slo vemos las bases. Los valores width y height representan el tamao grfico de la pantalla creada. Puede acceder a las dimensiones de la

pantalla gracias a los macros SCREEN_W y SCREEN_H inicializados por la funcin. Por el momento, no nos ocuparemos de v_width y de v_height (por lo tanto podemos poner el valor cero). Como todo programa respetable, hay que verificar si no hay errores. Agregaremos, entonces, las pruebas necesarias: if(set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) { /*Como han seguido bien mis explicaciones, han de saber que allegro_message se utiliza nicamente en modo texto, es por eso que utilizamos GFX_TEXT, para estar seguros de pasar a modo texto */ set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); /*aqu el comando para modo texto*/ allegro_message("Imposible iniciar el modo video!\n%s\n", allegro_error); return 1; //y no nos olvidamos de salir... } //aqu todo sali bien. SCREEN_W = 640 SCREEN_H = 480;

Listo! Terminamos de inicializar nuestro pequeo programa! Podramos aadir sonido e instalar un control de juego, pero eso ser en captulos prximos. Por ahora, haremos que el programa se interrumpa cuando presionemos la tecla ESC. Agregaremos entonces algunas lneas de cdigo. while(!key[KEY_ESC]){ //Mientras que ESC no se oprima... /*Borramos la pantalla. Analizaremos esta funcin captulos posteriores*/ clear_bitmap(screen); }

en

Aqu vemos un aspecto importante de la librera, la gestin de teclas oprimidas por el usuario. extern volatile char key[KEY_MAX]; Es muy simple: todas las teclas de Allegro, estn agrupadas en este arreglo (de tamao KEY_MAX, claro). Es un tablero en que cada tecla tiene un ndice. Para conocer la lista de todas las teclas, abra el archivo allegro/keyboard.h, todo est definido ah. Normalmente, este arreglo representa el estado de la tecla actual. Es decir si est o no presionada: por lo tanto slo es usada para leer. Se modifica solito gracias a las interrupciones del teclado. Puede, claro est, simular que oprime una tecla, pero eso es otra historia Aqu otros ejemplos de uso (No los copie en el cdigo! Sera intil, pues printf no funciona en modo grfico): if(key[KEY_ENTER]) printf(La tecla Enter est oprimida \n); if(key[KEY_SPACE]) printf(La barra espaciadora est oprimida \n);

No nos olvidemos de salir del programa! return 0; //Y as salimos del programa } END_OF_MAIN(); Quizs se haya dado cuenta que las aplicaciones de Windows tienen su punto de entrada en WinMain y no en main. Es por eso que la macro END_OF_MAIN() es necesaria: permita utilizar la funcin main sin importar el SO. Escrbala justo al final de la funcin main y no tendr ninguna advertencia o error a la hora de compilar. Nada de que preocuparse! Pues esto es todo como bases de inicializacin a Allegro. Si usted copi y comprendi el programa de ejemplo, a medida que fue explicado, no debera tener problemas. Claro que es muy bsico, no hace ms que mostrar una pantalla en negro (si no ocurri ningn error de inicializacin antes) y esperar que oprima la tecla ESC para salir. En el prximo captulo nos interesaremos por una parte esencial de los juegos de video: Grficos en la pantalla!

4. Grficos en pantalla
4.1. Presentacin general
Pasaremos ahora a la parte de los grficos en pantalla, sin duda la parte ms importante. Para esto, mostraremos un disco blanco desplazndose hacia la derecha de la pantalla. Estar exactamente a la mitad de la altura de nuestra pantalla. El usuario deber presionar ENTER para lanzar el disco. Modifiquemos, pues, nuestro ciclo de espera (el que verifica que la tecla ESC no est oprimida): /* Declaramos nuestra variable, que representa la posicin del crculo. Si programa en C, escrbala al inicio de la funcin main */ double circle_pos_x = 0; /* Esperamos pacientemente a que el usuario oprima ENTER para mostrar y mover el disco */ while(key[KEY_ENTER]); while(key[KEY_ESC]){ oprimida //Mientras la tecla ESC no est

/* Comenzamos borrando la pantalla */ clear_bitmap(screen); /* Dibujamos un circulo lleno de blanco (color 255,255,255) */

circlefill(screen,(int)circle_pos_x,SCREEN_H/2,50, makecol(255,255,255) ); //Movemos el disco a la derecha 0.1 pixel circle_pos_x += 0.1; /* Verificamos si el disco sale de la pantalla, si es as salimos del ciclo y por tanto finalizamos el programa */ if(circle_pos_x 50 >= SCREEN_W) break; } No se preocupe! Aclararemos todo esto circlefill es la funcin que nos permitir mostrar un disco en pantalla. void circlefill(BITMAP *bmp, int x, int y, int radius, int color); x y y representan las coordenadas del centro del disco en la pantalla. Todas las coordenadas estn dadas con respecto a la esquina superior izquierda de la pantalla. radius representa, sencillamente, el radio en pxeles. Como se ha de haber dado cuenta, aparece un nuevo tipo de dato aqu, y se trata de BITMAP. No se preocupe, hablaremos de esto despus. extern BITMAP *screen; Slo recuerde que screen es una variable global que apunta hacia un BITMAP (zona de imagen) que representa la memoria de vdeo, y por lo tanto apunta directamente a la pantalla. El tamao de este mapa de bits es SCREEN_W x SCREEN_H. Entonces bmp es el mapa de bits en el cual dibujaremos nuestro disco, es el destino de la funcin de dibujo. color es, como lo indica su nombre, el color del disco. Lo mejor es usar una pequea funcin para definirlo. int makecol(int r, int g, int b); Esta funcin permite definir un color, independientemente del modo de colores que estemos usando. Podemos llamar a esta funcin en los modos de 8, 15, 16, 24 y 32 bits por pxel. r representa la parte roja, g el la parte verde y b la parte azul, es decir que devuelve un color en formato RGB. Cada componente del color puede tomar valores de 0 a 255. makecol(255,255,255) devuelve, por lo tanto, el cdigo del color blanco del modo de video actual. Ahora, si ejecuta el programa, se dar cuenta que hay unos horribles parpadeos en la pantalla. De hecho, no vemos un disco, sino una sucesin de lneas negras y blancas. Realmente no es el efecto que buscbamos! Entonces, dnde est el problema? Es muy sencillo, para programar correctamente un juego, no debemos jams escribir directamente sobre la pantalla, a menos que no nos importe para nada el resultado, pero ese no es nuestro caso. Utilizaremos, pues, un nuevo modo de impresin en pantalla, el double buffering. El principio es muy bsico:

en vez de dibujar en la pantalla, dibujaremos en un mapa de bits que tendremos guardado en la memoria principal (RAM). Luego, al final de nuestro ciclo, copiaremos de golpe el contenido de ese mapa de bits (hablamos del buffer) en la pantalla. No es el mtodo que da los resultados ms espectaculares, pero ser mucho mejor! Definamos de una vez por todas el tipo BITMAP (podr encontrar la declaracin en los archivos de cabecera de la librera): typedef struct BITMAP { // El tamao del mapa de bits en pxeles (w ancho, h alto) int w, h; }; Naturalmente, existen otras variables en el tipo BITMAP, pero no las utilizaremos. As, para conocer el tamao de la pantalla hay otro mtodo, screen->w que representa el ancho y screen->h que representa el alto. No olvide nunca que Allegro trabaja con punteros hacia BITMAP (o sea BITMAP*). Declararemos pues nuestro buffer de video: BITMAP* buffer; //La variable que apunta al buffer de video Ahora, es necesario crear un mapa de bits de las mismas dimensiones que la pantalla. Este paso debe hacerse despus de iniciar el modo de grfico. buffer = create_bitmap(SCREN_W,SCREEN_H); BITMAP* create_bitmap(int width, int height); Esta funcin crea un mapa de bits de anchura width y de altura height. Devuelve un puntero hacia el BITMAP creado. Normalmente esta imagen creada en la memoria no esta completamente vaca (negra) y deben quedar residuos. Hay que vaciarla antes de poder utilizarla. Para vaciar un mapa de bits al color 0 (negro) utilizamos esta funcin: void clear_bitmap(BITMAP* bitmap); Esta funcin puede ser acelerada materialmente1, el resultado ser un increble rendimiento. clear_bitmap(buffer); //As de sencillo Escribiremos una vez ms nuestro ciclo de espera: while(!key[KEY_ESC]) { //Mientras ESC no se oprima //Empezamos por vaciar el buffer
El traductor no entendi claramente lo que quiso decir el autor original, pero supone que se refera a la aceleracin por hardware.
1

clear_bitmap(buffer); //Dibujamos el crculo blanco en el buffer //El blanco es el color 255,255,255 cireclefill(buffer, (int)circle_pos_x, SCREEN_W/2, 50, makecol(255,255,255) ); circle_pos_x += 0.1; //Movemos el crculo a la derecha 0.1 pxeles /* Verificamos si el disco sale de la pantalla, si es as salimos del ciclo y por ende del programa tambin */ if(circle_pos_x 50 >= SCREEN_W) break; //Ahora copiamos el contenido del buffer el pantalla blit(buffer, screen, 0,0,0,0,SCREEN_W,SCREEN_H); } Reemplazamos, pues, screen por buffer en todas las funciones necesarias. No queda ms que descubrir la funcin blit Esta funcin permite copiar una zona de un mapa de bits hacia una zona de otro mapa de bits. void blit(BITMAP* source, BITMAP* dest, int source_x, int source_y, int dest_x, int dest_y, int whidth, int eight); He aqu una funcin interesante! source queda claro que es el mapa de bits de origen (en este caso buffer), dest es el mapa de bits de destino (en este caso screen). source_x y source_y representan las coordenadas del origen del mapa de bits del que vamos a copiar. dest_x y dest_y representan las coordenadas a partir de las cuales comenzaremos a dibujar en el mapa de bits de destino. Finalmente width y eight representan las dimensiones que queremos copiar. En nuestro caso, queramos copiar ntegramente el buffer en pantalla. Es por eso que comenzamos a dibujar desde las coordenadas (0,0) y que dibujamos todo el buffer (SCREEN_W y SCREEN_H). Ejecute el programa de nuevo y se llevar una sorpresa. No ms parpadeos rebeldes! Las cosas pintan bien Por otra parte la velocidad del disco puede verse reducida notablemente. Es totalmente normal, pues la computadora ocupa la mayor parte de su tiempo a mostrar en pantalla. Mostrar un pequeo disco en pantalla es mucho ms rpido que copiar todo el buffer en pantalla, por lo tanto es preferible cambiar la lnea de desplazamiento por: ++circle_pos_x; //Desplazaremos el disco 1 pxel esta vez Aqu, la velocidad del disco depende directamente de la velocidad de nuestro ordenador (la impresin en pantalla es un factor muy limitativo de de la velocidad

del programa). Inclusive en un ordenador poderossimo, no podr alcanzar velocidades astronmicas (en termino de imgenes por segundo) pues hay que esperar que cada imagen sea dibujada por la tarjeta de video. No se desanime, en los prximos captulos hablaremos del tiempo real, es decir, que su juego vaya a la misma velocidad sin importar la potencia de la computadora en la que se este ejecutando.

4.2 Impresin de texto por pantalla


Una de las funciones genialissimas de Allegro es imprimir texto en la pantalla de una manera muy sencilla. En efecto, en modo grfico, es absolutamente imposible usar la funcin printf y otras de ese tipo. Allegro nos da una amplia gama de funciones que nos permiten efectuar esas tareas de forma automtica. Modifiquemos otra vez el ciclo de espera principal de nuestro pequeo programa para que muestre la resolucin actual de la pantalla y la posicin de nuestro pequeo disco blanco: while(!key[KEY_ESC]) { //Mientras no se oprima ESC //Comenzamos por borrar el (buffer); clear_bitmap(buffer); /* Imprimimos una cadena de caracteres en las coordenadas (0,0) y para el color utilizaremos un azul violeta vivo (150,150,255) */ textout(buffer, font, Estoy escribiendo texto!, 0,0,makecol(150,150,255) ); //Movemos el disco 0.1 pxeles a la derecha cricle_pos_x += 0.1; /*Verificamos que el disco no salga de la pantalla, si es asi, salimos del boucle y por tanto terminamos el programa */ if(circle_pos_x 50 >= SCREEN_W) break; /* Ahora hay que copier el contenido del buffer en la pantalla*/ blit(buffer, screen, 0,0,0,0,SCREEN_W, SCREEN_H); } Hemos utilizado la funcin textout para imprimir el texto: void textout(BITMAP* bmp, const FONT* f, const char* str, int x, int y, int color); bmp representa el mapa de bits en el cual imprimiremos el texto. str ser la cadena de texto a mostrar, x e y sern las coordenadas del punto superior izquierdo del texto (0,0 nos asegura que el texto aparecer en la esquina de la

pantalla). color, como ya se haba visto, representa el color con que se mostrar str. Slo queda introducir la nocin de lo que es FONT. Tal como en Windows, Allegro es capaz de mostrar varios tipos de fuentes. Basta con especificar un puntero hacia la fuente deseada, la cual deber ser del tipo FONT. Veremos en futuros captulos como cargar fuentes. Afortunadamente, por el momento, podemos usar la predeterminada de la BIOS: extern FONT* font; Normalmente podramos modificar este puntero hacia cualquier otra fuente, pero esto no nos es muy til por el momento ya que no sabemos cmo cargarlas. Ahora, podemos mostrar el tamao de la pantalla! Basta con agregar: #include <string.h> /* incluimos el archivo de cabecera de esta librera del C ANSI */ Necesitaremos una variable nueva: //Un pequeo buffer que puede contener 256 caracteres char str_buf[256]; Transformaremos nuestra funcin textout: /*Copiamos primero el tamao de la pantalla en str_buf */ sprintf(str_buf, El tamao de la pantalla es: %d x %d ,SCREEN_W,SCREEN_H); /* Listo, no nos queda ms que reemplazar nuestra cadena de texto */ textout(buffer,font,str_buf,0,0,makecol(150,150,255) ); Admire el resultado! Obtiene en su pantalla, arriba a la izquierda: El tamao de la pantalla es: 640 x 480. Pero los desarrolladores de Allegro pensaron en todo! Para ahorrarle una lnea y una variable, crearon una funcin textout con la sintaxis de printf. Podemos ahora simplificar nuestro programa: //Cambiaremos de color para celebrar textprintf(buffer,font,0,0,makecol(100,255,100),El tamao de la pantalla es: %d x %d,SCREEN_W,SCREEN_H); void textprintf(BITMAP* bmp, const FONT* f, int x, int y, int color, const char* fmt, ...); Aqu esta el prototipo de la funcin. Ahora puede imprimir texto con formato, justo como con printf. La funcin es muy similar a textout, por lo que no hay necesidad de regresar a los detalles. Gracias a esta implementacin podemos

deshacernos de la lnea include <string.h> y de nuestro buffer de caracteres, el cual es inservible. Por qu no mostrar la posicin del disco en la pantalla? Y que mejor que el color vare con respecto a la posicin actual del disco! /* He aqu la lnea, un poco ms larga */ textprintf(buffer,font,0,10,makecol(circle_pos_x/SCREEN_W*255, circle_pos_x/SCREEN_W*255,circle_pos_x/SCREEN_W*255), "Posicion del disco: %d", (int)circle_pos_x); La cadena de caracteres se mostrar con una luminosidad progresiva, lo que crea un efecto visual simptico. En los ltimos 50 pxeles, el texto desaparece! En efecto, es debido a que la variable circle_pos_x toma un valor superior a 255. El programa repasa el excedente desde 0, y se genera un color muy oscuro. Para ir un poco ms lejos, existen otras funciones muy similares a textprintf: void textprintf_centre(BITMAP *bmp, const FONT *f, int x, int y, int color,const char *fmt, ...); Esta funcin realiza exactamente lo mismo que textprintf, excepto que interpreta a x e y como el centro de la cadena de caracteres a mostrar, y no la esquina superior izquierda como sola ser. void textprintf_right(BITMAP *bmp, const FONT *f, int x, int y, int color,const char *fmt, ...); Aqu es lo mismo, pero x e y son las coordenadas de la esquina superior derecha. void textprintf_justify(BITMAP *bmp, const FONT *f, int x1, int x2, int y,int diff, int color,const char *fmt, ...); Aqu dibujamos el texto de manera justificada entre las coordenadas x1 y x2. Si las letras llegaran a salirse la funcin se convierte en un textprintf estndar. Listo!, ya conoce todas las funciones de Allegro basadas en textprintf. Existen otras funciones anexas que pueden ser muy practicas en algunos casos. Por ejemplo: int text_length(const FONT *f, const char *str); Esta funcin devuelve la longitud en pxeles, de la cadena de caracteres str usando la fuente f. Puede servir para saber si un determinado texto se saldr de la ventana, por ejemplo. int text_height(const FONT *f); Aqu no debemos especificar ninguna cadena de caracteres, pues slo nos interesa la altura. Solo basta con definir la fuente f, y saber as su altura en pxeles.

Ahora utilizaremos la funcin textprintf_centre en nuestro pequeo programa de prueba. Reemplazaremos, pues, la lnea que escribe las dimensiones de la pantalla por sta otra: /* Mostramos las dimensiones justo en el centro de la pantalla */ textprintf_centre(buffer, font, SCREEN_W/2, SCREEN_H/2, makecol(100,255,100), El tamao de la pantalla es: %d x %d, SCREEN_W, SCREEN_H); Compile y ejecute el programa Si sigui correctamente mis instrucciones, el disco debera mostrarse por encima del texto. Es perfectamente lgico, pues se dibuja el disco despus de haber impreso el texto en pantalla. Ahora, posicione esta lnea despus de la que dibuja el disco. Vuelva a compilar y a ejecutar. Esta vez, el texto si se mostrar por encima del disco, pero, Est en un curioso cuadro negro! Le aseguro esto es perfectamente normal. Arreglemoslo inmediatamente con las siguientes lineas: /* Pasamos al modo transparente de impresin de texto */ text_mode(-1); /* Mostramos las dimensiones justo en el centro de la pantalla */ textprintf_centre(buffer, font, SCREEN_W/2, SCREEN_H/2, makecol(100,255,100), El tamao de la pantalla es: %d x %d, SCREEN_W, SCREEN_H); El resultado es perfecto: No ms cuadro negro! Pero como funciona? Pues, todo texto impreso se divide en dos partes: la frontal (el texto en s) y la parte trasera, que es un cuadro rodeando los caracteres de nuestro texto. Por defecto, este cuadro es negro, y es por eso que no se haba dado cuenta (planee muy bien la sorpresa, verdad?), pero si el texto se imprime sobre otro color este cuadro es perfectamente visible. Veamos la funcin text_mode: int text_mode (int mode); Es muy fcil de utilizar. mode es el color del cuadro sobre el cual se mostrar el texto. Podemos, pues, crearla con makecol, como ya hemos visto. Por ejemplo para mostrar un cuadro blanco por debajo: text_mode(makecol(255,255,255) ); Hay sin embargo un detalle. Para no mostrar este cuadro, es decir tener un efecto de transparencia, hay que utilizar el color -1. Pero hay que tener mucho cuidado, ya que text_mode se aplicar a todas las funciones de impresin de texto subsiguientes. Por ende, hay que definir un color de fondo cada vez que le haga

falta. Por ejemplo en nuestro programa, a partir de la segunda ocurrencia del ciclo, todos los textos sern mostrados en transparencia! Bueno, ahora tiene todas las herramientas necesarias para mostrar texto en pantalla, durante sus programas. No dude pues en usar todas las funciones, nada vale tanto como la prctica y la experiencia personal. Hemos dibujado un disco No sera mejor imprimir una imagen de verdad? (Hablamos entonces de un sprite)

También podría gustarte