introdução ao allegro rodrigo de toledo luiz fernando estevão

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

Upload: internet

Post on 18-Apr-2015

106 views

Category:

Documents


1 download

TRANSCRIPT

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

Introdução ao Allegro

Rodrigo de Toledo

Luiz Fernando Estevão

Page 2: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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

Page 3: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Allegro – Cor

• Allegro trata as cores como um inteiroint makecol(int r, int g, int b);

p.ex: int color = r*2562 + g*256 + b

• Cada canal de cor pode variar de 0 a 255

• Exemploint green_color = makecol(0, 255, 0);

• Canal Alpha (transparência)int makeacol(int r, int g, int b, int a);

Page 4: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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)

– ...

206206206313665

13214819822223124719821423116519321415917317911612412410510910517588454388

1637119814399202125123132149148180

00255

BlueGreenRed

Page 5: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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)

Page 6: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Struct BITMAPtypedef 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;

Page 7: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Allegro – ImagemLe, escreve

• LeituraBITMAP* 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);

Page 8: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Allegro – ImagemLe, escreve

• Escritaint save_bitmap(const char *filename, BITMAP *bmp, PALLETE

*pal); – Exemplo:

save_bitmap("c:\\eu\\mengao.bmp", minha_img, NULL);

Page 9: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Allegro – Imagemcria, 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));

Page 10: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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

• }

Page 11: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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!

Page 12: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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!

Page 13: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Funções de desenho vetorial

• Linhaline(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)

– Preenchidorectfill(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írculocircle(BITMAP *bmp, int x, int y, int r, int color)circlefill(BITMAP *bmp, int x, int y, int r, int color)

• Outros:– Elipse, spline

Page 14: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Funções de cópia da imagem

• Copiando da origem (source) para destinoblit(BITMAP *source, BITMAP *dest,

int source_x, int source_y, //coordenadas iniciais na origemint dest_x, int dest_y, //coordenadas iniciais no

destinoint 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)

Page 15: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Sistema de Coordenadas

• Orientação da tela.

Page 16: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

BLIT – block transfer

• blit(img1,img2,x1,y1,x2,y2,larg,alt);

img1 img2

Page 17: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Cor Neutra

• makecol( 255, 0, 255 );

sprite1

Page 18: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

SPRITE

• clear_to_color( buffer, makecol(153, 217, 234) );

• draw_sprite( buffer, sprite1, sprite1->w, sprite1->h );

Page 19: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Máscara

+ =

• blit(img1,saida,0,0,0,0,img1->w,img1->h);• draw_sprite(saida, masc,masc->w,masc->h);

img1 masc saida

Page 20: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

BITMAP - Matriz de pixels

• int getpixel( // retorna a cor do pixelBITMAP* 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

);

Page 21: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Animação!

• Sequência de sprites

Page 22: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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.

);

Page 23: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Visualmente falando:

• x

src

dest

Page 24: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Outras Funcionalidades

– Rotação;– Inversão;– Floodfill;– Etc..

• www.allegro.cc

Page 25: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Manipulação de Imagens

Usando Allegro sem criatividade – Inicializações básicas para poder

começar a trabalhar

Page 26: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Onde baixar e como instalar

Page 27: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Cara da aplicação

int main (void){if (!inicia()){

finaliza();return -1;

}

anim();

finaliza();

return 0;};END_OF_MAIN();

Page 28: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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

Page 29: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

int inicia (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

*/

Page 30: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

set_color_depth(CORES); // CORES eh um define

// janelaif (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;};

Page 31: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

• 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

Page 32: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

void finaliza (void);

void finaliza (void){

allegro_exit();

};

Page 33: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

• Não tem muito o que inventar aqui.

• ...

Page 34: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

void inc_frame (void);

volatile int frame;

void inc_frame (void){

frame++;

}END_OF_FUNCTION(inc_frame);

Page 35: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

• 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

Page 36: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

void anim (void);

void anim (void){/* declaracoes da aplicacao */

/**/

while (!key[KEY_ESC]);

/* finalizacao da aplicacao */

/**/};

Page 37: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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.

Page 38: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Includes importantes!

• Para poder usar o Allegro

• include<allegro.h>

• Para poder usar strings

• include<string.h>

Page 39: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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 *.dll’s junto da aplicação– alleg42.dll– alld42.dll– allp42.dll– Ou relativo a versão utilizada!

Page 40: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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.

Page 41: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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;/**/

Page 42: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

while (!key[KEY_ESC]){if(frame > 0){

/* contadores de animacao */frame = 0;/**/

/* rotinas de funcionalidade*/

if(k_bt(KEY_A)){// faca algo

}

/**/

Page 43: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

/* 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);/**/

}}

Page 44: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

/* finalizando a aplicacao */

remove_int(inc_frame);

destroy_bitmap(buffer);

destroy_bitmap(trans_buffer);

/**/

};

Page 45: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

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

Page 46: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Teste de botão de mouse

bool m_bt(const int &b){

return (mouse_b & b);

};

Page 47: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

• m_bt(1)

• mouse_b & 1

Page 48: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

Teste de botão do teclado

bool k_bt(const int &k){if(key[k]){

while(keypressed()){clear_keybuf();

}return true;

}return false;

};

Page 49: Introdução ao Allegro Rodrigo de Toledo Luiz Fernando Estevão

• k_bt(KEY_A);

• key[KEY_A];