Você está na página 1de 18

Allegro para Iniciantes

Tutorial de Alle gro com C ++ utilizando o BloodShe d De vC ++ Por: Thiago "we isse nge ist" | we isse nge ist@yahoo.com .br C olaboradore s: rodrigozk | rodrigozk @hotm ail.com gam e m aste rbr | andre luizcardona@yahoo.com .br

Objetivo: O objetivo deste tutorial contribuir para que interessados em desenvolvimento de jogos possam iniciar seus

estudos de maneira objetiva. Este tutorial apresenta os conceitos bsicos de programao grfica 2D, voltada para jogos. Por sua simplicidade, o A l g o o ponto de partida para iniciao programao de jogos, mas bom ressaltar que jogos ler comerciais so desenvolvidos com API's mais avanadas que oferecem muitos outros recursos. Para o desenvolvimento de um jogo, por mais simples que seja, necessrio muito estudo e dedicao. Este tutorial no ensina a criar jogos, mas provavelmente vai dar uma boa noo do funcionamento de funes comuns em muitas das bibliotecas grficas recomendadas para o desenvolvimento. Ao final deste estudo, o leitor dever ser capaz de: Instalar corretamente o Allego no DevC++; Entender a sintaxe e utilizao das funes da biblioteca a l g o h ler.; Carregar Bitmaps e Textos na tela; Desenhar e pintar formas geomtricas primitivas; Mover Bitmaps com o Teclado; Detectar Coliso de Bitmaps; Utilizao de Timer, Mouse e Som.

Requerimentos:
Compilador BloodShed DevC++ com MinGW/GCC: Link [7,6 MB]
(voc pode utilizar outro de sua pre fe r ncia, por m e stare m os dando nfase ao BloodShe d De vC ++)

Pacote DevPak do Allegro: Link [1,86 MB]

(voc pode faze r a instalao m anualm e nte baix ando os pacote s se guindo se us proce dim e ntos, por m ne ste turorial se r abordada a m ane ira m ais fcil)

Conhecimento bsico da linguagem C ou C++. Voc pode obter apostilas e Tutoriais de C++ gratuitamente no site da UniDev: Link [N/A]
( im portante obte r conhe cim e nto razove l program ao ante s de se ave nturar com algum a bibliot ca grfica, por m , possve l acom apanhar e ste tutorial durante o apre ndizado da linguage m )

Instalao: Iniciando nosso estudo, vamos instalar o DevC++ e o pacote do Allegro. Depois iremos testar um cdigo padro
para verificar se a instalao foi feita corretamente. - Clique duas vezes no programa de instalao do BloodShed DevC++ e faa a instalao;

- Clique duas vezes no pacote do Allegro e faa a instalao utilizando o Packman*; (* Pack m an o ge re nciador de pacote s de atualizao do De vC ++, ape nas um assiste nte de instalao ).

- Se voc preferir, pode instalar o pacote do Allegro pelo prprio DevC++, para isso, clique no menu Ferramentas e escolha Package Manager:

(Essa opo ir abrir um assiste nte de instalae s de pacote s do De vC ++)

- Clique no boto Install e selecione o caminho onde voc salvou o pacote de instalao do Allegro:

- Siga todo o processo de instalao:

(De vC ++ Pack age Installation W izard)

- Agora, certifique-se de que o Allegro foi instalado com sucesso. Crie um Novo Projeto no DevC++, Selecione a aba MultiMedia, e clique em Allegro Application(static):

(Se le cione o tipo de aplicao na aba MultiMe dia, nom e ie o Proje to e clique e m O K)

Aps selecionar o Tipo de projeto e nome-lo, clique em Ok. O programa pedir que voc salve o projeto. Considere criar uma pasta com o nome do projeto onde voc ir salvar todos os arquivos fonte e classas do programa, assim como imagens e sons. Neste projeto no iremos gerar tantos arquivos, pois apenas um projeto teste para verificar se o pacote foi instalado corretamente. Ento escolha um diretrio, salve o projeto e o arquivo m i . p . ancp Agora pressione F9 ou clique no boto Compilar & Executar. O cdigo padro ser compilado e executado pelo DevC++ e se tudo estiver correto, seu programa no apresentar erros nem warnings, e uma janela vazia ser mostrada:

(Janala vazia ge rada pe lo cdigo padro da aplicao Alle gro)

- Utilize a tecla ESC para fechar a janela. - Apenas a ttulo de conhecimento, veja o cdigo gerado com comentrios:

#nld <ler.>/ Aiin a fnsd Algo* icue algoh * dcoa s ue o ler /

/ A 2lna sgitssocaaa d fnsprpooia * * s ihs eune hmds e ue o rttpo / vi ii(; od nt) vi dii(; od ent) itmi( {/ Es lnaviiiiroporm asmcm e CC+* n an) * sa ih a nca rgaa si oo m /+ / ii(;/ Es lnacaaafn qeiiilz a oe d vdo/ nt) * sa ih hm uo u ncaia s ps e e* wie(kyKYEC){/ eqat atcapesoaafrdfrned ECajnl cniu aia/ hl !e[E_S] * nuno el rsind o ieet e S aea otna tv* / ptyu cd hr (dcoaeo nsocdg au)/ * u or oe ee aiinrms os io qi* } dii(;/ fn pr lma obfe * ent) * uo aa ipr ufr / rtr 0;/ Fnlz oPorm smers/ eun * iaia rgaa e ro* } EDO_AN) / Et ocmnouiiaopr fnlzrafn mi( * N_FMI(; * se oad tlzd aa iaia uo an) /

vi ii( {/ dcaa d fn* od nt) * elro a uo/ itdph rs / vresd fn* n et, e; * aivi a uo/ algoii(;/ caafn d algo* ler_nt) * hm uo o ler / dph=dstpclrdph) / Arbi d vlrtrd d fn* et eko_oo_et(; * tiuo e ao iao e uo/ i (et = 0)dph=3 ;/ vrfc vlr cs eesj zr,avre rcv u vlrpetpld f dph = et 2 * eiia ao, ao l ea eo aivl eee m ao r-siua stclrdphdph;/ fn d uiia d crs rcb vlrpetblcd * e_oo_et(et) * uo e tlzo e oe, eee ao r-saeeio / rs=stgxmd(F_UOEETWNOE,60,40,0,0) / Dtcapaad vdoe e e_f_oeGXATDTC_IDWD 4 8 ; * eet lc e e dfn rslo6040 * eie eou(4x8) / i (e ! 0){/ s rsfrdfrned zr,prqehueer * f rs = * o e o ieet e eo o u ov ro / algomsaealgoerr;/ etoeiiauamnae d er grd pl fn * ler_esg(ler_ro) * n xbd m esgm e ro eaa ea uo / ei(- ) / sid porm ifrad er * xt 1 ; * a o rgaa nomno ro / } / a 3lna asgi,sofnospr tmo uiia d tcaoemue* * s ihs eur ue aa ep, tlzo e eld os / isaltmr) ntl_ie(; isalkyor(; ntl_ebad) isalmue) ntl_os(; / adohriiilztoshr (efrncsi,tmcm aiinroto tps * * d te ntaiain ee s o eesro e oo dcoa urs io) / } vi dii( {/ afn qefipooiaaaia* od ent) * uo u o rttpd cm / cerkyu(;/ fn pr lma obfe d tcao* la_ebf) * uo aa ipr ufr o eld / / adohriiilztoshr (efrncsi,tmcm aiinroto tps * * d te ntaiain ee s o eesro e oo dcoa urs io) / }
(C digo de

m i . p do ancp

proje to de e x e m plo com com e ntrios)

Pronto, agora podemos comear com exemplos de utilizao do Allegro.

A Sintaxe da Biblioteca: Vamos agora entender os principais comandos do Allegro. Estudaremos as funes de

inicializao da biblioteca, da placa de vdeo e do teclado. Veremos tambm a funo E D O _ A N ) que a funo N_FMI(, necessria para indicar o fim de main. Para um estudo deste assunto iremos escrever um cdigo totalmente novo. Ento apague todo o contedo do arquivo m i . p , do projeto que voc acabou de criar, e siga as instrues a seguir. ancp - Vamos carregar prottipos e as difinies do Allegro, carregando o arquivo a l g o h ler.:
#nld <ler.> icue algoh

- Como sabemos, ao declarar o arquivo de cabealho, teremos acesso s funes pr programadas que facilitam o desenvolvimento do cdigo. O arquivo includo foi a l g o h que a biblioteca grfica a qual estamos estudando. ler., - Vamos agora declarar a funo principal do nosso programa, a m i ( : an)
#nld <ler.> icue algoh itmi( { n an) }

- Agora vamos fazer as definies e chamadas de funes importantes para a utilizao do Allegro. A primeira funo que devemos chamar a l g o i i ( , que inicializar as funes da biblioteca. Logo aps esta funo, devemos chamar uma ler_nt) funo para interpretar os comandos dos dispositivos de entrada, no nosso caso, a funo i s a l k y o r ( , referente ao ntl_ebad) teclado, e se for necessrio, outros dispositivos de entrada, como por exemplo o mouse. A funo i s a l k y o r ( ntl_ebad) interpreta os valores do teclado de forma diferente das funes de input padro de outras bibliotecas, como por exemplo, s d o hentre outras. Mais definies da funo, sero abordadas no tpico referente a movimentao de bitmaps com o ti. teclado. Vejamos agora a utilizao das funes:
#nld <ler.> icue algoh

itmi( { n an) algoii(; ler_nt)

isalkyor(; ntl_ebad) }

- O prximo passo, est relacionado s definies de video. Vamos definir atravz da utilizao da funo s t c l r d p h ) e_oo_et(, qual ser a profundidade de cores utilizada. Essa funo pode receber valores pr estabelecidos de 8, 15, 16, 24 e 32 cores. Este nmero, regido por RGB, ou seja, variao de tonalidade de 3 cores primrias que possibilitam a utilizao de outras cores. O significado de RGB na verdade Vermelho(Red), Verde(Green) e Azul(Blue), e utilizado como padro para preenchimento de cores em Bitmaps. Exemplo:

(A cr ve rm e lha form ada atrave z da R GB [255,0,0] com o m ostra a im age m )

- Na imagem acima, vemos o princpio da utilizao de RGB. Ao Vermelho foi atribuido o nmero mximo de tonalidade, enquanto ao Verde e Azul, no foi atribuido nenhum nmero. Como a tonalidade do Verde e Azul nula, o Vermelho no se mistura com nenhuma outra cor, permanacendo nesta tonalidade. - Voltando ao Allegro, o que temos que fazer, informar funo s t c l r d p h ) quantos bits de cores sero utilizados: e_oo_et(,
stclrdph3) e_oo_et(2;

- A funo s t c l r d p h )deve ser utilizada sempre antes da funo s t g x m d ( . Caso contrrio, as cores de e_oo_et( e_f_oe) algum Bitmap, no sero exibidas corretamente. - A prxima definio de vdeo a ser feita, a definio da placa de vdeo e de sua resoluo. Para isso utilizaremos a funo s t g x m d ( , que tem como parmetro inicial a deteco do modo de vdeo, a definio da resoluo em que a aplicao e_f_oe) ser exibida:
stgxmd(F_UOEET 60,40,0,0) e_f_oeGXATDTC, 4 8 ;

- Na linha acima, vemos a funo sendo utilizada, com o parmetro de deteco automtica da placa de vdeo com uma resoluo 640x480. Os proximos campos, onde vemos dois zeros, so respectivamente a altura e largura virtuais da tela, ou seja, partes do mapa de um jogo que no aparecem no display. Estas reas virtuais so acessadas por meio de uma funo de scrowling, ou seja, rolamento de tela. Neste exemplo no utilizaremos a rea virtual, por isso no daremos importncia para ela agora. - Veremos agora alguns dos modos de vdeo possveis e suas descries: GFX_TEXT GFX_AUTODETECT GFX_VGA GFX_MODEX GFX_VESA1 GFX_VESA2B GFX_VESA2L GFX_VESA3 GFX_VBEAF GFX_XTENDED retorna para o modo texto faz com que o Allegro escolha o driver grfico mais apropriado (normalmente tem problemas com placas de vdeo mais recentes) modo VGA (320x200, 320x100, 160x120, 80x80) uma verso planar do modo VGA (tweaked) usa o driver VESA 1.x usa o driver VBE 2.0 em modo banked usa o driver VBE 2.0 com framebuffer linear usa o driver VBE 3.0 usa o acelerador de hardware API VBE/AF usa o driver 640x480 unchained

- Como podemos perceber, os modos de video acima so definies divididas em duas partes, G X que se refere ao modo F, grfico, e os modos propriamente ditos, como por exemplo A T D T C . Porm, existe outro sub-parmetro pode ser utilizado; UOEET caso voc queira deixar seu jogo em modo fullscreen(tela cheia), voc deve declarar o modo, e no final acrescentar o subparmetro F L S R E . Caso no o faa, a funo ir assumir default, executando seu jogos em uma janela. Voc pode ULCEN especificar que quer seu programa especificamente em uma janela acrescentando W N O E . Veja exemplos: IDWD
s t g x m d ( F _ U O E E T 6 0 , 4 0 , 0 , 0 ) /* default */ e_f_oeGXATDTC, 4 8 ; s t g x m d ( F _ U O E E T W N O E , 6 0 , 4 0 , 0 , 0 ) /* fora janela */ e_f_oeGXATDTC_IDWD 4 8 ; s t g x m d ( F _ U O E E T F L S R E , 6 0 , 4 0 , 0 , 0 ) /* fora fullscreen */ e_f_oeGXATDTC_ULCEN 4 8 ;

- Uma vez definidos estes parmetros, podemos iniciar uma rotina para inserir os grficos. Como estamos utilizando a

biblioteca a l g o h no podemos exibir texto da mesma forma que fazemos com c u ou p i t ( , pois no fazem parte ler., ot rnf) desta biblioteca. Para imprimir texto utilizaremos o seguinte comando:
txotsre,fn,"et" 11 mkcl2500)) etu(cen ot txo, ,, aeo(5,, ;

- Vamos analizar a funo t x o t )e seus parmetros: etu( t x o t Chamada da funo. Indica que o bitmap a ser impresso ser do tipo texto. etu: s r e : Ponteiro tipo B T A definido pelo Allegro e utilizado pela funo s t g x m d ( . Pode ser utilizado para cen IMP e_f_oe) outras funes envolvendo B T A S IMP. f n : a definio do tipo de fonte utlizada para o texto, essa definio, assim como a anterior so declaradas na ot funo s t g x m d ( , porm so um pouco mais complexas, e vamos deix-las de lado por no serem essenciais para e_f_oe) o aprendizado inicial. " e t " : O texto que ser exibido. Assim como no comando p i t ( , o texto que ser exibido fica entra aspas(" O txo rnf) ). campo texto do tipo c a , ento, possvel adicionar uma varivel do tipo s r n ou c a no lugar do texto puro como hr tig hr no exemplo acima. 1 1 Esses nmeros representam respectivamente coluna e linha. So dois valores do tipo i t e pode-se usar variveis ,: n, para represent-los, tornando o programa mais dinmico. O texto ser inserido na coluna e linha definidas por estes parmetros. Esses nmeros esto relacionados com a resoluo definida na funo de vdeo s t g x m d ( , desta e_f_oe) forma, se estes valores forem maiores que os valores da resoluo, no ser possvel visualizar o texto corretamente. m k c l 2 5 0 0 : Esta funo utilizada para determinar cor. Seu valore de sada do tipo i t o que significa que o aeo(5,,) n, valor da funo pode ser armazenado em uma varivel para tornar o programa mais dinmico. Os valores de entrada desta funo, esto no padro de RGB, ou seja, intensidade de 3 cores primrias: red(vermelho), green(verde) e blue(azul). - Existem outras funes para exibio de texto, porm, no sero exploradas neste tuturial introdutrio. Mais informaes sobre exibio de texto podem ser encontradas nos links relacionados no final desta pgina. - Vamos ver como fazer para inserir estes cdigos em nosso programa utilizando a diretiva de condio w i e ) hl(:
#nld <ler.> icue algoh

itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad)


stclrdph3) e_oo_et(2; stgxmd(F_AE 80,60,0,0) e_f_oeGXSF, 0 0 ; wie!e[E_S] { hl(kyKYEC) txotsre,fn,"et" 11 mkcl2500)) etu(cen ot txo, ,, aeo(5,, ; } ; rtr 0 eun ;

}
(O cdigo acim a no pode se r e x e cutado ainda pois falta a funo E D O _ A N ) N_FMI()

- Agora vamos ver como fazer para inserir uma imagem na janela. O procedimento um pouco mais complexo, porm, muito simples de se fazer. O primeiro passo para se exibir uma imagem, ter uma imagem, ento, vamos criar uma para nosso exemplo:

(Im age m a se r utilizada no e x e m plo, form ato bm p de 24 bits)

O procedimento para adicionar a imagem so:


1P L T E p l / d c a a u a v r e t p P L T E * AET a; * elro m aivl io AET / 2B T A * m = l a _ i m p " : \ e t . m " p l ; * P n e r B T A c r e a i a e * IMP ig odbta(c\tsebp,a)/ otio IMP arg mgm / 3d a _ p i e s r e , i g 3 , 0 ) / f n p r i p i i i a e * rwsrt(cen m, 08 ; * uo aa mrmr mgm /

1 Aqui temos a declarao da varivel p l tipo P L T E que utilizada na linha seguinte tambm. Variveis do tipo : a, AET, P L T E so utilizadas para definir as cores que o B T A est utilizando. O Allegro oferece algumas variveis P L T E AET, IMP AET padro que podem facilitar o trabalho dos programadores de diversas formas; Neste caso, a utilizao de p ltorna-se a desnecessria pois estamos utilizando 32 bits e poseriamos utilizar o argumento N L . A utilizao de uma varivel tipo UL P L E Eno est errada neste caso, porm no h necessidade. Quando a profundidade de cores de 8 bits(256 cores), ALT torna-se necessrio utilizar uma varivel tipo P L T E para definir as cores que sero utilizadas. Existem formas de manipular AET, a Paleta de Cores, porm no as abordaremos neste tutorial. No nosso exemplo vamos utilizar a paleta mesmo sem a sua necessidade. 2 Nesta linha temos a declarao de um ponteiro do tipo B T A , que nomeamos * m . Esta varivel recebe, atravz da : IMP ig

funo l a _ i m p ) o arquivo de imagem que iremos carregar, t s e b p seguido do parmetro p l descrito acima. odbta(, et.m, a, 3 A funo d a _ p i e ) a funo que carrega a imagem na tela. Seus parmetros so similares s da funo t x o t ) : rwsrt( etu(, porm no utiliza os parmetros f n e m k c l r g b . Mas em contrapartida, utiliza as declaraes feitas nas duas linhas ot aeo(,,) anteriores. Nesta linha, o parmetro i g a imagem propriamente dita, e os nmeros a seguir so coluna e linha m respectivamente. - Agora vamos inserir estas linhas em nossso cdigo; tambm vamos reduzir consideravelmente o tamanho do cdigo se comparar-mos com o cdigo gerado pelo automaticamente pelo Allegro. Vejamos como fica o novo cdigo:
#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; PLTEpl AET a; BTA *m =la_imp":\et.m"pl; IMP ig odbta(c\tsebp,a) wie!e[E_S] { hl(kyKYEC) cerbta(m) la_impig; txotsre,fn,"xml" 3,0 mkcl2500)) etu(cen ot Eepo, 02, aeo(5,, ; da_piesre,ig 3,0) rwsrt(cen m, 03 ; } ; rtr 0 eun ; }
(C digo alte rado para e x ibir im age m e te x to)

No cdigo acima, pode-se notar a diferena do cdigo padro do Allegro mostrado anteriormente, isto por que vrias outras funes que no utilizaremos foram retiradas, assim como i s a l m u e ) c e r k y u ( entre outras; ou seja, o cdigo ntl_os(, la_ebf) que voc est vendo acima o mais enxuto possvel para imprimir uma imagem e um texto numa janela. A definio da janela est em 640x480, mas poderia ser mudada para qualquer resoluo desejada, contanto que a placa de vdeo seja capaz de executar na resoluo desejada. - Um ultimo comando deve ser incluso ao cdigo para para que o programa execute corretamente. A funo E D O _ A N )faz N_FMI( com que o Allegro entenda que o fim da funo m i ( , ou seja, o fim do programa. A no incluso da funo an) E D O _ A N )far com que o DevC++ apresente uma mensagem de erro. Observe o cdigo completo com comentrios: N_FMI(
#nld <ler.>/ Aiin a fnsd Algo* icue algoh * dcoa s ue o ler / itmi( { n an) algoii(;/ fn d iiilzod algo* ler_nt) * uo e ncaia o ler / isalkyor(;/ fn d iiilzod tcao aoadnr d mi( * ntl_ebad) * uo e ncaia e eld, gr eto a an) / stclrdph3) / fn d pouddd d crs dfnoe 3 crs* e_oo_et(2; * uo e rfniae e oe, eii m 2 oe / stgxmd(F_UOEETWNOE,4,8,,) / slcoaotp d paaerslod vdo* e_f_oeGXATDTC_IDWD604000; * eein io a lc eou o e / PLTEpl / dcaa uavre tp PLTE* AET a; * elro m aivl io AET / BTA *m =la_imp":\et.m"pl;*Pner BTA igearbisuvlr* IMP ig odbta(c\tsebp,a)/ otio IMP m tiu e ao / wie!e[E_S] {/ Eqat tcadfrned EC* hl(kyKYEC) * nuno el ieet e S / cerbta(m) la_impig; / Lmaopner * * ip otio / txotsre,fn,"xml" 3,0 mkcl2500)) / fn pr ipii txo* etu(cen ot Eepo, 02, aeo(5,, ; * uo aa mrmr et / da_piesre,ig 3,0) / fn pr ipii iae * rwsrt(cen m, 03 ; * uo aa mrmr mgm / } / fmd wie)* ; * i o hl( / rtr 0 / Sid fn mi( smersfznocmqeoporm fnlz * eun ; * a a uo an) e ro aed o u rgaa iaie / }

EDO_AN)/ Fnlz aeeu d Algonseporm * N_FMI( * iaia xco o ler et rgaa /


(C digo com e ntado e pronto para e x e cuo)

- Ao executarmos este cdigo, a seguinte janela ser exibida:

(Jane la de aplicao Alle gro e x ibindo a palavra 'Ex e m plo' e o de se nho de um Aviozinho)

Desenhando Bitmaps: Agora vamos ver algumas das funes de desenho geomtrico primitivo do Allegro. Estas funes
so utilizadas para desenhar retas, circulos, retangulos e diversas outras formas atravez de pixels. O que se deve saber a respeito deste tipo de desenho, a forma com que ele exibido. - Vamos apagar uma parte de nosso cdigo, deixando apenas a inicializao das funes do Allegro e a diretiva w i e ) hl(:

#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; wie!e[E_S] { hl(kyKYEC) } ; rtr 0 eun ; } EDO_AN) N_FMI(;

- Para desenhar uma imagem, necessrio criar um ponteiro do tipo B T A , que ser utilizado como um buffer para a IMP execuo da funo. Neste ponteiro, ser definido o tamanho mximo da imagem que ser desenhada. A definio e feita atravz da funo c e t _ i m p ) que recebe como parmetro dois nmeros inteiros referente resoluo utilizada na raebta(, janela. Iremos ento criar um B T A : IMP
#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; BTA *m =cet_imp6040;/ Ci oBTA * IMP ig raebta(4,8) * ra IMP / wie!e[E_S] { hl(kyKYEC) } ; rtr 0 eun ; } EDO_AN) N_FMI(;

- O prximo passo ser definir a dimenso e a cor de nossa linha. Para isto, iremos utilizar a funo padro de criao de linha do Allegro, l n ( , que recebe como parmetro o ponteiro que criamos(B T A ), os pontos de incio e fim da linha(i t e a ie) IMP n ), funo de cr da linha(m k c l ) Desta forma a sintaxe da funo seria esta: a e o ( ).
ln(IMP*m,itxiiil ityiiil,n xfnlityfnl mkclititit); ieBTA ig n _nca, n _nca it _ia,n _ia, aeo(n,n,n )

- E esta seria sua utilizao:


ln(m,1,0 1010 mkcl2500)) ieig 01, 0,0, aeo(5,, ;

- Agora vamos entender como so desenhados os Bitmaps, comparando o plano de Bitmaps(se que podemos chamar assim), e o plano Cartesiano:

(C om parao e ntre plano carte siano e Plano de Pix e ls utilizado por Bitm aps)

- Como podemos perceber, os vetores X e Y, esto posicionados da maneira diferente quando comparamos os planos, desta forma, quando desenharmos a linha, devemos ter em mente a direo do trao. Vamos adicionar a funo ao nosso cdigo:
#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; BTA *m =cet_imp6040;/ Ci oBTA * IMP ig raebta(4,8) * ra IMP / wie!e[E_S] { hl(kyKYEC) cerbta(m) la_impig; ln(m,1,0 1010 mkcl2500)) / Dfn dmn ecrd lna * ieig 01, 0,0, aeo(5,, ; * eie ieso o a ih / } ; rtr 0 eun ; } EDO_AN) N_FMI(;

- Aps feita a definio das dimenses de nossa linha, devemos chamar a funo b i ( , que responsvel pela impresso da lt) linha. Esta funo recebe como parmetros o B T A que criamos, que na verdade a imgem propriamente dita; em seguida, IMP um outro ponteiro, que definido pela funo s t g x m d ( , o ponteiro s r e , seguido de quatro campos inteiros, e por e_f_oe) cen ltimo, a largura mxima e altura mxima da janela, ou seja, a resoluo. Esta a sintaxe da funo b i ( : lt)
bi(IMP*imp BTA *impitititlruaatr) ltBTA bta, IMP bta,n,n,n,agr,lua;

- E utilizada assim:
bi(m,sre,,,,,4,8) ltig cen00006040;

- Estes quatro campos inteiros que foram declarados com zero, so na verdade informaes das posies de X e Y que so passados biblioteca d a . , utilizada pelo Allegro, porm neste exemplo estas definies no so aplicveis, pois a rwh definio feita na funo l n ( j suficiente para nosso exemplo. Agora vamos incluir esta funo ao nosso cdigo: ie)
#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; BTA *m =cet_imp6040;/ Ci oBTA * IMP ig raebta(4,8) * ra IMP / wie!e[E_S] { hl(kyKYEC) cerbta(m) la_impig; ln(m,1,0 1010 mkcl2500)) / Dfn dmn ecrd lna * ieig 01, 0,0, aeo(5,, ; * eie ieso o a ih / bi(m,sre,,,,,4,8) / Ipiealna * ltig cen00006040; * mrm ih / } ; rtr 0 eun ; } EDO_AN) N_FMI(;

(C digo com e ntado para ge rao de um a linha e m diagonal utilizando Alle gro)

- Executando este cdigo, teremos o seguinte resultado:

(Jane la de aplicao Alle gro e x ibindo um a linha diagonal com base nos valore s de X e Y iniciais e finais da funo)

- Como mencionado anteriormente, existem outras funes grficas especficas para construo de figuras geomtricas. Estas funes funcionam da mesma forma que funes matemticas e so relativamente simples de se executar, basta que o programador tenha conhecimento de matemtica, especificamente de geometria. Vamos ver alguns exemplos das funes: - Crculo: O circulo, feito atravz da funo c r l ( , que tem como parmetro o ponteiro B T A , sua posio X e Y, seu ice) IMP raio e finalmente sua cr:
crl(m,1,5,0,mkcl2500)) iceig 51010 aeo(5,, ;

- Retngulo: O retngulo, construido com a funo r c ( , e recebe como parmetros um ponteiro de tipo B T A , as et) IMP posies de X e Y do seu incio que no lado superior esquerdo, a posio de terminao, que o lado inferior direito, e sua cr:
rc(m,1,0 1010 mkcl2500)) etig 01, 0,0, aeo(5,, ;

- Preenchimento: Figuras como o retngulo e crculo, no tem preenchimento, sendo desenhadas apenas suas bordas, desta forma o programador ter que utilizar a funo de preenchimento referente a figura para que a mesma tenha seu interior preenchido com alguma cr, caso contrrio ser apenas uma borda. Vejamos um exemplo:
#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; BTA *m =cet_imp6040;/ Ci oBTA * IMP ig raebta(4,8) * ra IMP / wie!e[E_S] { hl(kyKYEC) cerbta(m) la_impig; rc(m,1,0 1010 mkcl2500)) / Dfn dmn ecrd rtnuo* etig 01, 0,0, aeo(5,, ; * eie ieso o a egl / bi(m,sre,,,,,4,8) / Ipieortnuo * ltig cen00006040; * mrm egl / } ; rtr 0 eun ; } EDO_AN) N_FMI(;

(cdigo para ge rar o re tngulo)

- Executando este cdigo, temos a seguinte janela:

(Jane la de aplicao Alle gro e x ibindo um re tngulo)

- Para inserir uma cor de preenchimento, devemos utilizar a seguinte funo:


rcfl(m,1,19,9 mkcl0025)) etilig 11,99, aeo(,,5 ;

- Note que na funo r c f l ( , os valores das posies de X e Y esto diferentes da funo anterior. As coordenadas do etil) preechimento devem ser calculadas para que desenho no sobreponha sua borda. O preenchimento ser um pixel menor em todos os lados. O retngulo est sendo desenhado um pixel abaixo no eixo Y e um pixel a frente no eixo X; e sua terminao est um pixel acima no eixo Y e um pixel antes no eixo X. Desta forma temos a seguinte imagem:

(Jane la de aplicao Alle gro e x ibindo um re tngulo de bordas ve rm e lhas e pre e nchim e nto azul)

- Tringulo: O tringulo uma figura geomtrica com 3 pontas, isto significa que para desenharmos um tringulo, alm de chamar o ponteiro B T A para a construo da imagem, deveremos declarar 3 vrtices, de posies X e Y, e por ltimo a cr IMP do tringulo. Esta figura geomtrica no formada por linhas, e sim uma imagem slida, no podendo ser utilizada a funo de preenchimento como nos desenhos anteriores. A funo do tringulo t i n l ( , e sua sintaxe : rage)
tinl(m,5,5,5,5,030 mkcl2500)) rageig101030301,5, aeo(5,, ;

- Retas: Alm da linha desenhada no primeiro exemplo, com a funo l n ( , existem dois outros tipos de linhas que podem ie) ser utilizados no Allegro; linhas verticais, v i e ) e linhas horizontais, h i e ) que tem como parmetro o ponteiro que ln(, ln(, far a contruo da imagem, o ponto onde ser iniciada a reta, de acrdo com o tipo escolhido, os pontos X e Y que definiro a extenso da reta, e por ltimo, a cor da linha:
/ snae / itx

vi vieBTA *imp itx,ity,itx,mkclititit)) od ln(IMP bta, n 1 n 1 n 2 aeo(n,n,n ; vi hieBTA *imp ity,ity,itx,mkclititit)) od ln(IMP bta, n 1 n 2 n 1 aeo(n,n,n ; / uiia / tlzo vieig 1,010 mkcl2500)) ln(m, 01,0, aeo(5,, ; hieig 1,010 mkcl2500)) ln(m, 01,0, aeo(5,, ;

- Exisitem outras funes para grficos geomtricos no Allegro, porm neste Tutorial, apenas estas sero abordadas. Se quiser aprender mais sobre estas e outras funes, visite um dos links relacionados no final desta pgina.

Mover Bitmaps com o Teclado: Agora chegamos numa parte um pouco mais complexa, e para obter resultados com a

leitura e necessrio que tenha lido os tpicos anteriores. Vamos falar do input pelo teclado, especificamente da forma com que os valores das teclas so obtidos. Vamos aprender como movimentar bitmaps atravez do teclado. Antes de comear, importante seber de alguns conceitos de utilizao do teclado. - A biblioteca Allegro no possui uma funo que armazena o valor digitado pelo usurio em uma varivel, como por exemplo a funo s a f ) O Allegro tem uma forma diferente de representar os valores das teclas, e para ler as mesmas, necessrio a cn(. utilzao de uma estrutura alternativa. - Primeiramente, vamos observar uma forma de utilizao da array k y que uma espcie de ndice de caracteres do Allegro. e, Cada tecla tem um valor constante correspondente a ela. Para exemplificar, vamos utilizar uma parte do cdigo que fizemos anteriormente, porm, vamos nos concentrar nos parmetros da funo w i e ) hl(:
wie!e[E_S] {/ Eqat atcanofrEcf oqeet n boo* hl(kyKYEC) * nuno el o s aa u s o lc / } ;

- O parmetro desta funo uma array, k y que est na posio [ E _ S ] que corresponde a tecla ESC de seu teclado. e, KYEC, Esta array utilizada dentro de uma funo da biblioteca Allegro, para detectar, por meio de s a c d , se uma certa tecla cnoe est pressionada ou no(0 ou 1). Atravz de valores do ponteiro k y pode-se utilizar teclas especficas para certas interaes e, entre o programa e o usurio. Para isso, o programador dever saber quais so os valores correspondentes as teclas. Vejamos ento o contedo da array nesta tabela: Tecla A, B ... Z Teclado Numrico 0 a 9 Teclado Normal 0 a 9 Esc Enter Seta para a Direita Seta para a Esquerda Seta para Cima Seta para Baixo Pause Barra de Espao Print Screen Shitf Esquerdo Shift Direito Control Esquerdo Control Direito Alt esquerdo Alt Direito Cdigo na Array KEY_A, KEY_B...KEY_Z KEY_0_PAD ... KEY_9_PAD KEY_0 ... KEY_9 KEY_ESC KEY_ENTER KEY_RIGHT KEY_LEFT KEY_UP KEY_DOWN KEY_PAUSE KEY_SPACE KEY_PRTSCR KEY_LSHIFT KEY_RSHIFT KEY_LCONTROL KEY_RCONTROL KEY_ALT KEY_ALTGR

(C odificao das te clas m ais im portante s contidas na array k y e)

- Existem outras teclas que no so mencionadas neste tutorial, pois no sero usadas; mas acredito que esta explicao superficial a respeito da array k y suficiente por enaquanto. e, - Vamos escrever um cdigo que use algumas das teclas mencionadas acima. Mas para isso, vamos entender como fazer para movimentar um Bitmap da forma mais simples. - Para se desenhar um Bitmap, necessrio informar certos parmetros sua funo. O principal parmetro para se movimentar um Bitmap, a sua posio na tela, ou seja, suas coordenadas X e Y, que diro onde o Bitmap ser desenhado. Ento, podemos escrever uma estrutura que vai modificar o valor de X e Y, caso seja pressionada uma tecla de movimentao, definida pelo programador. Vamos exemplificar:
i(e[E_IH] { fkyKYRGT) x+ +; cerbta(m) la_impig; crlfl(m,,,0mkcl252525) iceiligxy3,aeo(5,5,5); bi(m,cen00006040; ltigsre,,,,,4,8) }

- O cdigo acima, verifica se a seta para direita foi pressionada; como vimos na tabela de valores da array k y a tecla para e, direita representada por K Y R G T A funo c r l f l ( utiliza variveis no lugar de valores para X e Y. Caso a seta E_IH. iceil) para direita seja pressionada, o valor de X, ser acrecido em 1(um), a circunferncia ser apagada e redesenhada de acordo com o novo valor de X. Essa estrutura a estrutura bsica para movimento de Bitmaps ou sprites, porm pode ser amplamente melhorada. Vamos criar um cdigo que mostre a leitura das quatro setas direcionais do teclado:
#nld <ler.> icue algoh #nld <ti.> icue sdoh

itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; itx30 y10 n =0, =9; BTA *m =cet_imp6040; IMP ig raebta(4,8) ca tt4] srnftt":% hr x[0; pit(x,X d Y %" x y; : d, , ) crlfl(m,,,0mkcl252525) iceiligxy3,aeo(5,5,5); bi(m,cen00006040; ltigsre,,,,,4,8) txotsre,ottt55mkcl2500) etu(cenfn,x,,,aeo(5,,); wie!e[E_S] { hl(kyKYEC) cerbta(m) la_impig; i(e[E_IH] { fkyKYRGT) x+ +; cerbta(m) la_impig; crlfl(m,,,0mkcl252525) iceiligxy3,aeo(5,5,5); bi(m,cen00006040; ltigsre,,,,,4,8) srnftt":% pit(x,X d Y %" x y; : d, , ) txotsre,ottt55mkcl2500) etu(cenfn,x,,,aeo(5,,); } i(e[E_ET){ fkyKYLF] x-; cerbta(m) la_impig; crlfl(m,,,0mkcl252525) iceiligxy3,aeo(5,5,5); bi(m,cen00006040; ltigsre,,,,,4,8) srnftt":% pit(x,X d Y %" x y; : d, , ) txotsre,ottt55mkcl2500) etu(cenfn,x,,,aeo(5,,); } i(e[E_P){ fkyKYU] y-; cerbta(m) la_impig; crlfl(m,,,0mkcl252525) iceiligxy3,aeo(5,5,5); bi(m,cen00006040; ltigsre,,,,,4,8) srnftt":% pit(x,X d Y %" x y; : d, , ) txotsre,ottt55mkcl2500) etu(cenfn,x,,,aeo(5,,); } i(e[E_ON){ fkyKYDW] y+ +; cerbta(m) la_impig; crlfl(m,,,0mkcl252525) iceiligxy3,aeo(5,5,5); bi(m,cen00006040; ltigsre,,,,,4,8) srnftt":% pit(x,X d Y %" x y; : d, , ) txotsre,ottt55mkcl2500) etu(cenfn,x,,,aeo(5,,); } } ; rtr 0 eun ; } EDO_AN) N_FMI(;
(Estrutura sim ple s para m ovim e nto de um a circunfe r ncia utilizando o te clado)

- O cdigo utiliza s r n f ) uma funo da biblioteca s d o hque guada texto e valores de variveis em uma string. Essa pit(, ti. string foi usada para que a funo t x o t )pudesse imprimir as posies de X e Y dinamicamente. etu(

Colizao entre Bitmaps: Agora estudaremos a Colizao entre Bitmaps; para isso, vamos entender o que vem a ser o
termo coliso de bitmaps antes de criarmos nosso cdigo de simples coliso. - O que ns entendemos por coliso no mundo real, o encontro fsico de dois ou mais objetos ou superficies; pode ser considerado coliso, o momento que um veculo se choca com um poste, ou quando uma pessoa pisa no cho ao caminhar. A coliso no mundo real pode ser explicada por uma das leis da fsica que diz que dois corpos no poderm ocupar o mesmo espao ao mesmo tempo. Da mesma forma que a coliso fsica; a coliso de bitmaps acontece quando dois ou mais objetos ou superfcies se tocam, ou seja, quando existem pixels de diferentes bitmaps sendo desenhados em uma mesma coordenada. Na coliso virtual, as leis da fsica tem que ser ensinadas ao computador para que os bitmaps no se sobreponho. - Como forma de ilustrao rstica e superficial, vamos considerar um retngulo que foi definido com quatro pontos no plano de Bitmaps: 260,190(x e y superiores),360 e 290(x e y inferiores). Para esse retngulo, as coordenadas no sero alteradas. Criaremos ento outro retngulo, que ser movido pelo teclado, sendo baseado no cdigo utilizado para movimentao do circulo visto anteriormente. Neste cdigo, o crculo ser substituido por um retngulo. Este retngulo ter coordenadas que sero armazenadas nas variveis tipo x, y, x2 e y2. - O que iremos fazer, definir uma rea na tela que o retngulo manipulvel reconhecer como barreira. Para fazer este tipo de definio, vamos comparar o valor de X e Y do nosso retngulo com as posies do retngulo esttico, e se o nosso retngulo invadir esta barreira, ele ser empurrado para fora de acordo com a direo que ele tentou entrar. Vamos ver o cdigo completo para depois analizarmos:
#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; itx25 y7,x=4,y=4; n =7, =5 230 210 PLTEpl AET a; BTA *m =cet_imp6040; IMP ig raebta(4,8) rcfl(m,,,2y,aeo(,,5);/ RtnuoMnplvlAu * etiligxyx,2mkcl0025) * egl auue zl / rcfl(m,6,9,6,9,aeo(5,,);/ RtnuoEttc Vreh * etilig20103020mkcl2500) * egl sio emlo / bi(m,cen00006040; ltigsre,,,,,4,8) wie!e[E_S] { hl(kyKYEC) / Mvmna prstsd tcao Ii * * oieto o ea o eld: nco / i(e[E_IH] { fkyKYRGT) cerbta(m) la_impig; x+x+; +;2+

rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) } i(e[E_ET){ fkyKYLF] cerbta(m) la_impig; x-x-; -;2rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) } i(e[E_P){ fkyKYU] cerbta(m) la_impig; y-y-; -;2rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) } i(e[E_ON){ fkyKYDW] cerbta(m) la_impig; y+y+; +;2+ rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) } / Fmd mvmna cmTcaoeii dsvrfce d pscoaet * * i a oieto o eld nco a eiias e oiinmno / i(x> 29 & ( < 30){ f( = 5) & x = 6) i(y > 10 & (2< 34){ f(2 = 9) & y = 5) cerbta(m) la_impig; x+x+; +;2+ rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) txotsre,ot"oia dtcaa,5,,aeo(5,5,); etu(cenfn,clso eetd"201mkcl25250) } } i(x > 29 & (2< 30){ f(2 = 5) & x = 6) i(y> 15 & ( < 25){ f( = 2) & y = 8) cerbta(m) la_impig; x-x-; -;2rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) txotsre,ot"oia dtcaa,5,,aeo(5,5,); etu(cenfn,clso eetd"201mkcl25250) } } i(y> 10 & ( < 20){ f( = 9) & y = 9) i(x> 14 & ( < 39){ f( = 9) & x = 5) cerbta(m) la_impig; y+y+; +;2+ rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) txotsre,ot"oia dtcaa,5,,aeo(5,5,); etu(cenfn,clso eetd"201mkcl25250) } } i(y > 10 & (2< 20){ f(2 = 9) & y = 9) i(x> 16 & ( < 39){ f( = 9) & x = 5) cerbta(m) la_impig; y-y-; -;2rcfl(m,,,2y,aeo(,,5); etiligxyx,2mkcl0025) rcfl(m,6,9,6,9,aeo(5,,); etilig20103020mkcl2500) bi(m,cen00006040; ltigsre,,,,,4,8) txotsre,ot"oia dtcaa,5,,aeo(5,5,); etu(cenfn,clso eetd"201mkcl25250) } } } ; rtr 0 eun ; } EDO_AN) N_FMI(
(cdigo de coliso sim ple s no apre fe ioado)

- Depois de executar o cdigo pudemos perceber que o retngulo menor, de cor azul, pode ser movido pelas cetas do teclado, porm no entra na rea do retngulo vermelho. Como podemos observar no cdigo, existe uma sequencia de diretivas condicionais que comparam os valores das coordenadas dos dois retngulos, em todos os lados, fazendo com que eles sejam afastados para dar uma ideia de coliso fsica. - O que fizemos foi uma simples comparao das posies, e definimos um procedimento que ser executado no caso de um retngulo invadir o outro. - Claro que este no o melhor exemplo de uma deteco de coliso, porm, d uma ideia superficial de como as colizes funcionam. Neste exemplo, foram utilizados retngulos por serem mais fceis de se trabalhar, e evitam clculos matemticos mais complxos, porm existem algortimos especficos para certos tipos de colizao, os quais so mais trabalhosos e complexos para um tutorial destinado a iniciantes, que por sua vez foi escrito por um iniciante.

Utilizao de Timer, Mouse e Som: Nesta ultima parte de nosso tutorial, vamos entrar em um contedo ainda mias
complexo. Por isso, necessrio que os conceitos dos tpicos apresentados acima tenham sido compreendidos, e claro, ateno.

- Neste tpico, vamos estudar o funcionamento das funes i s a l m u e )e i s a l s u d ) que dependem da funo ntl_os( ntl_on(, i s a l t m r )para funcionar. Ento, vamos ver uma a uma: ntl_ie(

Timer: O Timer, basicamente a funo contadora de tempo no Allegro. Os eventos de tempo podem ter diversas

utilizaes, como por exemplo, contar o tempo que o jogador levou para passar um level de um jogo, ou coisas do tipo, porm, outras funes podem utilizar recursos do Timer. - Os eventos de tempo, simulam um relgio, ou seja, contam o tempo atravz de interrupo e retomada constante de uma determinada ao. O intervalo entre execuo, parada e retomada de execuo, pr-estabelecido pelo programador. Num relgioa, os ponteiros so analgicamente programados, para executarem um movimento que ser interrompido e logo em seguida executado novamente e assim por diante. - Vamos ver os principais comandos de utilizao do Timer e sua sintaxe correta, para isso, vamos utilizar nosso primeiro cdigo, de criao de janela vazia e vamos alter-lo:
#nld <ler.> icue algoh itmi( { n an) algoii(; ler_nt) isalkyor(; ntl_ebad) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; wie!e[E_S] { hl(kyKYEC) } ; rtr 0 eun ; } EDO_AN) N_FMI(;

- Logo abaixo da inicializao do Allegro, vamos inserir a chamada do Timer:


isaltmr) ntl_ie(;

- Agora vamos inserir uma funo que utilizaremos como um c l b c . Esta funo no ter retorno, por que o mesmo no alak relevante para a execuo do programa; uma funo utilizada apenas constar na sintaxe, neste caso recomendado que se utilize o modificador v l t l como vemos na funo. Exitem casos, onde a funo c l b c utilizada pelo Timer tem oaie alak utilidade real.
vltl ita=0 / vre goa * oaie n ; * aivl lbl / vi fn( { od uc) a+ +; }

- O programa no tem como definir por si s, qual a funo a ser utilizada pelo Timer, ento, prximo passo informar ao qual ser a funo e a varivel a ser utilizada. Estas declaraes so feitas dentro da funo m i ( : an)
LC_AIBEa;/ vre * OKVRAL() * aivl / LC_UCINfn) / fn * OKFNTO(uc; * uo /

- Aps definir a funo e a varivel, iremos inserir a seguinte linha de comando:


isalit) ntl_n(;

- A funo acima recebe dois parmetros. Primeiro a funo callback mostrada acima, seguida do intervalo de tempo em milisegundos. Ento a funo fica assim:
isalitfn(,0) ntl_n(uc)10;

- Vejamos agora como fica o cdigo acima com as funes de Timer inclusas:
#nld <ler.> icue algoh vltl ita=0 / vre goa * oaie n ; * aivl lbl / vi fn( { od uc) a+ +; } itmi( { n an) algoii(; ler_nt) isaltmr) ntl_ie(; isalkyor(; ntl_ebad) LC_AIBEa; OKVRAL() LC_UCINfn) OKFNTO(uc; isalitfn(,0) ntl_n(uc)10; stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000;

wie!e[E_S] { hl(kyKYEC) } ; rtr 0 eun ; } EDO_AN) N_FMI(;

- Aps este procedimento, a execuo deste programa ser uma janela vazia, assim como a janela padro gerada pela Allegro, a diferena que as funes que utilizam eventos de tempo podem ser utilizadas agora.

Mouse: Agora que o Timer foi executado, vamos ver o procedimento para iniciar o mouse. O mouse nunca funciona sem o
Timer. - Aps ter certeza de que o Timer est funcionando, podemos iniciar o Mouse. A funo a seguir, serve para carregar os procedimentos do inicializao do Mouse
isalmue) ntl_os(;

- O prximo passo criar um ponteiro do tipo Bitmap onde o cursor do mouse ser desenhado, da mesma forma que as figuras geomtricas primitivas. O comando utilizado para isso :
BTA *m =cet_imp6040; IMP ig raebta(4,8)

- Para exibir o cursor utilizaremos uma funo que recebe como parmetro o ponteiro que criamos acima:
so_os(m) hwmueig;

- Vamos ver o cdigo completo para que tenhamos uma idia.


#nld <ler.> icue algoh vltl ita=0 / vre goa * oaie n ; * aivl lbl / vi fn( { od uc) a+ +; } itmi( { n an) algoii(; ler_nt) isaltmr) ntl_ie(; isalmue) ntl_os(; isalkyor(; ntl_ebad) isalitfn(,0) ntl_n(uc)10; LC_AIBEa; OKVRAL() LC_UCINfn) OKFNTO(uc; stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; BTA *m =cet_imp6040; IMP ig raebta(4,8) wie!e[E_S] { hl(kyKYEC) cerbta(m) la_impig; so_os(m) hwmueig; } ; rtr 0 eun ; } EDO_AN) N_FMI(;

- O Allegro tem procedimentos prprio para detectar qual boto foi pressionado, para isso, a funo vai atribuir valores aos botes; que so 1 para o boto esquerdo e 2 para o boto direito. Para detectar o boto, o Allegro faz uma verificao do valor de m u e b a estrutura i ( a mais indicada para este tipo de verificao por questes de praticidade: os_; f)
i(os_ &1 { fmueb ) txotsre,ot"oa drio,,,aeo(5,5,5); etu(cenfn,bto iet"11mkcl252525) }

- Num jogo, as posies X e Y do cursor do mouse so extremamente importantes em quase 100% dos casos. Por isso, a funo do Mouse no Allegro, j tem essas posies dinamicamente armazenadas nas vairveis m u e xe m u e y Vejamos a os_ os_. utilizao:
itmi( { n an) /cdg.. /io. itxyx,1 n ,,1y; BTA *m =cet_imp6040; IMP ig raebta(4,8) i(os_ &1 { fmueb ) x=muex os_; y=muey os_; i(os_ &2 { fmueb ) x =muex 1 os_; y =muey 1 os_; rc(m,,,1y,aeo(,,5); etigxyx,1mkcl0025) } } /cdg.. /io.

- Ao executar este programa, as posies X e Y do cursor sero guardadas toda vez que o boto esquerdo for pressionado, e novamente armazenadas quando o direito for pressionado, e por fim desenhar um retngulo. - Estas so as formas mais bsicas de utilizao do Mouse.

Sound: Agora veremos o procedimento de utilizao do som. A funo de som necessita do Timer para funcionar. Existem

duas finalidades primrias para utilizao de som; a msica de fundo e os efeitos sonoros relacionados com aes do jogador. Para msica de fundo o Allegro utiliza sons no formato Midi, e para os outros sons decorrentes de aes, podem ser utilizados outros tipos de arquivos, porm, formato Wave o mais comum. Vamos agora ver como o procedimento de inicializao do som e execuo de arquivos de som. - Assim como os outros dispositivos de entrada, temos que inicializar o som. Para isto vamos utilizar a funo i s a l s u d ) porm com alguns parmetros: ntl_on(,
isalsuddg_admd_adcgpt) ntl_on(iicr,iicr,f_ah;

- Como parmetros desta funo temos d g _ a d que detecta driver de som digital que a placa est usando, em seguida iicr, temos m d _ a d que detecta o driver de M D a ser utilizado. Por ltimo temos c g p t , que utilizado para manter iicr, II f_ah compatibilidade de verses mais antigas do Allegro; vamos deixar seu valor em N L , pois no o utilizaremos. UL - Assim como o vdeo, a configurao de som tem alguns valores pr-estabelecidos para entrar como parmentros desta funo. Vejamos alguns dos possveis valores para d g _ a de m d _ a d iicr iicr: dg_ad iicr: DIGI_AUTODETECT DIGI_NONE DIGI_SB DIGI_SB10 DIGI_SB15 DIGI_SB20 DIGI_SBPRO DIGI_SB16 DIGI_AUDIODRIVE DIGI_SOUNDSCAPE instrui o Allegro a escolher o driver de som sem som digital auto-detecco de placas Sound Blaster Sound Blaster 1.0 (8 bit mono) Sound Blaster 1.5 (8 bit mono) Sound Blaster 2.0 (8 bit mono) Sound Blaster Pro (8 bit stereo) Sound Blaster 16 (16 bit stereo) ESS AudioDrive Ensoniq Soundscape

md_ad iicr: MIDI_AUTODETECT instrui o Allegro a escolher o driver de MIDI MIDI_NONE sem som MIDI MIDI_ADLIB auto-deteco de sintetizadores Adlib ou Sound Blaster FM MIDI_OPL2 sintetizador OPL2 (mono, usado em Adlib e Sound Blaster) MIDI_2XOPL2 sintetizador OPL2 dual (stereo, usado em Sound Blaster Pro-I) MIDI_OPL3 sintetizador OPL3 (stereo, usado em Sound Blaster Pro-II e acima) MIDI_SB_OUT interface MIDI Sound Blaster MIDI_MPU interface MIDI MPU-401 MIDI_DIGMID sample-based software wavetable player MIDI_AWE32 AWE32 (EMU8000 chip) - Vejamos como fica nossa funo com um dos valores contidos nas tabelas:
isalsudDG_UOEE,IIATDTC,UL; ntl_on(IIATDTCMD_UOEETNL)

- Vamos ver como carregar e executar arquivos do tipo Wave com o Allegro. Primeiramente, devemos ter um arquivo de som compatvel com o Allegro. Os arquivos Wave podem ter at 16 bits, e devem ser carregados em ponteiros do tipo Sample. - Vamos criar um ponteiro do tipo S M L onde ser carregado o nosso arquivo de som. Este ponteiro recebe uma funo que APE indica o caminho do arquivo, l a _ a ( . odwv)
SML *o =la_a(c\smwv) APE sm odwv":\o.a";

- Para executar este som, vamos utilizar a funo p a _ a p e ) que recebe como parmetro o ponteiro criado acima, o lysml(, volume(0 255), o balano(0 a 255), a frequncia(que tem vrias configuraes, por exemplo 1000 que utiliza a mesma frequncia que o arquivo foi gravado) e loop(0:sem loop, 1: loop infinito).
pa_apesm259,000; lysml(o,5,010,)

- Para parar de tocar um sample, utiliza-se a funo:


so_apesm; tpsml(o)

- Onde s m o ponteiro carregado com o som. o - Vamos agora carregar e executar um arquivo no formato Midi. A execuo de Midi mais simples que a de um Sample, pois tem uma outra finalidade que consistem apenas em executar o arquivo com loop infinito, ou execut-lo apenas uma vez at que chegue ao fim do arquivo. - Primeiramente, vamos criar o ponteiro onde ser carregado o contedo do nosso arquivo de som; esse ponteiro ser do tipo M D , vamos cham-lo de m d Para carregar o arquivo de som, utilizaremos a funo l a _ i i ) que tem como parmetro a II i. odmd(, localizao do arquivo:
MD *i =la_ii":\ud.i"; II md odmd(c\fnomd)

- Como vimos, o carregamento similiar ao de um Sample. A execuo tambm similar, porm no requer a mesma quantidade de parmetros; apenas o ponteiro do Midi, e se ele vai ter loop ou no:
pa_iimd1; lymd(i,)

- Na linha acima vemos a funo que executar o Midi at que o programa seja encerrado. Caso o segundo parmetro fosse zero, o arquivo seria executado apenas uma vez. - Para parar a execuo de um Midi, utiliza-se a funo:
so_ii) tpmd(;

- Como o Allegro s executa um Midi de cada vez, no necessrio parmetro para esta funo. Este comando far com que qualquer arquivo Midi em execuo pre imediatamente. - Vejamos agora um exemplo de utilizao de um arquivo de som:
#nld <ler.> icue algoh vltl iti0 oaie n =; vi iasas){ od mimi( i+ +; } itmi( { n an) algoii(; ler_nt) isaltmr) ntl_ie(; isalkyor(; ntl_ebad) isalsudDG_UOEETMD_UOEETNL) ntl_on(IIATDTC,IIATDTC,UL; isalitiasas10; ntl_n(mimi,0) LC_AIBEi; OKVRAL() LC_UCINiasas; OKFNTO(mimi) stclrdph3) e_oo_et(2; stgxmd(F_UOEETWNOE,4,8,,) e_f_oeGXATDTC_IDWD604000; SML *o_ =la_a(c\u.a", APE smw odwv":\pwv) *o_ =la_a(c\dw.a", sms odwv":\onwv) *o_ =la_a(c\lf.a", sma odwv":\etwv) *o_ =la_a(c\rgtwv) smf odwv":\ih.a"; MD *i =la_ii":\ud.ii) II md odmd(c\fnomd"; wie!e[E_S] { hl(kyKYEC) pa_iimd1; lymd(i,) i(e[E_] { fkyKYW) pa_ape(o_,25 18 10,0; lysml smw 5, 2, 00 ) } i(e[E_] { fkyKYA) pa_ape(o_,25 18 10,0; lysml sma 5, 2, 00 ) } i(e[E_] { fkyKYS) pa_ape(o_,25 18 10,0; lysml sms 5, 2, 00 ) } i(e[E_] { fkyKYD) pa_ape(o_,25 18 10,0; lysml smd 5, 2, 00 ) } } ; rtr 0 eun ; } EDO_AN) N_FMI(;

- A partir de agora, voc pode comear a escrever seus prprios cdigos. Sobretudo, recomendo um estudo mais aprofundado da biblioteca, pois ela ainda oferece muitos recursos no explorados neste tutorial. Recomendo ainda um estudo aprofundado na linguagem C++, pois essencial para a programao de jogos profissionais. Daqui para frente com voc; boa sorte e bons estudos. Agradecimentos: Agradeo imensamente a rodrigozk, que pacientemente me ajudou a escrever este tutorial, mostrando-se interessado em melhorar a qualidade do material de referncia na lingua portuguesa. Agradeo tambm a gamemasterbr, e outros usurios do frum da UniDev, pois alguns dos temas abordados neste tutorial foram complementados com definies discutidas no frum relacionado a Allegro. Links Relacionados:

Allegro Oficial [ingls] Allegro.cc [ingls] Manual Allegro Vivace [ingls] As Funes do Allegro da UFRJ [portugus] UniDev.Com.Br [portugus]