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
Os vectores X e Y, estão posicionados da maneira diferente
quando comparamos os planos, desta forma, quando
desenharmos 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
Tela
Instante 1
Instante 2
Instante 3
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_sample(som,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 */
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
Timming no Allegro
Exemplo:
volatile int x=0;
//Variável glogal modificada em um timer
void Anda(void) {
x++;}
//Timer
END_OF FUNCTION(Anda);
int main(void) {
//Necessário após a declaração de um timer
//Nosso programa
...
install_timer();
//Opcional, porém mais legível
LOCK_FUNCTION(Anda);
//Obrigatório trancar os timers usados
LOCK_VARIABLE(x);
//Obrigatório trancar as variáveis globais dos timers
install_int(Anda, BPS_TO_TIMER(10)); //"Anda" executado 10 vezes por segundos
while(!Fim_Jogo) {}
//Lógica do jogo
return(1);
}
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
Download

Apresentacao_Multimidia