Visão Geral e Introdução à Biblioteca Allegro para Programação de Jogos Autor: Pedro Demasi E-mail: [email protected] Instalando o Allegro http://www.talula.demon.co.uk/allegro/ (há link para um mirror em Português). Criar um diretório (c:\djgpp\allegro) e descompactar (matendo estrutura). Rodar o make (pode demorar bastante). Verificar se c:\djgpp\allegro\allegro.h está também em c:\djgpp\include e se c:\djgpp\allegro\lib\djgpp\liballeg.a está em c:\djgpp\lib (se não estiverem, copiar manualmente). Passos Básicos Todo programa deve ser compilado com a opção -lalleg. Exemplo: gcc prog.c -o prog.exe -lalleg Incluir diretiva #include <allegro.h>, sempre depois de todos os includes das bibliotecas padrão (stdlib, stdio etc.) No RHIDE: menu Options/Libraries, escrever alleg no primeiro espaço vazio e selecionar a caixa ao lado. Configurações Iniciais Deve sempre aparecer uma chamada à função allegro_init() o mais perto possível do início do programa. Da mesma forma devem ser chamadas, a seguir, as funções install_keyboard(), install_mouse() e install_timer(). Nota: as funções normais do C para teclado não irão mais funcionar. A função allegro_exit() deve ser chamada no final do programa. Configurando o Som Iniciando usando a função install_sound: if(install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,NULL) < 0) { /* Mensagem de Erro */ } Acertando o volume usando a função set_volume: set_volume(255,255); /* som digital e música; 0 a 255 */ Configurando o Modo Gráfico Iniciando usando a função set_gfx_mode: #define MAX_X 640 #define MAX_Y 480 (...) if(set_gfx_mode(GFX_AUTODETECT,MAX_X,MAX_Y,0,0) < 0) { /* Mensagem de Erro */ } MAX_X e MAX_Y indicam a resolução a ser usada. Neste exemplo, 640x480. Configurando o Modo Gráfico Definindo o número de cores usando a função set_color_depth: set_color_depth(8); set_color_depth(16); set_color_depth(24); set_color_depth(32); /* /* /* /* 256 cores */ 65536 cores */ 32 milhões de cores */ 4 bilhões de cores */ O número indica a quantidade de bits. A chamada a essa função deve ser feita antes da chamada à função set_gfx_mode. O default é 8 (ou seja, 256 cores). Esqueleto de Programa #include <stdlib.h> #include <allegro.h> #define MAX_X 640 #define MAX_Y 480 int inicia(void) { allegro_init(); install_keyboard(); install_mouse(); install_timer(); if (install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,NULL) < 0) { printf("Erro ao tentar iniciar placa de som!\n"); return(FALSE); } set_volume(255,255); set_color_depth(8); if (set_gfx_mode(GFX_AUTODETECT,MAX_X,MAX_Y,0,0) < 0) { printf("Erro ao tentar iniciar modo de video!\n"); return(FALSE); } return(TRUE); } void main(void) { if (!inicia()) exit(-1); /* continua o programa */ allegro_exit(); } Usando o Som Som digital: WAV ou VOC. Música: MID. Antes de se tocar um som digital ou música deve-se carregá-los da seguinte forma: /* declaração das variáveis que guardarão sons e músicas */ SAMPLE *som1,*som2; /* SAMPLE = arquivos de som digital */ MIDI *musica; /* MIDI = arquivos de música */ /* carrega os arquivos usando-se as respectivas funções som1 = load_wav(“arquivo.wav”); /* para arquivos wav som2 = load_voc(“arquivo.voc”); /* para arquivos voc musica = load_midi(“arquivo.mid”); /* para arquivos mid */ */ */ */ Ponteiro nulo -> arquivo não encontrado. Usando o Som Para tocar uma música usa-se a função play_midi. O primeiro parâmetro é o arquivo MIDI carregado, o segundo indica se ele tocará em loop ou não. /* Exemplo para tocar um arquivo MIDI */ MIDI *musica; /* declaração da variável a ser usada */ musica = load_midi(“musica.mid”); /* carrega arquivo */ play_midi(musica,TRUE); /* toca a música em loop */ Para parar de tocar uma música usa-se a função stop_mid(). Usando o Som Para tocar um som digital usa-se a função play_sample. Os cinco parâmetros indicam: arquivo carregado, volume (0 a 255), equilíbrio entre as caixas (0 a 255, 128 é meio a meio), freqüência (1000 usa a freqüência original, 500 usa a metade da freqüência original etc.) e se vai ser tocado em loop (função stop_sample() pára de tocar). /* Exemplo para tocar um arquivo de som WAV */ SAMPLE *som; /* declaração da variável a ser usada */ som = load_wav(“som.wav”); /* carrega arquivo */ play_midi(musica,255,128,1000,FALSE); /* toca som */ Usando o Teclado A função clear_keybuf() esvazia o buffer de teclado. A função keypressed() retorna FALSE se o buffer de teclado estiver vazio (ou seja, nenhuma tecla pressionada) e TRUE caso contrário. Equivale à função kbhit() da biblioteca conio.h. O vetor key[] contém o estado das teclas (TRUE se pressionadas). Usando o Teclado O vetor key[] vai de 0 a 127. Mas existem constantes definidas para auxiliar a verificar a tecla desejada no formato KEY_TECLA. Exemplos: key[KEY_ENTER], key[KEY_A], key[KEY_LEFT], key[KEY_ESC], key[KEY_P], key[KEY_B], key[KEY_SPACE] etc. Exemplo: abortando um programa se a tecla ESC for pressionada: if (key[KEY_ESC]) allegro_exit(); Usando o Teclado A função readkey() retorna a próxima tecla do buffer de teclado ou, se este estiver vazio, espera que uma seja pressionada e a retorna. 2 bytes, o primeiro contém o scan code, o segundo contém o código ASCII. Para se obter apenas o código ASCII: /* equivalente a ch = getch(); usando conio.h */ ch = readkey() & 0xFF; Usando o Teclado Exemplos de uso de teclado: /* Esvazia o buffer */ clear_keybuf(); /* fica em loop até que uma tecla seja pressionada */ while (!keypressed()); /* fica em loop até a tecla ENTER ser pressionada */ while (!key[KEY_ENTER]); /* aguarda uma tecla e verifica se foi “s” */ tecla = readkey() & 0xFF; if (tecla == ‘S’ || tecla == ‘s’) exit(0); Usando o Vídeo - Bitmaps Um bitmap nada mais é do que uma matriz de pontos, em que cada valor indica uma cor. Esses valores podem indicar a cor em si ou uma entrada numa outra matriz de cores (no caso, por exemplo, dos modos em 8 bits). O desenho no Allegro sempre é feito em bitmaps. O vídeo, inclusive, é considerado um (declarado como BITMAP *screen); Usando o Vídeo - Primitivas A função clear_to_color colore um bitmap completamente com a cor especificada. A função putpixel desenha um ponto num bitmap na posição e com a cor especificadas. Exemplos: clear_to_color(screen,4); /* cor 4, em geral, vermelho */ putpixel(screen,234,123,0); /* cor 0, em geral, preto */ Outras primitivas: vline, hline, line, triangle, rect, rectfill, circle, circlefill. Usando o Vídeo - Texto Função text_mode indica qual cor vai ser usada como fundo da fonte. Se o valor for negativo, o fundo passa a ser transparente. Função textout imprime uma string. Seus parâmetros são o bitmap destino, a fonte a ser usada, a posição (x,y) e a cor da fonte. Fonte padrão: fonte (declarada FONT *font). Exemplo: text_mode(-1); textout(screen,font,”Testando texto...”,200,200,0); Usando o Vídeo - Paleta Paleta só se usa nos modos de cores de 8 bits (256 cores). A paleta é uma matriz de 256 posições. Cada posição representa uma cor. Cada posição possui 3 bytes, cada um indicando a quantidade de vermelho, verde e azul daquela cor. Cor x indica que a cor a ser usada é a que está na paleta na posição x. Usando o Vídeo - Imagens Formatos de imagem: PCX e BMP. Antes de se mostrar uma imagem deve-se carregá-la da seguinte forma: /* declaração das variáveis que guardarão imagens */ BITMAP *img1,*img2; /* arquivos de BITMAP */ PALETTE pal1,pal2; /* paletas */ /* carrega os arquivos usando-se as respectivas funções */ img1 = load_pcx(“img.pcx”,pal1); /* para arquivos pcx */ img2 = load_bmp(“img.bmp”,pal2); /* para arquivos bmp */ Ponteiro nulo -> arquivo não encontrado. Usando o Vídeo - Imagens Para usar a paleta lida do arquivo como a atual, basta usar a função set_palette, passando a paleta lida como parâmetro. Depois de carregada, a imagem pode ser mostrada usando-se a função draw_sprite. Seus parâmetros são: bitmap destino, bitmap da imagem posição (x,y). BITMAP *img; PALETTE pal; img = load_pcx(“img.pcx”,pal); set_palette(pal); draw_sprite(screen,img,100,100); Usando o Vídeo - Imagens A função draw_sprite desenha usando a cor 0 como transparente (no modo 8 bits) ou rosa claro nos outros modos. A função blit é parecida com a draw_sprite, a diferença (prática) é que ela não usa cor de transparência e, por isso, desenha a imagem carregada exatamente como ela é. Parâmetros: imagem fonte, bitmap destino, posição (x,y) da fonte, posição (x,y) do destino, largura e altura. Usando o Vídeo - Animação Usar toda hora o screen traz problemas. Doubble Buffering (Buffer Duplo): desenhase sempre num buffer secundário na memória. No fim de cada iteração da animação, copia-se tudo para a tela. Declarando, alocando e destruindo um buffer de bitmap num programa: BITMAP *tela; /* declaração da variável */ tela = create_bitmap(MAX_X,MAX_Y); /* alocando espaço */ destroy_bitmap(tela); /* destruindo, no fim do programa */ Usando o Mouse Usa-se a função show_mouse para que o cursor do mouse seja mostrado no bitmap especificado. Passando NULL como parâmetro esconde o cursor do mouse. Deve-se ter cuidado ao desenhar algo na tela pois o cursor do mouse pode passar por cima e estragar o desenho, por isso é sempre bom escondê-lo antes de desenhar qualquer coisa. show_mouse(screen); show_mouse(NULL); /* mostra o mouse na tela */ /* esconde o mouse */ Usando o Mouse As variáveis mouse_x e mouse_y contêm a posição do cursor do mouse na tela. A variável mouse_b contém o estado dos botões. (mouse_b & 1) é verdadeiro se o botão esquerdo estiver pressionado. (mouse_b & 2) é verdadeiro se o botão direito estiver pressionado. Tópicos Adicionais & Avançados Outras funções sobre os tópicos abordados. Timers (temporizadores). Data Files (arquivos de dados). Joystick. Arquivos de configuração. Funções Gráficas 3D. Como Obter Mais Ajuda Arquivos de documentação do Allegro, principalmente faq.txt e allegro.txt. Links na própria página do Allegro. Demo do Allegro (\allegro\demo). Exemplos do Allegro (\allegro\examples). Newsgroups e listas de discussão. Vários programas já desenvolvidos usando o Allegro fornecidos com o código fonte.