Site: GDJ - Grupo de Desenvolvedores de Jogos
  Url: http://pjmoo.codigolivre.org.br/gdj

Curso Xuti de Allegro

Autor : Bruno (bsdrago)  

A biblioteca Allegro é uma biblioteca multiplataforma que tem como finalidade, implementar funções multimídia para a linguagem C/C++ padrão. Você pode fazer o download desta biblioteca em http://sunsite.dk/allegro/. Na época em que este texto foi escrito, a versão mais recente da biblioteca era a 4.0.1.

Bem, a medida em que você olhar o programa a seguir, perceberá que somente a estrutura do programa é da linguagem C. As funções em nada se assemelham com as definidas pela linguagem C padrão e é possível escrever um programa inteiro, sem usar uma única função da linguagem C. Recomendamos o uso dos compiladores DJGPP ou MingW.

Digite/copie o código a seguir e iniciaremos a análise do código:

#include <stdio.h>
#include <allegro.h>

Estas linhas implementam os cabeçalhos stdio.h, para funções de IN/OUT padrão e implementa o cabeçalho da biblioteca gráfica Allegro.

int main(void)
{
int i;
allegro_init();

Main() é definida aqui. Uma variável inteira "i" também é criada, somente para fazer contagem simples no loop. E o primeiro comando da bilioteca Allegro é utilizada: allegro_init(). A função allegro_init() é obrigatória toda a vez que utilizarmos as rotinas gráficas do Allegro. Sem ela, nada irá funcionar corretamente.

install_keyboard();

A função install_keyboard( ); é necessária porque as funções padrão de teclado não são utilizáveis em jogos. Acontece que as funções padrão do PC não são feitas para tal, o que gera alguns problemas. Por exemplo, na grande maioria das vezes, as rotinas de teclado do PC não são capazes de ler uma tecla que está sendo pressionada por um período de tempo muito curto, ou que duas teclas sejam apertadas ao mesmo tempo. Ao instalar as funções de teclado do Allegro, algumas "novas possibilidades" serão possíveis. No momento esta função está aqui simplesmente para o programa aguardar uma tecla ser pressionada com a função do allegro readkey( );

printf(" Este programa apresentará alguns pontos aleatórios na tela. ");
printf("Após sucessivos pressionamentos de teclas, a tela será limpa com uma nova cor de fundo. ");
printf(" Pressione <ALGO>para continuar ");
readkey();

As linhas com as funções printf( ); descrevem o programa. Elas não acrescentam em nada a funcionalidade do programa e apenas descrevem o que o programa faz. É sobre isso que gostaria e chamar atenção. Acho interessante, em todos os programas que você criar, fazer uma breve descrição do que faz o programa. Pode até parecer uma coisa inútil, mas ela se fará muito prática, quando você contiver num mesmo diretório algo em torno de 100 arquivos fontes, com os respectivos executáveis. Será um pouco complicado recordar o que faz cada programa, ainda mais se você tem o hábito de nomear os programas como PROG1.C, PROG2.C, PROG3.C, etc...

i
f (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0) < 0) {
        printf("%s ", allegro_error);
        exit(1);
}

Neste ponto, o Allegro iniciará o modo gráfico. A função responsável  é a função set_gfx_mode( ); A função tem a seguinte sintaxe (Não é a sintaxe completa. É a sintaxe que nos interessa agora. Não entrarei em pormenores da função neste momento): 

set_gfx_mode( PLACA DE VÍDEO, RESOLUÇÃO X, RESOLUÇÃO Y, 0, 0);

Onde está "PLACA DE VÍDEO", o melhor termo, no momento é a opção GFX_AUTODETECT. Com esta opção, as rotinas do allegro irão detectar qual a sua placa de vídeo e resolução máxima. As outras opções serão explicadas em momento oportuno, assim como configurar a biblioteca a usar as funções o windows. Isso é assunto para o futuro.

RESOLUÇÂO X e Y é a resolução desejada. Aqui, usei uma resolução padrão VGA (320x200). Isso garantirá com que o programa funcione na maioria dos computadores em atividade hoje.

// Imprimindo pontos...
for (i = 0; i < 64000; i++) {
putpixel(screen, rand() % SCREEN_W, rand() % SCREEN_H, rand() % 256);
}
readkey();

Aqui há um loop para imprimir pontos na tela. Vou desenhar 64000 pontos na tela, com cores e posições aleatórias. Por que 64000 ? Bem, talvez porque eu seja otimista e acredite que todos os pontos serão cobertos por algum ponto (320 x 200 = 64000).

A função responsável por desenhar pontos na tela é a função putpixel( ); A sintaxe de putpixel( ); é a descrita a seguir:

putpixel (LUGAR A SER DESENHADO O PONTO, POSIÇÃO X, POSIÇÃO Y, COR);

O "LUGAR A SER DESENHADO O PONTO" pode ser qualquer lugar, seja na memória de vídeo, seja numa área da memória especialmente reservada para tal. Aqui, com este exemplo simples, não há porque "inventar" e escrevemos na memória de vídeo, diretamente, usando a variável screen do Alegro (screen não é exatamente uma variável. mas isso não é importante nesse momento). POSIÇÃO X, POSIÇÃO Y e COR são, respectivamente, a posição X e Y do ponto e a cor a ser desenhado o ponto. No momento, a respeito de cores, vamos nos limitar as 15 cores básicas padrão.

//colorindo telas...
for (i = 0; i < 16; i++) {
clear_to_color(screen, i);
readkey();
}

A função clear_to_color ( ); apaga um lugar qualquer reservado a desenho, que no caso é memória de vídeo, e a nossa referência é a variável screen. (Atento que, para um primeiro contato com a biblioteca e para não ter que ficar explicando coisas que estão fora do propósito deste texto, não estou usando uma nomenclatura considerda tecnicamente correta.)

return 0;
}
END_OF_MAIN();

A macro END_OF_MAIN( ); é necessária para manter a portabilidade do código em C.

Estude este exemplo. Entendendo este programa, você estará entendendo os conceitos básicos da biblioteca e, em breve, estará fazendo os seus próprios programas gráficos.

Faça o download do arquivo fonte (prog1.c - 764 bytes)

OBS: lembre-se do que escrevemos sobre colocar algumas linhas no programa, na inicialização, para se organizar e, no futuro, você souber o que faz aquele programa sem ter que ficar abrindo os fontes.

Primeiros Passos

Na última lição coloquei um programa usando a biblioteca Allegro para que você fosse se acostumando com algumas funções da mesma. Nesta lição, irei demonstrar mais algumas funções gráficas e aprofundarei um pouco a análise das funções que já conhecemos.

  • INICIANDO A BIBLIOTECA

A biblioteca gráfica Allegro é iniciada dentro de seu programa com a função allegro_init(); Não possui uma sintaxe em peculiar. Basta chamá-la no código antes de utilizar qualquer função específica do allegro.

  • SELECIONANDO O MODO GRÁFICO

Conforme já vimos, a função set_gfx_mode(); é a responsável por iniciar do modo gráfico. A sintaxe da função é a seguinte:

int set_gfx_mode( int placa, int x, int y, int v_w, int v_h);

onde:

  • placa é uma das constantes GFX da biblioteca allegro. São elas: GFX_TEXT(que, quando em modo gráfico, retorna ao modo texto); GFX_AUTODETECT (deixa o Allegro detectar a sua placa de vídeo e selecionar um driver apropriado para ela - ALTAMENTE RECOMENDÁVEL); GFX_SAFE (É usado para ter um modo de vídeo confiável, sem se preocupar com profundidad de cores ou resolução); GFX_VGA (Usa o modo VGA padrão, com 256 cores e 320x200 pontos de resolução); GFX_VESA1 (utiliza driver de VESA 1.0 para a sua placa de vídeo) e GFX_VESA2L (seleciona driver VESA 2.0 com framebuffer linear).

  • x é a resolução horizontal da tela;

  • y é a resolução vertical da tela

  • x_w e y_h não nos interessa no momento. Portanto, sempre utilize o valor ZERO para ambos.

Existem outras constantes GFX. Estou partindo do pressuposto que estamos programando para DOS. Adiante, se possível, entraremos nas funções dedicadas a Windows e Linux para janelas. No entanto, as funções serão sempre as mesmas. Existem ainda constantes GFX que eu não mencionei e que trabalham em DOS perfeitamente. Entretanto, para estes tutoriais, usaremos apenas a constante GFX_AUTODETECT. No futuro, provavelmente, faremos algo mais "dedicado", esmiuçando cada uma dessas constantes e outras funções do Allegro, mas isso somente após o básico da biblioteca e de programação de jogos estiver sido exposto.

Por último e não menos importante, a função retorna o valor ZERO se tudo ocorrer bem, independentemente do DRIVER utilizado. Caso contrário, ela retornará um valor negativo com o código de erro do Allegro (veremos isso no futuro).

  • O QUE É A TELA GRÁFICA PARA O ALLEGRO ?

Bem, o Allegro não está limitado a desenhar BITMAPS na tela. Ele pode escrever diretamente nele, alias, ele pode faze-los! Todo BITMAP de seu programa terá um ponteiro associado a ele, e como o Allegro considera tudo um BITMAP, no que diz respeito a figuras, a tela visual também será um bitmap. O Allegro tem um nome especial para a tela de vídeo: screen. E este bitmap possui as dimensões que você estabeleceu em x e y na função set_gfx_mode(); Isso servirá para você direcionar onde determinada função agirá. Aliás, pelo conceito que apresentei, e veremos isso mais para frente, quando trabalharmos com BITMAPS, um bitmap pode ser a própria tela, um bloco de memória ou mesmo um SUB-BITMAP (Uma parte de um outro bitmap). "screen" é um ponteiro para o vídeo e isso é o que você deve se lembrar. Você o utilizará para desenhar no vídeo.

  • COMANDOS GRÁFICOS PRIMITIVOS: 

1. CLEAR_TO_COLOR(); CLEAR_BITMAP(); e CLEAR();

A função clear_to_color(); possui a seguinte sintaxe:

void clear_to_color(BITMAP *bitmap, int color);

Agora é bem mais simples entender como esta função foi usada no exemplo anteior deste tutorial. No exemplo do programa, clear_to_color(screen, i), você apagava a tela (que já sabemos ser um ponteiro para um bitmap) com a cor "i", que era definida num laço for. Logo, clear_to_color(screen,15); apaga o bitmap e preenche todos os pontos de branco. Existem mais duas funções que estão relacionadas a clear_to_color();.São elas:

void clear_bitmap(BITMAP *bitmap);
void clear(BITMAP *bitmap);

A função clear_bitmap(); é usada num ponteiro e ela preenche todos os seus pontos com a cor 0(zero). A função clear(); é um outro modo de chamar a mesma função clear_bitmap();. Ou seja, ao utilizar clear(screen); ou clear_bitmap(screen); estamos apagando a tela.

Comandos Gráficos

Na última parte deste tutorial, vimos mais profundamente como acionar o modo gráfico do allegro usando a função set_gfx_mode(); e a limpar bitmaps e a tela, usando a função clear(); e variações desta. Agora veremos "o que" apagar, já que ainda não traçamos um ponto sequer.

  • DESENHANDO UM PONTO

A função responsável para desenhar um ponto na tela é a função putpixel(); e sua sintaxe é a seguinte:

void putpixel (BITMAP *bmp, int x, int y, int color);

Onde o ponteiro "bmp", por hora, é a nossa tela de vídeo, denominada como screen, x e y são respectivamente as coordenadas x e y do ponto e color é a cor do ponto, que pode ter até 8 bits, dependendo do modo gráfico que se está utilizando.

  • DESENHANDO LINHAS

Para desenharmos linhas na tela, usaremos a(s) seguinte(s) função(ões):

void vline(BITMAP *bmp, int x, int y1, int y2, int color);
void
hline(BITMAP *bmp, int x1, int y, int x2, int color);
void line(BITMAP
*bmp, int x1, int y1, int x2, int y2, int color);

onde o ponteiro "bmp", por hora, é a nossa tela de vídeo, denominada screen, x1 e y1, são as respectivas coordenadas iniciais da linha e x2 e y2 são as coordenadas finais da linha. Color é a cor que você deseja que a linha tenha, sendo que o valor pode ser de 0(zero) a 255 (duzentos e cinqüenta e cinco). Se o valor ultrapassar 255, a tabela passa a se repetir, ou seja, a cor 0(zero) é igual a preto. Adicionando 1 ao último valor, a cor será igual a ela menos 256. Ou seja, 256 é igual a preto. 

Você pode baixar o Prog2.c com exemplos das funções acima citadas. O programa irá desenhar linhas, usando as funções de ponto e de linhas. Ele também trabalhará com a paleta de cores. Olhe o programa e veja como ele funciona. Qualquer dúvida poderá ser esclarecida em: xuti@yahoogrupos.com.br

Por: Bruno S. Drago
E-Mail: bsdrago@ig.com.br
Fonte: Xuti Game Development