Sei sulla pagina 1di 26

Biblioteca Allegro

Monitoria de Introduo computao if669ec Thais Alves de Souza Melo - tasm 2011.2

Instalao
Code::Blocks do site da disciplina j o possui instalado Guia para instalao manual: http://wiki.allegro.cc/index.php?title=Code::Blocks Instalao facilitada: http://www.unidev.com.br/phpbb3/viewtopic.php?f=11&t=45 265

Criao do Projeto

Hello World

Init( )
int allegro_init();
Inicializa o Allegro, devendo ser chamada antes de qualquer outra funo da biblioteca.

int install_timer(); int install_keyboard(); int install_mouse();


Funes que instalam, respectivamente, o temporizador, teclado e mouse.

int install_sound(int digi_card, int midi_card, char *cfg_path);


No vem por padro no init() ;. Ativa o som no Allegro. Digi_card e midi_card referem-se aos controladores de som digital e MIDI, respectivamente. Pass-los como DIGI_AUTODETECT e MIDI_AUTODETECT para que o allegro selecione o driver. O parmetro cfg_path refere-se compatibilidade com verses anteriores, e pode ser ignorado passando-se NULL.

Init( )
void set_color_depth(int depth);
Determina a quantidade de bits a serem utilizados pelos grficos (depth). Posem ser:
8 (256 cores) 15 (32768 cores) 16 (65536 cores) 24 (aproximadamente 32 milhes de cores) 32 (aproximadamente 4 bilhes de cores)

int set_gfx_mode(int card, int w, int h, int v_w, int v_h);


Inicializa o modo grfico. Card representa o driver grfico a ser utilizado (ex.: GFX_AUTODETECT, para que o Allegro detecte automaticamente a placa de video), w e h representam o tamanho horizontal e vertical em pixels da tela. v_w e v_h indicam a resoluo de uma possvel tela virtual.

Deinit( )
void allegro_exit();
Utilizada ao final do programa para finalizar o Allegro. No 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. Declarao: BITMAP *nome ; O allegro define automaticamente um BITMAP screen, referente tela.

PALLETE
Vetor de 256 posies em que cada uma representa um cdigo de cor. Declarao: PALLETE nome ;

Alguns Tipos Definidos


FONT
Contm a descrio das fontes que podem ser utilizadas na tela Declarao: FONT *nome ;

MIDI
Declarao: MIDI *nome ;

SAMPLE
Declarao: SAMPLE *nome ;

Os tipos FONT e PALLETE no sero utilizados.

Teclado
O Allegro trabalha com um vetor key[] de 127 posies, cujos elementos representam as teclas. Para facilitar, so definidas constantes que facilitam a busca de um elemento no vetor: Exemplo: key[KEY_ESC]
Tecla A, B ... Z Cdigo na Array KEY_A, KEY_B...KEY_Z KEY_0_PAD Teclado Numrico 0 a 9 ... KEY_9_PAD Teclado Normal 0 a 9 KEY_0 ... KEY_9 Esc KEY_ESC Enter KEY_ENTER Seta para a Direita KEY_RIGHT Seta para a Esquerda KEY_LEFT Seta para Cima KEY_UP Seta para Baixo KEY_DOWN Tecla Pause Barra de Espao Print Screen Shitf Esquerdo Shift Direito Control Esquerdo Control Direito Alt esquerdo Alt Direito Cdigo na Array KEY_PAUSE KEY_SPACE KEY_PRTSCR KEY_LSHIFT KEY_RSHIFT KEY_LCONTROL KEY_RCONTROL KEY_ALT KEY_ALTGR

Exemplos
while(!key[KEY_ESC]) {
... }
Executar o cdigo enquanto ESC No estiver pressionado.

if(key[KEY_ENTER]) {
... }

Entrar no if apenas se ENTER estiver Pressionado

Texto
void textout_ex(BITMAP *bmp, const FONT *f, const char *s, int x, int y, int color, int bg);
Imprime uma string na tela na posio x, y. Color refere-se a cor do texto e bg a cor do fundo do texto.

void textprintf_ex(BITMAP *bmp, const FONT *f, int x, int y, int color, int bg, const char *fmt, ...);
Imprime uma string na tela de forma parecida printf(), permitindo a passagem de parmetros como %d, %c etc..

int makecol(int r, int g, int b);


Converte cores do formato RGB para o formato aceito pelas funes.

Obs1.: 0 equivale a cor preta e -1 ou makecol(255, 0, 255) transparente. Obs2.: Passar o parmetro FONT como font (sem aspas) para utilizar a fonte prpria 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.

int getr(int c); int getg(int c); int getb(int c);


Retornam respectivamente os valores de R, G e B de um determinado pixel (pego pelo getpixel()).

void putpixel(BITMAP *bmp, int x, int y, int color); void line(BITMAP *bmp, int x1, int y1, int x2, int y2, int color); void triangle(BITMAP *bmp, int x1, y1, x2, y2, x3, y3, int color); void rect(BITMAP *bmp, int x1, int y1, int x2, int y2, int color); void circle(BITMAP *bmp, int x, int y, int radius, int color);

Carregando imagens
BITMAP *create_bitmap(int width, int height);
Cria um bitmap de memria do tamanho especificado.

BITMAP *load_bitmap(const char *filename, RGB *pal);


Carrega um arquivo bitmap do disco. RGB* pal refere-se paleta de cores, aplicada apenas a imagens de 8 bits. Passar como NULL.

void destroy_bitmap (BITMAP *bitmap);


Libera a memria utilizada por um bitmap.

void clear_bitmap(BITMAP *bitmap);


Limpa um bitmap para a cor preta.

void clear_to_color(BITMAP *bitmap, int color);


Anloga cima, porm com a escolha da cor para a qual ser limpo o bitmap.

Obs.: No necessrio utilizar a funo create_bitmap antes da load_bitmap!

Blitting e Sprites
void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
Copia uma rea retangular (width x height) do bitmap de fonte (source) em um bitmap de destino (dest). No aceita o rosa puro como transparante.

void draw_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 funes 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) ; ... Podemos usar o clear_bitmap() destroy_bitmap(imagem) ; aqui, caso ainda precisemos usar destroy_bitmap(buffer) ; 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 desconfortvel. Para evitar esse problema, utilizada a tcnica de double buffering:
Cria-se um BITMAP* buffer de memria, em geral do tamanho da tela e nele so desenhados todos os elementos desejados. O buffer desenhado ento na tela e depois limpado, e assim sucessivamente para os outros frames. No usar clear_bitmap na screen!

Exemplos
Sem Double Buffering:
int main(){ 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()

Com Double Buffering:


int main(){ 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()

Som MIDI
MIDI *load_midi(const char *filename);
Carrega um arquivo MIDI.

void destroy_midi(MIDI *midi);


Libera a memria do arquivo carregado.

int play_midi(MIDI *midi, int loop);


Toca o arquivo MIDI indicado, parando a execuo de qualquer outro MIDI. Se loop receber qualquer valor diferente de 0, tocar at ser parado ou substitudo.

void stop_midi();
Pra 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.

void destroy_sample(SAMPLE *spl);


Libera a memria ocupada por um SAMPLE.

int play_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop);
Toca um sample. Vol e pan variam de 0(min/esquerda) 255(mx/direita). Freq indica a velocidade com que o som executado, sendo 1000 a velocidade normal. Loop indica a quantidade de vezes para repetir um som.

void stop_sample(const SAMPLE *spl);


Pra a execuo de um sample.

Obs.: Diferente dos MIDI, podem ser executados vrios SAMPLEs ao mesmo tempo.

Mouse
O mouse em allegro se comporta como um objeto, possuindo as variveis mouse_x e mouse_y que indicam sua posio. A varivel mouse_b indica qual boto do mouse est sendo pressionado, sendo o bit 0 o boto esquerdo, o bit 1 o boto direito e o bit 2 o boto do meio.
Sinttica da comparao:
If(mouse_b & 1) printf(Botao esquerdo apertado) ; If(!(mouse_b & 1)) printf(Botao esquerdo no apertado) ;
Ateno: comparao bit a bit! (apenas um &)

void position_mouse(int x, int y);


Coloca o mouse na posio x e y indicada

void show_mouse(BITMAP *bmp);


Desenha o mouse no bitmap apontado. Para no 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 funo void rest(unsigned int time); que faz com que o computador aguarde time milissegundos para executar o prximo comando. Porm, 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 ausncia para que a velocidade se mantivesse. O uso de temporizadores resolve este problema.

Temporizador - Exemplo
volatile long int contador = 0 ; void timer_game () ; void timer_game () { contador++ ; } END_OF_FUNCTION(timer_game) ; ... int main() {
... LOCK_VARIABLE(contador) ; LOCK_FUNCTION(timer_game) ; install_int (timer_game, TBF) ; ...

Varivel global!

TBF = Time Between Frames

Exerccio
Implementar um space invaders simplificado em Allegro. Deve possuir um menu com duas opes:
Selecionando a primeira, dever aparecer uma nave que se move na horizontal controlada pelo usurio.
Ao pressionar ESPAO, a nave deve atirar um projtil (velocidade constante) na direo em que est olhando. Ao pressionar a tecla P, deve voltar ao menu inicial.

A segunda opo a de sair do programa.

Referncias
http://www.allegro.cc/
http://www.allegro.cc/manual/ - Manual com funes das verses 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 Ingls) http://equipe.nce.ufrj.br/adriano/c/apostila/allegro/docs/alle gro.html

Potrebbero piacerti anche