1 / 26

Biblioteca Allegro

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

elisa
Download Presentation

Biblioteca Allegro

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Biblioteca Allegro Monitoria de Introdução à computação – if669ec Thais Alves de Souza Melo - tasm 2011.2

  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

  3. Criação do Projeto

  4. Hello World

  5. 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.

  6. 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.

  7. 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.

  8. 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 ;

  9. 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.

  10. 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]

  11. 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

  12. 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.

  13. 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);

  14. 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!

  15. 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.

  16. 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.

  17. 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!

  18. 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()

  19. 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) ;)

  20. 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.

  21. 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

  22. 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.

  23. 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

  24. 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.

  25. 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/

  26. 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

More Related