Introdução à Programação
Aula Prática
Biblioteca Allegro
Monitoria 2013.1
O que é?

Allegro é uma biblioteca gráfica Open Source escrita
em C e voltada para o desenvolvimento de jogos 2D
em C/C++

Fornece rotinas básicas necessárias ao programador
como funções de input, gráficas, som, texto,
temporizadores, etc.
Sites para aprender mais

Site oficial do Allegro:
www.allegro.cc

Tutoriais:
http://cinacademy.wikia.com/wiki/Allegro
http://www.dcc.ufrj.br/~abdalla/allegro.html
http://www.geocities.ws/weissengeist/allegro.html
Esquema básico de um Jogo
Antes do jogo começar devem ser feitas
algumas inicializações da biblioteca bem
como o carregamento das mídias do
jogo e outras variáveis
A parte principal está no game loop
onde acontece a atualização do estado
do jogo e o desenho dos frames
Quando acaba o jogo o programa sai do
loop e geralmente precisa liberar alguma
memória utilizada e/ou executar alguma
rotina de finalização
Double Buffering
Desenhar diretamente na tela do jogo
geralmente não é uma técnica eficaz.
Uma alternativa é utilizar a técnica de
double buffering
Usa-se uma tela auxiliar para montar
todo o frame e quando ele está pronto
Desenha-se a tela auxiliar na tela do
jogo e depois limpa-se a tela auxiliar
para recomeçar o processo
O eixo Y invertido...
COR
As cores são valores inteiros e são representadas no formato RGB,
podendo ser obtidas através da função int makecol(int r, int g, int b).

Ex: int cor_amarela = makecol(255, 255, 0);
O rosa puro (255, 0, 255) é utilizado como cor transparente no
allegro. Ao ser desenhado um BITMAP, todos os pixels que
estiverem nessa cor não serão desenhados.
Inicializando a biblioteca
BITMAPS
O allegro possui o tipo estruturado BITMAP que serve para manipular
imagens.

Para criar um BITMAP se usa a função:
BITMAP* create_bitmap(int width, int height);
Ex: BITMAP* buffer = create_bitmap(800, 600);

Para carregar uma imagem externa se usa:
BITMAP* load_bitmap(const char *filename, RGB *pal);
Ex: BITMAP* imagem = load_bitmap(“imagem.bmp”, NULL);

Para liberar um BITMAP se utiliza:
void destroy_bitmap(BITMAP* bitmap);
Ex: destroy_bitmap(imagem);
DESENHANDO BITMAPS
Há várias funções para desenhar BITMAPS. Eis as principais:






void draw_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y);
void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
void draw_trans_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y); *
void rotate_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);
void pivot_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int cx, int cy, fixed angle);
void stretch_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int w, int h);
DESENHANDO FIGURAS PRIMITIVAS
Além de BITMAPS é possível desenhar várias figuras geométricas
diferentes. Estas são algumas delas:










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 rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
void circle(BITMAP *bmp, int x, int y, int radius, int color);
void circlefill(BITMAP *bmp, int x, int y, int radius, int color);
void ellipse(BITMAP *bmp, int x, int y, int rx, int ry, int color);
void ellipsefill(BITMAP *bmp, int x, int y, int rx, int ry, int color);
void arc(BITMAP *bmp, int x, y, fixed ang1, ang2, int r, int color);
TECLADO
O Allegro possui um array de teclas que atualiza constantemente.
Cada posição representa o estado de uma tecla (TRUE/FALSE)

key[MAXKEY];
Para acessar uma tecla específica existem defines para cada tecla:
Ex: if( key[KEY_ENTER] )
faz_algo();
if( key[KEY_A] && !key[KEY_B] )
faz_outra_coisa();
//Se pressionar A mas sem pressionar B
Para utilizar teclas especiais usa-se a variável global ‘key_shifts’ juntamente com
algumas flags próprias para essas teclas fazendo um AND bit-a-bit:
Ex:
if (key[KEY_W])
{
if (key_shifts & KB_SHIFT_FLAG)
/* Usuário está pressionando shift + W. */
else
/* Apenas tecla W está sendo pressionada */
}
TEXTO
Para desenhar textos há duas funções principais:
void textout_ex(BITMAP *bmp, const FONT *f, const char *s, int x, int y, int color, int bg);
void textprintf_ex(BITMAP *bmp, const FONT *f, int x, int y, int color, int bg, const char *fmt, ...);
No parâmetro de fonte pode-se utilizar a variável da fonte padrão do allegro ‘font’ ou
carregar suas próprias fontes formato PCX usando as funções:
FONT *load_font(const char *filename, RGB *pal, void *param);
void destroy_font(FONT *f);
No parâmetro ‘bg’ você escolhe a cor do fundo do texto. Para um fundo transparente
se utiliza o valor -1
Ex: imprimindo uma string azul com a fonte padrão
textprintf_ex(buffer, font, 10, 20, makecol(0,0,255), -1, “Seu nome eh: %s”, nome);
SOM - MIDI
O Allegro 4 usa MIDI como formato padrão de música de fundo. Apenas 1 midi pode
ser tocado por vez. Há o tipo estruturado MIDI para a manipulação dessas músicas.
Para carregar arquivos .mid usa-se a função MIDI* load_midi(const char *filename);
Ex: MIDI* musica = load_midi(“musica.mid”);
Para liberar os midis alocados usa-se a função void destroy_midi(MIDI* midi);
Ex: destroy_midi(musica);
Para tocar, pausar, resumir ou parar um midi usa-se as funções:
int play_midi(MIDI* midi, int loop);
void midi_pause();
void midi_resume();
void stop_midi();
A variável global ‘midi_pos’ indica a posição sendo tocada no momento e é um valor negativo
quando não há midis tocando
A variável global ‘midi_time’ indica a o tempo transcorrido em segundos do midi sendo tocado
(possui valor zero quando não há midis tocando).
SOM - SAMPLE
O Allegro 4 usa WAV como formato padrão de efeitos sonoros. Vários efeitos podem
ser tocados simultaneamente. Há o tipo estruturado SAMPLE para a manipulação
desses efeitos.
Para carregar arquivos .wav usa-se a função:
SAMPLE* load_sample(const char *filename);
Ex: SAMPLE* efeito = load_sample(“efeito.wav”);
Para liberar os samples carregados usa-se a função:
void destroy_sample(SAMPLE *spl);
Ex: destroy_sample(efeito);
Para tocar um sample usa-se a função:
int play_sample(const SAMPLE* spl, int vol, int pan, int freq, int loop);
Dúvidas?
Exercício
Escreva um jogo simples de pegar objetos. O jogador controla
um boneco através das setas direcionais e deve pegar uma bola
que começará em uma posição aleatória da tela. Quando isso
ocorrer deve-se incrementar um score mostrado em tela e mover
a bola para outra posição aleatória. O jogo acaba quando o usuário pressionar a
tecla ESC.
Você também deve usar os sons fornecidos ou outros de sua preferência para
colocar uma música de fundo no jogo e um efeito sonoro ao capturar a bola.
Exercício
Para detectar a colisão entre o personagem e a bola você pode
usar a função:
int bounding_box_collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
if( (x1 > x2 + w2) || (y1 > y2 + h2) || (x2 > x1 + w1) || (y2 > y1 + h1) )
return FALSE;
else
return TRUE;
}
Os parâmetros representam a posição (x, y), a largura e altura
dos dois objetos a que se quer testar uma possível colisão
Download

Sites para aprender mais