260 likes | 442 Views
Biblioteca Allegro. Monitoria de Introdução à computação – if669ec Thais Alves de Souza Melo - tasm 2011.2. Instalação. Code :: Blocks do site da disciplina já o possui instalado Guia para instalação manual: http://wiki.allegro.cc/index.php?title=Code:: Blocks
E N D
Biblioteca Allegro Monitoria de Introdução à computação – if669ec Thais Alves de Souza Melo - tasm 2011.2
Instalação • Code::Blocks do site da disciplina já o possui instalado • Guia para instalação manual: http://wiki.allegro.cc/index.php?title=Code::Blocks • Instalação facilitada: http://www.unidev.com.br/phpbb3/viewtopic.php?f=11&t=45265
Init( ) • intallegro_init(); • Inicializa o Allegro, devendoserchamada antes de qualqueroutrafunção da biblioteca. • intinstall_timer(); • intinstall_keyboard(); • intinstall_mouse(); • Funçõesqueinstalam, respectivamente, o temporizador, teclado e mouse. • intinstall_sound(intdigi_card, intmidi_card, char *cfg_path); • Nãovemporpadrão no init() ;. Ativa o som no Allegro. • Digi_card e midi_cardreferem-se aoscontroladores de som digital e MIDI, respectivamente. Passá-los comoDIGI_AUTODETECT e MIDI_AUTODETECT paraque o allegro selecione o driver. • O parâmetrocfg_pathrefere-se à compatibilidade com versõesanteriores, e podeserignoradopassando-se NULL.
Init( ) • voidset_color_depth(int depth); • Determina a quantidade de bits a serem utilizados pelos gráficos (depth). Posem ser: • 8 (256 cores) • 15 (32768 cores) • 16 (65536 cores) • 24 (aproximadamente 32 milhões de cores) • 32 (aproximadamente 4 bilhões de cores) • intset_gfx_mode(int card, int w, int h, intv_w, intv_h); • Inicializa o modográfico. Card representa o driver gráfico a serutilizado(ex.: GFX_AUTODETECT, paraque o Allegro detecteautomaticamente a placa de video), w e h representam o tamanho horizontal e vertical em pixels da tela. v_w e v_hindicam a resolução de umapossíveltela virtual.
Deinit( ) • voidallegro_exit(); • Utilizada ao final do programa para finalizar o Allegro. Não precisa ser necessariamente chamada, pois allegro_init determina que ela seja chamada automaticamente quando o programa é encerrado.
Alguns Tipos Definidos • BITMAP • Tipo definido pelo Allegro para manipular facilmente bitmaps, que seriam matrizes de pixels, em que cada elemento indica uma cor. • Declaração: BITMAP *nome ; • O allegro define automaticamente um BITMAP screen, referente à tela. • PALLETE • Vetor de 256 posições em que cada uma representa um código de cor. • Declaração: PALLETE nome ;
Alguns Tipos Definidos • FONT • Contém a descrição das fontes que podem ser utilizadas na tela • Declaração: FONT *nome ; • MIDI • Declaração: MIDI *nome ; • SAMPLE • Declaração: SAMPLE *nome ; • Os tipos FONT e PALLETE não serão utilizados.
Teclado • O Allegro trabalha com um vetor key[] de 127 posições, cujos elementos representam as teclas. Para facilitar, são definidas constantes que facilitam a busca de um elemento no vetor: • Exemplo: key[KEY_ESC]
Exemplos • while(!key[KEY_ESC]){ ... } • if(key[KEY_ENTER]) { ... } Executará o código enquanto ESC Não estiver pressionado. Entrará no if apenas se ENTER estiver Pressionado
Texto • voidtextout_ex(BITMAP *bmp, const FONT *f, const char *s, int x, int y, int color, intbg); • Imprime uma stringna tela na posição x, y. Color refere-se a cor do texto e bg a cor do fundo do texto. • voidtextprintf_ex(BITMAP *bmp, const FONT *f, int x, int y, int color, intbg, const char *fmt, ...); • Imprime uma string na tela de forma parecida à printf(), permitindo a passagem de parâmetros como %d, %c etc.. • intmakecol(int r, int g, int b); • Converte cores do formato RGB para o formato aceito pelas funções. • Obs1.: 0 equivale a cor preta e -1 ou makecol(255, 0, 255) à transparente. • Obs2.: Passar o parâmetro FONT como “font” (sem aspas) para utilizar a fonte própria do sistema. • Obs3.: Ambas possuem variantes que imprimem o texto centralizado, justificado ou alinhado à direita.
Primitivas de Imagem • int getpixel(BITMAP *bmp, int x, int y); • Lê um o pixel da coordenada (x, y) de um BITMAP. • intgetr(int c); • intgetg(int c); • intgetb(int c); • Retornam respectivamente os valores de R, G e B de um determinado pixel (pego pelo getpixel()). • voidputpixel(BITMAP *bmp, int x, int y, int color); • void line(BITMAP *bmp, int x1, int y1, int x2, int y2, int color); • voidtriangle(BITMAP *bmp, int x1, y1, x2, y2, x3, y3, int color); • voidrect(BITMAP *bmp, int x1, int y1, int x2, int y2, int color); • voidcircle(BITMAP *bmp, int x, int y, intradius, int color);
Carregando imagens • BITMAP *create_bitmap(int width, int height); • Cria um bitmap de memória do tamanhoespecificado. • BITMAP *load_bitmap(const char *filename, RGB *pal); • Carrega um arquivo bitmap do disco. RGB* pal refere-se à paleta de cores, aplicadaapenas a imagens de 8 bits. Passarcomo NULL. • voiddestroy_bitmap (BITMAP *bitmap); • Libera a memória utilizada por um bitmap. • voidclear_bitmap(BITMAP *bitmap); • Limpa um bitmap para a cor preta. • void clear_to_color(BITMAP *bitmap, intcolor); • Análogaàcima, porém com a escolha da corpara a qualserálimpo o bitmap. • Obs.: Não é necessário utilizar a função create_bitmapantes da load_bitmap!
Blitting e Sprites • voidblit(BITMAP *source, BITMAP *dest, intsource_x, intsource_y, intdest_x, intdest_y, intwidth, intheight); • Copia uma área retangular (width x height) do bitmap de fonte (source) em um bitmap de destino (dest). Não aceita o rosa puro como transparante. • voiddraw_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y); • Copia o bitmap de origem (sprite) diretamente no bitmap de destino (bmp). Aceita o rosa puro como transparente. • Obs.: Ambas as funções acima possuem variantes que espelham, aumentam ou rotacionam as imagens.
Exemplo • ... • BITMAP* buffer, *imagem ; • buffer = create_bitmap(60, 60) ; • imagem = load_bitmap(“imagem.bmp”, NULL) ; • ... • blit(imagem, buffer, 100, 100, 0, 0, 60, 60) ; • draw_sprite(screen, buffer, 400, 300) ; • ... • destroy_bitmap(imagem) ; • destroy_bitmap(buffer) ; • ... Podemos usar o clear_bitmap() aqui, caso ainda precisemos usar os BITMAPs.
Double Buffering • Desenhar os bitmaps diretamente no screen faz e depois limpá-lo faz com que a tela “pisque” a cada troca de frame, gerando um efeito visualmente desconfortável. Para evitar esse problema, é utilizada a técnica de doublebuffering: • Cria-se um BITMAP* buffer de memória, em geral do tamanho da tela e nele são desenhados todos os elementos desejados. • O buffer é desenhado então na tela e é depois limpado, e assim sucessivamente para os outros frames. Não usar clear_bitmap na screen!
Exemplos Sem Double Buffering: Com Double Buffering: intmain(){ init(); BITMAP* buffer = create_bitmap(640, 480) ; while (!key[KEY_ESC]){ textout_centre_ex(buffer, font, "Com Double Buffering", 320, 240, makecol(255, 255, 255), 0); draw_sprite(screen, buffer, 0, 0) ; clear_bitmap(buffer) ; } deinit(); return 0; } END_OF_MAIN() intmain(){ init(); while (!key[KEY_ESC]){ textout_centre_ex(screen, font, "Sem Double Buffering", 320, 240, makecol(255, 255, 255), 0); clear_bitmap(screen) ; } deinit(); return 0; } END_OF_MAIN()
Som – MIDI • MIDI *load_midi(const char *filename); • Carrega um arquivo MIDI. • voiddestroy_midi(MIDI *midi); • Libera a memória do arquivo carregado. • intplay_midi(MIDI *midi, int loop); • Toca o arquivo MIDI indicado, parando a execução de qualquer outro MIDI. Se loop receberqualquer valor diferente de 0, tocaráatéserparadoousubstituído. • voidstop_midi(); • Pára qualquer MIDI que esteja sendo executada (funciona de maneira semelhante à play_midi(NULL, false) ;)
Som – Sample • SAMPLE *load_sample(const char *filename); • Carrega um SAMPLE. • voiddestroy_sample(SAMPLE *spl); • Libera a memória ocupada por um SAMPLE. • intplay_sample(const SAMPLE *spl, intvol, int pan, intfreq, int loop); • Toca um sample. Vol e pan variam de 0(min/esquerda) à 255(máx/direita). Freqindica a velocidade com que o som é executado, sendo 1000 a velocidade normal. Loop indica a quantidade de vezespararepetir um som. • voidstop_sample(const SAMPLE *spl); • Pára a execução de um sample. • Obs.: Diferente dos MIDI, podem ser executados vários SAMPLEs ao mesmo tempo.
Mouse • O mouse em allegro se comporta como um objeto, possuindo as variáveis mouse_x e mouse_yque indicam sua posição. • A variável mouse_b indica qual botão do mouse está sendo pressionado, sendo o bit 0 o botão esquerdo, o bit 1 o botão direito e o bit 2 o botão do meio. • Sintática da comparação: • If(mouse_b & 1) printf(“Botao esquerdo apertado”) ; • If(!(mouse_b & 1)) printf(“Botao esquerdo não apertado”) ; • Atenção: comparação bit a bit! (apenas um ‘&’) • voidposition_mouse(int x, int y); • Coloca o mouse na posição x e y indicada • voidshow_mouse(BITMAP *bmp); • Desenha o mouse no bitmap apontado. Para não exibir mouse, passar NULL como argumento. Obs.: Funciona apenas com o timer instalado
Temporizador • A priori, para o controle da velocidade do jogo, temos a função voidrest(unsignedint time); que faz com que o computador aguarde “time” milissegundos para executar o próximo comando. • Porém, em computadores mais lentos, isso pode prejudicar o andamento do jogo, pois os comandos seriam executados mais lentamente, o que levaria a necessidade de um rest menor ou até sua ausência para que a velocidade se mantivesse. • O uso de temporizadores resolve este problema.
Temporizador - Exemplo volatile long intcontador = 0 ; void timer_game () ; … voidtimer_game () { contador++ ; } END_OF_FUNCTION(timer_game) ; ... intmain() { ... LOCK_VARIABLE(contador) ; LOCK_FUNCTION(timer_game) ; install_int(timer_game, TBF) ; ... } Variável global! TBF = Time Between Frames
Exercício • Implementar um spaceinvaders simplificado em Allegro. Deve possuir um menu com duas opções: • Selecionando a primeira, deverá aparecer uma nave que se move na horizontal controlada pelo usuário. • Ao pressionar ESPAÇO, a nave deve atirar um projétil (velocidade constante) na direção em que está olhando. • Ao pressionar a tecla P, deve voltar ao menu inicial. • A segunda opção é a de sair do programa.
Referências • http://www.allegro.cc/ • http://www.allegro.cc/manual/ - Manual com funções das versões 4 e 5 do Allegro. • http://alleg.sourceforge.net/
Tutoriais • http://www.dcc.ufrj.br/~abdalla/allegro.html • http://www.glost.eclipse.co.uk/gfoot/vivace/ (Em Inglês) • http://equipe.nce.ufrj.br/adriano/c/apostila/allegro/docs/allegro.html