Você está na página 1de 11

Allegro: Biblioteca de Programao para Jogos ca

Guilherme I. Lazzari, Rodrigo L. V. Cruz UNISINOS Universidade do Vale do Rio dos Sinos Centro de Cincias Exatas e Tecnolgicas e o So Leopoldo, RS, Brasil a {guila|rvcruz}@exatas.unisinos.br
RESUMO A rea de jogos na computao de fundamental importncia pois os mais variados conceitos aprendidos a ca e a durante o curso de Cincia da Computaco podem ser aplicados. Desta forma este artigo apresenta a e a biblioteca de programao para jogos chamada Allegro. Suas funcionalidades, exemplos e outros aspectos ca interessantes tambm sero apresentados seguindo de concluses sobre o assunto. e a o Palavras-chave: Jogos, biblioteca de programao, multim ca dia.

INTRODUCAO

A rea de jogos para computadores de fundamental importncia, mas normalmente deixada em a e a e segundo plano no meio acadmico. Nos jogos podem ser explorados os mais variados conceitos aprendidos e durante um curso padro de Cincias da Computao, tais como metodologias de Engenharia de Software a e ca para um melhor e mais rpido desenvolvimento, tcnicas de inteligncia articial em jogos que podem a e e ser jogados contra o computador, conceitos de computao grca e estruturas de dados, de modo a ca a proporcionar o maior desempenho poss vel. Assim, devido ` complexidade e enorme rea de explorao, a a ca a rea de jogos, se torna fonte inesgotvel de pesquisas e, portanto, deveriam ter maior foco no meio a a acadmico. e

A BIBLIOTECA ALLEGRO

A biblioteca Allegro foi criada por Shawn Hargreaves, hoje mantida por uma grande comunidade de desenvolvimento. O nome Allegro mais um acrnimo recursivo signicando Allegro Low LEvel Game e o ROutines. A biblioteca Allegro proporciona ao programador rotinas de baixo nivel coma maior uso em jogos de computador, tais como rotinas de entrada, grcos, sons, musicas MIDI e sincronizao. a ca Ela Open Source, portanto qualquer pessoa pode modicar ou tentar entender seu cdigo, gratuita, e o e portvel para diversos sistemas operacionais, podendo compilar para windows, DOS, unix, linux sem a que necessite mudana de cdigo. c o Allegro uma biblioteca de jogos distribu livremente, suportando vrias plataformas. Fornece muitas e da a funes para grcos, sons, entrada para o jogador (teclado, mouse e joystick) e temporizadores. Allegro co a fornece tambm funes matemticas de ponto xo e utuante, funes 3D, funes de gerenciamento e co a co co de arquivo, arquivo de dados compactado e uma GUI. [4]

Plataformas suportadas Allegro suporta as seguintes plataformas: Dos (DJGPP, Watcom) Unix (Linux, FreeBSD, Solaris, Irix) Windows (MSVC, MinGW, Borland, Cygwin) BeOS MacOS (alpha) QNX Funes grcas co a Desenhos vetoriais: pixels, linhas, retngulos, c a rculos, elipses, arcos, splines Bezier preenchimento de shape, com ou sem padro pol a gonos: planos, Gouraud, com textura com translcido u Sprites: mscara, compactadas, cpias, rotao, redimensionamento, canal alfa, supporte para a o ca arquivos BMP, LBM, PCX e TGA(outros suportados com plugins) Paletas de cores: manipulao da paleta de cores (lendo, escrevendo, convertendo) conversao de ca formato de cores RGB para HSV e vice-versa Textos: sa de texto em formato Unicode (mascarando, colorindo, alinhando) da Outras: desenho diretamente na tela em um bitmap de memria de algum tamanho crolling e o funes de animaco para o formato FLI/FLC co a Drivers grcos a Dos: modo VGA 13h, SVGA em 8, 15, 16, 24 e 32 bits por pixel Unix: X Window, DGA, fbcon, SVGAlib, VBE/AF, mode-X, VGA Windows: DirectX (normal ou full-screen) GDI BeOS: BWindowScreen BDirectWindow Funes de som co Midi: suporte nativo de msica no formato MIDI (com 64 efeitos simultaneos) controle/resposta u dinmico para msica como ligar, desligar, volume principal, pitch bend, e escolha de programa a u Pode ler diretamente arquivos MIDI. Wave: Suporte nativo para arquivos .wav e .voc, com opes de volume, pitch, etc durante execuo. co ca Drivers de som Dos: Adlib, SB, SB Pro, SB16, AWE32 MPU-401 ESS AudioDrive Ensoniq Soundscape Windows Sound System Unix: OSS ESD ALSA Windows: DirectSound WaveOut drivers de sistema MIDI Outras funcionalidades mouse, teclado e joystick manipulao de arquivos compactados no formato LZSS ca ferramenta para criacao de arquivo de dados (grabber) GUI simples para dialogos e selecao de arquivo

INSTALACAO E USO

Entendemos que o programador Allegro no far somente jogos usando a biblioteca mas que, por ter a a acesso completo ao cdigo se torne um contribuinte ao desenvolvimento da Allegro. Para isso necessrio o e a que ele baixe os fontes e saiba como compil-lo futuramente. Para isso deve-se consultar a documentao a ca em anexo, que alm de explicar como instalar a bibliteca contm toda a descrio de pastas, nomes de e e ca funes e estruturas implementadas. co No Linux, aps baixar os fontes, resume-se ao seguinte: o [root@localhost allegro_sources]# ./configure --prefix=caminho_de_destino [root@localhost allegro_sources]# make [root@localhost allegro_sources]# make install Aps ter instalado a Allegro poss instalar o resto da documentao em diferentes formatos, como o e vel ca .dvi, .html ou no estilo mais fcil e muito usado man. a Compilando um Programa Todas as funes Allegro, bem como variveis e estruturas de dados so denidas em allegro.h, que co a a deve ser inclu em seus programas e linkada com liballeg.a. Para fazer isso: da Coloque esta linha no cdigo de seus programas que usam Allegro. o #include <allegro.h> Na hora de compilar use a diretiva abaixo com seu compilador: gcc foo.c -o foo.exe -lalleg Se voc estiver usando somente algumas partes do Allegro interessante que se passe alguns s` e e mbolos do pr processador denidas em allegro.h para reduzir o tempo de compilao. Isto no reduz o e ca a tamanho do arquivo executvel. a alleg_mouse_unused alleg_timer_unused alleg_keyboard_unused alleg_joystick_unused alleg_gfx_driver_unused alleg_palette_unused alleg_graphics_unused alleg_vidmem_unused alleg_flic_unused alleg_sound_unused alleg_file_unused alleg_datafile_unused alleg_math_unused alleg_gui_unused

Como visto, o compilador que usamos foi o GCC (GNU C Compiler). Em geral no h mudanas nas a a c diretivas de compilao entre compiladores. Caso use um SDK para outra linguagem como Java ou ca Pascal consulte a documentao do Allegro espec ca ca.

ROTINAS PRINCIPAIS

Os programas de jogos que usam a biblioteca Allegro seguem um determinado esquema de rotinas que sero mostradas abaixo. a Inicializando a Allegro Antes de iniciar a execuo de qualquer rotina Allegro necessrio chamar uma funo de inicializao. ca e a ca ca Esta funo inicializa algumas variveis e reserva memria para algumas operaes do Allegro, deixandoca a o co o pronto para o uso. Esta funo no possui parmetros, devendo ser chamada da seguinte forma: ca a a allegro init() Aps chamada desta funo, preciso instalar os tratadores de teclado, mouse e temporizadores. Elas a ca e tambm no possuem parmetros e so chamadas assim: e a a a install keyboard(), install mouse() e install timer() So raros os casos em que a inicializao de um desses componentes falha. Para projetos menores os a ca programadores no costumam checar o retorno dessas funes, mas para grandes projetos recomendado a co e essa checagem, assim como de outras funes. co Para nalizar um programa em Allegro chamamos uma funo de encerramento, responsvel por retirar ca a os dom nios do Allegro sobre o computador. A funo, que tambm no possui parmetros, chamada ca e a a e da seguinte forma: allegro exit() Rotinas de entrada Os programadores tem uma interface muito simples para a utilizao do teclado em programas utilizando ca Allegro. Existe um array key[] que indica quais teclas esto sendo pressionadas. O exemplo abaixo a mostra como isso pode ser usado:
1 2

i f ( key [ KEY SPACE ] ) p r i n t f ( " espa o pressionado " ) ; c

As mais utilizadas funes de teclado so: co a install keyboard() - deve ser chamada para inicializar as variveis de teclado. a clear keybuff() - esvazia o buer do teclado. key[] - array de teclas. keypressed() - semelhante ao kbhit(). keyboard poll() - utilizar quando as teclas no puderem ser lidas assincronamente. a set keyboard rate(int delay, int repeat) - ajusta a taxa de repetiao do teclado. c simulate keypress(int key) - simula como se uma tecla tivesse sido pressionada.

A biblioteca Allegro possui rotinas para utilizao do mouse, sendo as principais: ca install mouse() - inicializa o mouse mouse b - varivel global que armazena o estado dos botes do mouse. (mouse b button), button a o = 0 - boto esquerdo, button = 1 - boto do meio e button = 2 - boto direito. a a a mouse pos - varivel global que possui a posio do mouse. Com a coordenada X nos 16 bits menos a ca signicativos e a coordenada Y nos 16 bits mais signicativos. poll mouse() - utilizar quando o status do mouse no puder ser atualizado asincronamente. a show mouse() - desenha o mouse na tela. set mouse sprite(BITMAP *sprite) - dene um estilo personalizado de ponteiro.

Uma estrutura semelhante ` do teclado utilizada nos joysticks. Por exemplo, para se testar qual direo a e ca esta sendo pressionado no controle, pode ser testado do modo:
1 2 3 4 5 6 7 8

i f ( j o y [ 0 ] . s t i c k [ 0 ] . a x i s [ 0 ] . d1 ) d i r e c t i o n = LEFT ; i f ( j o y [ 0 ] . s t i c k [ 0 ] . a x i s [ 0 ] . d2 ) d i r e c t i o n = RIGHT ; i f ( j o y [ 0 ] . s t i c k [ 0 ] . a x i s [ 1 ] . d1 ) d i r e c t i o n = UP; } i f ( j o y [ 0 ] . s t i c k [ 0 ] . a x i s [ 1 ] . d2 ) d i r e c t i o n = DOWN;

install joystick(int type) - instala o joystick, normalmente usando JOY TYPE AUTODETECT como type. joy[] - array de joysticks, onde cada posio do array tem os dados de cada joystick instalado. ca poll joystick() - diferentemente do teclado e mouse, o joystick nunca atualizado por intere rupes, necessitando do poll para atualizar seu estado. co Congurando o Modo Grco a Para a congurao do modo grco duas funes so fornecidas: ca a co a A funo set color depth deve ser chamada primeiramente. Ela determina o nmero de bits de cores ca u a ser usado pelos grcos. O nmero de bits pode ser 8 (256 cores), 15 (32768), 16 (65536), 24 (32 a u milhes) e 32 (4 bilhes de cores), sendo este o unico parmetro da funo. O padro caso no receba o o a ca a a parmetros 8 bits. A funo pode ser chamada da seguinte forma: a e ca set color depth(16) A segunda funo responsvel pela inicializao do modo grco. O primeiro parmetro representa ca e a ca a a o driver grco a ser utilizado pelo Allegro, e que deve ser uma das constantes denidas pelo Allegro. a O segundo e terceiro parmetros indicam, respectivamente, o tamanho horizontal e vertical da tela, em a pixels. Desta forma, para inicializar o modo grco com uma resoluo de 640x480, dever a ca amos chamar a funo da seguinte maneira: ca set gfx mode(GFX AUTODETECT, 640, 480, 0, 0) Os parmetros que receberam 0 (zero) conguram uma resoluo de uma tela virtual. Sua utilizao a ca ca se d em alguns jogos em que apenas uma parte (tela f a sica) de um mapa (tela virtual), por exemplo, pode ser visualizada. Com isso, a tela f sica continuar com uma resoluo de 640x480; porm, atravs a ca e e de funes de scroll do Allegro, poderemos visualizar uma parte de uma tela virtual com uma resoluo co ca maior (armazenada na memria) naquela tela f o sica. Os parmetros que podem ser escolhidos so a a mostrados na gura 1.

Figura 1: Parmetros de congurao do v a ca deo. E necessrio vericar o valor de retorno desta funo, pois comum os casos em que no poss a ca e a e vel

inicializar o modo grco, pelo no suporte do driver de v a a deo ou da resoluo pelo hardware. O ca programador deve ser responsvel pelo tratamento desses problemas. a A estrutura BITMAP Quando se programa em Allegro, no estamos restritos a escrever apenas na tela do computador, podemos a utilizar uma estrutura BITMAP. Quando for desenhar algo na tela podemos passar por parmetro uma a dessas estruturas. Normalmente utilizado um BITMAP para o fundo da tela e outro para os SPRITES e (personagens, obstculos, etc.). Exibir o BITMAP de fundo e logo aps o BITMAP dos sprites pode a o ser lento, pois o acesso ao v deo no dos mais rpidos uma tcnica bastante utilizada a de double a e a e e buering, que consiste na utilizao de um outro BITMAP de buer, onde desenhado o fundo e logo ca e aps os sprites, ento, depois disso, esse BITMAP desenhado na tela. o a e Congurando o Som Para congurar o som fazemos uso de apenas uma funo. Esta funo inicializa tanto os dispositivos ca ca digitais quanto os dispositivos MIDI. Ela possui trs parmetros sendo respectivamente: controlador de e a som digital a ser usado, controlador de som MIDI e deve ser ignorado (criado apenas para compatibilidade com verses antigas) passando-se o valor NULL. Os parmetros de congurao do som devem ser o a ca escolhidos com base na gura 2.

Figura 2: Parmetros de congurao do som. a ca No exemplo temos a inicializao de um som MIDI do tipo Sound Blaster e pode ser chamada na forma: ca install sound(DIGI SB, MIDI SB OUT, NULL) A congurao do som MIDI segue os parmetros listados na gura 3. ca a

Figura 3: Parmetros de congurao do som MIDI a ca

Para que o Allegro escolha automaticamente qual o controlador de som mais apropriado, podemos chamar a funo do seguinte modo: ca install sound(DIGI AUTODETECT, MIDI AUTODETECT, NULL) Como a inicializao do som tambm est sujeita a falhas, como no controlador do modo grco, ca e a a e preciso testar o valor de retorno da funo am de evitar erros. ca

EXEMPLOS

Am de demonstrarmos de uma maneira mais clara o uso do Allegro, temos abaixo um exemplo bem simples, mas que faz uso de algumas rotinas bsicas e essenciais da biblioteca. O programa abaixo a imprime Hello World em preto sobre tela branca.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

#include " allegro .h" i n t main ( ) { allegro init (); install keyboard (); i f ( s e t g f x m o d e (GFX SAFE , 3 2 0 , 2 0 0 , 0 , 0 ) ! = 0 ) { s e t g f x m o d e (GFX TEXT , 0 , 0 , 0 , 0 ) ; a l l e g r o m e s s a g e ( " Unable to set any graphic mode \n%s\n" , allegro error ); return 1 ; } set palette ( desktop palette ); c l e a r t o c o l o r ( s c r e e n , makecol ( 2 5 5 , 2 5 5 , 2 5 5 ) ) ; acquire screen (); text mode ( 1 ) ; t e x t o u t c e n t r e ( s c r e e n , f o n t , " Hello , world !" , SCREEN W/ 2 , SCREEN H / 2 , makecol ( 0 , 0 , 0 ) ) ; release screen (); readkey ( ) ; return 0 ; } END OF MAIN ( ) ;

Na linha 1 fazemos a incluso da biblioteca allegro.h, necessria para as funes Allegro. No moa a co mento que rotinas Allegro comeam a ser usadas, allegro init a linha 5 deve ser chamada. Esta c rotina responsvel pela inicializao do sistema que faz uso da biblioteca Allegro. A linha 7 chama e a ca install keyboard que congura o tratador do teclado para o sistema. Segue-se ento com a denio a ca do modo grco para 320 x 200 pixels de resoluo. Isto feito com a rotina set gfx mode na linha a ca e 9 com os devidos parmetros. E preciso congurar a paleta de cores atravs de set palette e limpar a e a tela com a cor desejada no modo RGB, que no exemplo foi branco (R = 255, G = 255, B = 255). O comando acquire screen necessrio em algumas plataformas para agilizar o processo de desenho e a na tela. A linha 22 seta o texto para transparente enquanto que na linha 24 temos a impresso de a Hello World centralizado. Sempre antes de fazer uso de uma funo de entrada necessrio fazer uma ca e a atualizao da tela. Finalmente a funo readkey espera por uma tecla a ser pressionada pelo usurio. ca ca a

INTERFACE DO JOGO

Nesta sesso resolvemos colocar alguns snapshots para demonstrar a capacidade e facilidade de programar a usando a biblioteca Allegro. A gura 4 mostra um jogo de sinuca. Note que a complexidade do jogo e amenizada com o uso do Allegro. Como a biblioteca contm funes matemticas os clculos de ngulos e co a a a e outras funes em geral envolvidas no jogo no necessitam maiores implementaes. co a co

Figura 4: Snapshot de um jogo de sinuca. Os jogos de estratgia so considerados os mais interessantes e complexos pela comunidade de desene a volvedores (Fig. 5). Este um bom exemplo da aplicao dos muitos conceitos aprendidos durante o e ca curso. Um jogo de estratgia envolve uma boa idia, um bom planejamento, uma interface jogvel e e a e que permite um bom entendimento com o usurio. Sem contar toda a programao e estrutura de a ca dados tambm envolvidos. A Allegro permite que esses conceitos sejam aplicados de maneira muito e simplicada.

Figura 5: Snapshot de um jogo de estratgia. e Conforme visto anteriormente, alguns comandos de inicializao geram os tratadores de teclado, mouse ca e som. A tela facilmente criada e resta portanto a lgica por trs do jogo, cabendo isso aos criadores e o a e desenvolvedores do jogo.

ESTILO DO CODIGO

Esta sesso visa a apresentar o estilo de programao usado pela comunidade que desenvolve aplicaes a ca co Allegro. E aconselhvel que se use um editor congurvel e use estas tcnicas ao desenvolver seu cdigo. a a e o O estilo bsico do Allero o K&R, com 3 espaos de identao e tabulao com 8 espaos. a e c ca ca c Denies do pr-processador e nome de estrutura devem ser maisculas. Funes e nomes de variveis co e u co a em minsculas. Nomes do tipo funcTest devem ser evitadas e no lugar escreve-se func test. u Todos s mbolos devem ser declarados como estticos sempre que poss a vel. Caso contrrio devem ser a precedidos de underscore. Funes devem ser declaradas dessa forma e ter 3 linhas em branco com a proxima funo. co ca /* foobar: * Descri~o do que a fun~o faz. ca ca */ void foobar(int foo, int bar) { /* faz alguma coisa */ } Expresses condicionais seguem o modelo abaixo. o if (foo) { /* alguma coisa */ } else { /* outra coisa */ } A condio dos laos do/while so escritas ao lado do fecha-chaves. ca c a do { /* stuff */ } while (foo); Expresses de deciso so assim. o a a switch (foo) { case bar: /* stuff */ break; default: /* stuff */ break; } E nalmente exemplos de onde colocar espaos. c char *p; if (condition) { } for (x=0; x<10; x++) { } function(foo, bar); (BITMAP *)data[id].dat;

Todos os programas Allegro devem receber o seguinte cabealho no in c cio do cdigo. Existem outras o restries na hora de escrever os crditos e devem ser consultadas na documentao do Allegro. co e ca
/* * * * * * * * * * * * * * * * * * * */ ______ ___ ___ /\ _ \ /\_ \ /\_ \ \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ \ \ __ \ \ \ \ \ \ \ /__\ /_ \/\__\/ __\ \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ /\____/ \_/__/ Brief description of what this file does. By Author. Cool stuff added by Someone Else. Stupid bug fixed by a Third Person. See readme.txt for copyright information.

Estrutura de um jogo Na maioria dos casos, um jogo estruturado atravs de um conceito bastante bsico: e e a 1 - Inicializao - congura o jogo para que ele sempre comece num estado padro, com suas ca a variveis devidamente inicializadas e os drivers de video e som funcionando. a 2 - Loop principal - O jogo em si, onde ser feito todo o processamento at que o jogador termine a e o jogo de alguma forma, morrendo, terminando ou desistindo. Durante esse loop, trs partes so e a distintas: Entrada - os valores so lidos do teclado, mouse ou joystick. a Processamento - mover os objetos, de acordo com a entrada. Visualizao - mostrar ao jogador o que ocorreu de acordo com seus comandos. ca 3 - Fim de jogo - Deve ser fornecido ao jogador, informaes do que aconteceu, atualizar alguma co tabela de escores, mostrar alguma animao de encerramento. ca Na maioria dos jogos, o loop principal est contido em outro loop, de modo ue o jogo possa ser executado a diversas vezes, sem que retorne ao sistema operacional sempre que o jogador morrer ou terminar o jogo, mas sim quando for decidido sair. Mas no exemplo abaixo isso no ser levado em conta. a a O exemplo abaixo mostra como a estrutura seria representada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

#include < a l l e g r o . h> #include " game .h" i n t end game ; i n t main ( void ) { allegro init (); init game ( ) ; end game = 0 ; do { input ( ) ;

18 19 20 21 22 23 24 25 26 27 28 29 30 31

process ( ) ; output ( ) ; } while ( end game = = 0 ) ; shutdown ( ) ; allegro exit (); return 0 ; } END OF MAIN( )

Na linha 11 est uma funo responsvel pelas inicializaes feitas pelo programador para o jogo, a ca a co provavelmente contida na game.h, assim como nas linhas 17, 19, 21 e 25. Observaes importantes co Qualquer rotina portvel que possui internamente um tratador de tempo ou uma callback de ena trada precisa garantir o bloqueio de todo o cdigo e dados alcanvel. Isto feito colocando um o ca e END OF FUNCTION(x) ou END OF STATIC FUNCTION(x) aps cada denio de funo. Mas isto no o ca ca a e requerido se a declarao for INLINE. Aps preciso chamar LOCK FUNCTION() em algum lugar no seu ca o e cdigo. Use LOCK VARIABLE ou LOCK DATA para bloquear variveis globais ou memria alocada, respeco a o tivamente. Em qualquer mdulo ao sair de uma funo deve chamar add exit func(), registrando assim sua sa o ca da. Na rotina de encerramento deve existir os respectivos remove exit func. Assim, ao ocorrer um erro, por exemplo, todas funes sero limpas. co a

CONCLUSOES

Podemos concluir atravs deste artigo que a programao para jogos contm muitos conceitos que so e ca e a aprendidos durante o curso de Cincia da Computao e que so largamente aplicados pelos prograe ca a madores e projetistas deste tipo de software. Vimos tambm algumas funes e suas aplicaes atravs de alguns exemplos, que mesmo sendo sime co co e ples, nota-se a facilidade de programao fornecida pela biblioteca Allegro. Desta forma, vmos nesta ca e biblioteca como uma grande contribuio para o meio acadmico quanto ` facilidade de programao ca e a ca de jogos. Diversas funcionalidades como som, grcos e outros dispositivos esto inclu a a dos e podem tambm ser facilmente usados. e Assim, entendemos que cada vez mais devem ser fornecidas cadeiras espec cas de programao de jogos ca nas universidades, o que ocorre fortemente nos Estados Unidos e Japo, por exemplo. a

REFERENCIAS [1] Allegro, a game programming library. http://equipe.nce.ufrg.br/adriano/c/apostila/allegro/ [2] Allegro.cc. http://www.allegro.cc/ [3] Multim dia. http://www.exatec.unisinos.br/ osorio/mmidia/HomeworkB.html [4] Allegro, a game programming library. http://www.talula.demon.co.uk/allegro/

Você também pode gostar