Ana Queiroga (aicmq)
André Guedes (agl)
Bruno Batista (bamb)
Bruno Lins (bfol)
A Biblioteca Allegro
Biblioteca para construção de jogos e
aplicações multimídia em geral
Free Source
Voltada mais especialmente para jogos 2D
Conhecida pela facilidade de adicionar
entrada de dados via teclado, mouse e
joystick
Grande comunidade de desenvolvedores
Características
Multi-plataforma
DOS
Windows
Linux
Mac (OS X)
BeOS
QNX
Primitivas Gráficas
Rectas, círculos, elipses
Polígonos (sólidos, texturados, transparentes)
Texto em modo gráfico
Animações
Características (cont.)
Gere mouse, teclado, joystick
Suporta arquivos de configuração e de dados
comprimidos
Temporizadores
Usando Allegro
Incluir <allegro.h> depois de todos os
demais includes
Deve sempre aparecer uma chamada à
função allegro_init() o mais perto
possível do início do programa.
Da mesma forma devem ser chamadas, a
seguir, as funções install_keyboard(),
install_mouse() e install_timer().
Nota: as funções normais do C para teclado
não irão mais funcionar.
Usando Allegro
A função allegro_exit() deve ser
chamada no final do programa.
Colocar a macro END_OF_MAIN() logo
após a chave final da rotina main()
Ao compilar, incluir a biblioteca alleg:
gcc -o test test.c –lalleg
Especificar Modo Gráfico
Especificado antes de começar a desenhar:
int set_gfx_mode (int card, int w, int h, int v_w, int v_h);
Onde:
card é usualmente GFX_AUTODETECT,
GFX_AUTODETECT_FULLSCREEN ou
GFX_AUTODETECT_WINDOWED
w , h largura e altura
v_w , v_h largura e altura virtual (normalmente,
0)
Desenhar Objectos – BITMAP’s
Bitmaps são matrizes de pixels, em que cada
valor indica uma cor
Desenho se dá sobre estruturas chamadas
BITMAPs
Tela é um BITMAP especial chamado screen
BITMAPs adicionais podem ser criados com:
BITMAP *bmp = create_bitmap(int
width, int height);
Chamado antes de set_gfx_mode
Desenhar Objectos – BITMAP’s
vectores X e Y, estão posicionados da maneira diferente
ando comparamos os planos, desta forma, quando
senharmos a linha, devemos ter em mente a direcção do traço.
Desenhar Objectos – BITMAP’s
Alguns exemplos de rotinas gráficas simples:
void putpixel (BITMAP *bmp, int x, int y, int color);
void vline(BITMAP *bmp, int x, int y1, int y2, int color);
void hline(BITMAP *bmp, int x1, int y, int x2, 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);
Cores
Modelo depende do modo gráfico sendo o
default 8 (256 cores).
Cada cor é expressa com três números, cada
um numa escala de 0 a 63 (intensidade)
Para armazenar cores no Allegro:
typedef struct RGB {
unsigned char r, g, b;
} RGB;
Cores
A cor azul é formada através da RGB [0,0,255]
Animação
Dar a impressão de que coisas se movem
Pode significar mover um pixel ao longo da
tela mas, geralmente, significa uma mudança
repetitiva da apresentação de algo para que
dê a ideia de que se move.
Qual a técnica mais simples?
limpamos a tela, desenhamos os objectos,
limpamos a tela novamente, desenhamos os
objectos nas novas posições
Animação
Qual o problema desta técnica?
Instante 1
Instante 2: Limpar a tela
Instante 3
Efeito Flicker - efeito de cintilação ou vibração de uma
imagem na tela do computador
Animação
Qual a solução?
Double Buffering
Buffer
Instante 1 Instante 2: Limpar a tela
Instante 3
Instante 1
Instante 3
Tela
Instante 2
Periféricos de Entrada - Teclado
Teclado
install_keyboard()
/* Para inicializar
as rotinas do
teclado */
Váriável global int key[]
permite ver quais teclas
estão pressionadas.
constantes definidas para
identificar cada tecla
Tecla
Código na Array
A, B ... Z
KEY_A, KEY_B...KEY_Z
Teclado Numérico 0 a 9
KEY_0_PAD ... 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
Pause
KEY_PAUSE
Barra de Espaço
KEY_SPACE
Print Screen
KEY_PRTSCR
Shitf Esquerdo
KEY_LSHIFT
Shift Direito
KEY_RSHIFT
Control Esquerdo
KEY_LCONTROL
Control Direito
KEY_RCONTROL
Alt esquerdo
KEY_ALT
Alt Direito
KEY_ALTGR
Periféricos de Entrada - Teclado
Mover coisas na tela:
void processa_teclado(int* x, int* y) {
if (key[KEY_UP]) {
*y = *y - 1;
} else if (key[KEY_DOWN]){
*y = *y + 1;
} else if (key[KEY_RIGHT]){
*x = *x + 1;
} else if (key[KEY_LEFT]){
*x = *x - 1;
}
}
Periféricos de Entrada - Mouse
install_mouse() /* Para inicializar as rotinas do
mouse */
Retorna -1 em caso de falha ou o número de botões que o mouse
tem em caso de sucesso
Usa-se a função show_mouse para que o cursor do mouse
seja mostrado no bitmap especificado
Passando NULL como parâmetro esconde o cursor do mouse
Deve-se ter cuidado ao desenhar algo na tela pois o cursor
do mouse pode passar por cima e estragar o desenho, por
isso é sempre bom escondê-lo antes de desenhar qualquer
coisa
show_mouse(screen); /* mostra o mouse na
tela */
show_mouse(NULL);
/* esconde o mouse */
Periféricos de Entrada - Mouse
As variáveis mouse_x e mouse_y contêm a
posição do cursor do mouse na tela.
A variável mouse_b contém o estado dos
botões.
(mouse_b & 1) é verdadeiro se o botão
esquerdo estiver pressionado.
(mouse_b & 2) é verdadeiro se o botão
direito estiver pressionado.
Som
Som digital: WAV. Música: MID.
Antes de se tocar um som digital ou música deve-se
carregá-los da seguinte forma:
/* declaração das variáveis que guardarão sons e músicas */
SAMPLE *som1;
/* SAMPLE = arquivos de som digital */
MIDI *musica;
/* MIDI = arquivos de música */
/* carrega os arquivos usando-se as respectivas funções */
som1 = load_wav(“arquivo.wav”);
/* para arquivos wav */
musica = load_midi(“arquivo.mid”); /* para arquivos mid */
Ponteiro nulo -> arquivo não encontrado.
Som – MIDI’s
Para tocar uma música usa-se a função
play_midi. O primeiro parâmetro é o
arquivo MIDI carregado, o segundo indica se
ele tocará em loop ou não.
/* Exemplo para tocar um arquivo MIDI */
MIDI *musica;
/* declaração da variável a ser usada */
musica = load_midi(“musica.mid”);
/* carrega arquivo */
play_midi(musica,TRUE);
/* toca a música em loop */
Para parar de tocar uma música usa-se a
função stop_midi().
Som - Samples
Para tocar um som digital usa-se a função
play_sample. Os cinco parâmetros indicam: arquivo
carregado, volume (0 a 255), equilíbrio entre as caixas
(0 a 255, 128 é meio a meio), freqüência (1000 usa a
frequência original, 500 usa a metade da freqüência
original etc.) e se vai ser tocado em loop
Função stop_sample() pára de tocar
/* Exemplo para tocar um arquivo de som WAV */
SAMPLE *som; /* declaração da variável a ser usada */
som = load_wav(“som.wav”);
/* carrega arquivo */
play_midi(musica,255,128,1000,FALSE);
/* toca som */
Timming no Allegro
Executar pedaço de código em velocidades diferentes
Para isso, colocar cada um dos trechos de código numa função diferente
Allegro só permite o uso de 16 timers
int install_int(void (*proc)(), int speed) /* cria timer */
install_timer();
/*inicializa timer, opcional */
void remove_int(void (*proc)()) /* remove função da lista */
Notas:
Todas variáveis globais acessadas nos timers devem ser trancadas com
a macro LOCK_VARIABLE()
speed representa milésimos de segundo
Timming no Allegro
Notas:
Todas variáveis globais acessadas nos timers devem ser
trancadas com a macro LOCK_VARIABLE()
Todas as funções de "timer" devem ser trancadas com
LOCK_FUNCTION()
speed representa milésimos de segundo
Exemplo de Jogos
Swear
Exemplo de Jogos
Icy Tower
Como Obter Mais Ajuda
Arquivos de documentação do Allegro,
principalmente faq.txt e allegro.txt.
Links na própria página do Allegro.
Demo do Allegro (\allegro\demo).
Exemplos do Allegro (\allegro\examples).
Newsgroups e listas de discussão.
Vários programas já desenvolvidos usando o
Allegro fornecidos com o código fonte.
Instalando Allegro
Devc++
• Clique no botão Install e selecione o caminho onde você salvou o
pacote de instalação do Allegro:
Usando Allegro no Devc++
Crie um Novo Projeto no DevC++, Selecione a aba
MultiMedia, e clique em Allegro Application(static):
Bibliografia
Site principal do Allegro
Site principal de aplicações (games) em
allegro
http://alleg.sourceforge.net
http://www.allegro.cc
Tutorial allegro vivace
http://www.grandgent.com/gfoot/vivace/vivace.html
Exercício
Ex1: Construa um Círculo Trigonométrico a
partir das primitivas (reta, retângulo,
círculo) do Allegro.
Ex2: Faça o joginho de Surf, para tal, utiliza
as imagens surf.bmp e teahupoo.bmp