A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão.

Apresentações semelhantes


Apresentação em tema: "Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão."— Transcrição da apresentação:

1 Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

2 Allegro Cor Bitmap –Le, escreve, cria, destrói e limpa Funções pixel a pixel Funções de desenho vetorial –Linha, reta, triângulo, círculo Funções de cópia da imagem Funções de resize da imagem Links úteis: –http://www.allegro.cc –http://www.dcc.ufrj.br/~abdalla/tut_arq/imagens.htm –http://www.allegro.cc/manual/ Inicializações

3 Allegro – Cor Allegro trata as cores como um inteiro int makecol(int r, int g, int b);makecol p.ex: int color = r* g*256 + b Cada canal de cor pode variar de 0 a 255 Exemplo int green_color = makecol(0, 255, 0);makecol Canal Alpha (transparência) int makeacol(int r, int g, int b, int a);makeacol

4 Allegro – Pallete O conceito de palheta de cores se aplica a imagens com limitação de cores (ex: 256 cores) Em allegro existe o tipo pallete PALETTE palette; Existem comandos específicos para pallete: –set_color (para alterar uma entrada) –get_color (para consultar uma entrada) – BlueGreenRed

5 Allegro – Imagem Em allegro há um tipo específico para imagem: BITMAP Exemplo: BITMAP *img1, *img2; Informações sobre a imagem: –Tamanho: img1->w; //width, largura da imagem img1->h; //heigth, altura da imagem –Outras: Em geral para uso interno nas funções de manipulação. (p.ex.: ponteiros para área de memória)

6 Struct BITMAP typedef struct BITMAP { /* a bitmap structure */ int w, h; /* width and height in pixels */ int clip; /* flag if clipping is turned on */ int cl, cr, ct, cb; /* clip left, right, top and bottom values */ GFX_VTABLE *vtable; /* drawing functions */ void *write_bank; /* C func on some machines, asm on i386 */ void *read_bank; /* C func on some machines, asm on i386 */ void *dat; /* the memory we allocated for the bitmap */ unsigned long id; /* for identifying sub-bitmaps */ void *extra; /* points to a structure with more info */ int x_ofs; /* horizontal offset (for sub-bitmaps) */ int y_ofs; /* vertical offset (for sub-bitmaps) */ int seg; /* bitmap segment */ ZERO_SIZE_ARRAY(unsigned char *, line); } BITMAP;

7 Allegro – Imagem Le, escreve Leitura BITMAP* load_bitmap(const char *filename, PALLETE *pal); –Caso a imagem seja 24/32 bits (ou seja, sem pallete) ou se queira ignorar essa informação, é possivel ignorar o parâmetro. –Tipos aceitos: *.bmp, *.pcx, *.tga, *.lbm –Existem bibliotecas para incluir também: *.png (loadpng.h) *.jpeg (jpgalleg.h) –Exemplo: minha_img = load_bitmap(flamengo.bmp",NULL);

8 Allegro – Imagem Le, escreve Escrita int save_bitmap(const char *filename, BITMAP *bmp, PALLETE *pal); –Exemplo: save_bitmap("c:\\eu\\mengao.bmp", minha_img, NULL);

9 Allegro – Imagem cria, destrói e limpa Para criar uma imagem nova: BITMAP* create_bitmap(int width, int height) Apagando definitivamente uma imagem de memória: destroy_bitmap(BITMAP *bitmap) –Importante para não ocupar memória com lixo Existem dois comandos para limpar a imagem –Com preto: clear(BITMAP *bitmap) –Com uma determinada cor: clear_to_color(BITMAP *bitmap, int color) –Exemplo: clear_to_color(bmp, makecol(255, 0, 0));

10 Boas práticas! - 1 Assim como funções tipo malloc(): –Após criar ou carregar um BITMAP* deve-se verificar o sucesso ou fracasso na operação: BITMAP* img = create_bitmap(100,100); if(img == NULL){ –printf(Erro ao criar BITMAP!\n); –exit(-21); }

11 Boas práticas! - 2 Ao destruir um ponteiro: –Após destruir um BITMAP* ele continua apontando lixo: BITMAP* img = create_bitmap(100,100);... destroy_bitmap(img); img = NULL; –Importante: Ao sair do escopo, todas as variáveis locais são destruídas!

12 Problemas: Problemas de alias: –BITMAP* img1 = create_bitmap(100,100); –BITMAP* alias = img1; –destroy_bitmap(alias); –clear(img1); // fault! Saiba quando é uma cópia e quando é um alias!

13 Funções de desenho vetorial Linha line(BITMAP *bmp, int x1, int y1, int x2, int y2, int color) Retângulo –Apenas borda rect(BITMAP *bmp, int x1, int y1, int x2, int y2, int color) –Preenchido rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color) Triângulo (sempre preenchido) triangle(BITMAP *bmp, int x1, int y1, int x2, int y2, int x3, int y3, int color) Círculo circle(BITMAP *bmp, int x, int y, int r, int color) circlefill(BITMAP *bmp, int x, int y, int r, int color) Outros: –Elipse, spline

14 Funções de cópia da imagem Copiando da origem (source) para destino blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, //coordenadas iniciais na origem int dest_x, int dest_y, //coordenadas iniciais no destino int width, int height) //dimensões do retângulo a ser copiado –Pode-se copiar parcialmente uma imagem –Cuidado com os limites de tamanho A função blit irá jogar fora (não gera exceção) Copiando como sprite: draw_sprite(BITMAP *dest, BITMAP *source, int x, int y)

15 Sistema de Coordenadas Orientação da tela.

16 BLIT – block transfer blit(img1,img2,x1,y1,x2,y2,larg,alt); img1 img2

17 Cor Neutra makecol( 255, 0, 255 ); sprite1

18 SPRITE clear_to_color( buffer, makecol(153, 217, 234) ); draw_sprite( buffer, sprite1, sprite1->w, sprite1->h );

19 Máscara + = blit(img1,saida,0,0,0,0,img1->w,img1->h); draw_sprite(saida, masc,masc->w,masc->h); img1masc saida

20 BITMAP - Matriz de pixels int getpixel(// retorna a cor do pixel BITMAP* bmp,// ponteiro para a imagem int x, int y// posição do pixel ); void putpixel(// apenas altera a matriz BITMAP* bmp,// ponteiro para a imagem int x int y,// posição do pixel int cor// valor a ser colocado );

21 Animação! Sequência de sprites

22 Resize int stretch_blit( –BITMAP* src, BITMAP* dest, –int x1, int y1,// início na fonte –int larg1, int alt1,// dimensões do bloco fonte –int x2, int y2,// início no destino –int larg2, int alt2// dimensões do bloco dest. );

23 Visualmente falando: x src dest

24 Outras Funcionalidades –Rotação; –Inversão; –Floodfill; –Etc..

25 Manipulação de Imagens Usando Allegro sem criatividade – Inicializações básicas para poder começar a trabalhar

26 Onde baixar e como instalar

27 Cara da aplicação int main (void){ if (!inicia()){ finaliza(); return -1; } anim(); finaliza(); return 0; }; END_OF_MAIN();

28 Este é um esqueleto padrão usado. –Pode-se usar de muitas formas, mas esta é bem elegante e organizada. Joga toda a dificuldade para fora do padrão de inicializações. Esse esqueleto será disponibilizado.

29 intinicia (void); int inicia (void){ allegro_init(); install_keyboard(); install_mouse(); install_timer(); /*if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) < 0){ return FALSE; } // permite usar sons e musicas */

30 set_color_depth(CORES); // CORES eh um define // janela if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, RESOL_X, RESOL_Y, 0, 0) < 0){ // tela cheia //if (set_gfx_mode(GFX_AUTODETECT, RESOL_X, RESOL_Y, 0, 0) < 0){ return FALSE; } if (CORES == 32){ set_alpha_blender(); // permite semi-transparencia } return TRUE; };

31 CORES é definido fora –Aplicação com maior velocidade menor nível de cores ( 8 ou 16 ) –Aplicação com maior qualidade Maior nível de cores ( 24 ou 32 ) Aplicação pode ser em tela cheia ou em janela Aplicação pode ter sons e músicas –Usado em animações e jogos

32 void finaliza (void); void finaliza (void){ allegro_exit(); };

33 Não tem muito o que inventar aqui....

34 void inc_frame (void); volatile intframe; void inc_frame (void){ frame++; }END_OF_FUNCTION(inc_frame);

35 Serve apenas para animações. –Se não for para animar, não é necessário Como o foco está em manipulação de imagem não é necessário aprofundar isso

36 void anim (void); void anim (void){ /* declaracoes da aplicacao */ /**/ while (!key[KEY_ESC]); /* finalizacao da aplicacao */ /**/ };

37 Abobora Aqui fica toda a graça! –Comandos e ações são inseridos aqui O comando no meio está para impedir que o programa rode e feche direto. –Para encerrar o programa basta pressionar ESC –As imagens geradas podem ser visualizadas na própria aplicação.

38 Includes importantes! Para poder usar o Allegro include Para poder usar strings include

39 Compilando gcc -o saida.exe main.cpp -Wall -lalleg g++ -o saida.exe main.cpp -Wall -lalleg Importante que o path esteja definido! Colocar as *.dlls junto da aplicação –alleg42.dll –alld42.dll –allp42.dll –Ou relativo a versão utilizada!

40 Além da manipulação pura O Allegro permite animações e não apenas manipulação de imagens estáticas. A cara do anim() muda bastante quando for fazer uma animação.

41 void anim (void); - com animação BITMAP*buffer, *trans_buffer; void anim (void){ /* -consideracoes iniciais- */ srand((time(NULL))); buffer = create_bitmap(screen->w,screen->h); trans_buffer = create_bitmap(screen->w,screen->h); /**/ /* declarando contador de atualizacao */ LOCK_VARIABLE(frame); LOCK_FUNCTION(inc_frame); install_int(inc_frame, FRAME); frame = 1; /**/

42 while (!key[KEY_ESC]){ if(frame > 0){ /* contadores de animacao */ frame = 0; /**/ /* rotinas de funcionalidade*/ if(k_bt(KEY_A)){ // faca algo } /**/

43 /* rotinas de limpeza (refresh) */ clear_to_color(buffer,PRET); clear_to_color(trans_buffer,MAGE); /**/ /* desenhando no buffer */ /**/ /* atualizando na tela */ draw_trans_sprite(buffer,trans_buffer,0,0); show_mouse(buffer); blit(buffer,screen,0,0,0,0,buffer->w,buffer->h); show_mouse(NULL); /**/ }

44 /* finalizando a aplicacao */ remove_int(inc_frame); destroy_bitmap(buffer); destroy_bitmap(trans_buffer); /**/ };

45 Funções Extras Informações necessárias para interação –Entrada do mouse –Entrada do teclado Permitem liberdade e usos pouco comuns As funções dadas são meio confusas e pouco mnemônicas Criação de funções mais fáceis de compreender e utilizar

46 Teste de botão de mouse bool m_bt(const int &b){ return (mouse_b & b); };

47 m_bt(1) mouse_b & 1

48 Teste de botão do teclado bool k_bt(const int &k){ if(key[k]){ while(keypressed()){ clear_keybuf(); } return true; } return false; };

49 k_bt(KEY_A); key[KEY_A];


Carregar ppt "Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão."

Apresentações semelhantes


Anúncios Google