Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

32
Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Transcript of Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Page 1: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Ana Queiroga (aicmq)

André Guedes (agl)

Bruno Batista (bamb)

Bruno Lins (bfol)

Page 2: 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

Page 3: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Page 4: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Características (cont.)

Gere mouse, teclado, joystick Suporta arquivos de configuração e de dados

comprimidos Temporizadores

Page 5: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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.

Page 6: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Page 7: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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)

Page 8: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Page 9: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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.

Page 10: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Desenhar Objectos – BITMAP’s

Page 11: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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;

Page 12: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Cores

A cor azul é formada através da RGB [0,0,255]

Page 13: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Page 14: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Animação

Qual o problema desta técnica?

Efeito Flicker - efeito de cintilação ou vibração de uma imagem na tela do computador

Instante 1 Instante 2: Limpar a tela Instante 3

Page 15: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Animação Qual a solução? Double Buffering

Instante 2: Limpar a telaInstante 1 Instante 3

Buffer

Instante 1 Instante 3

Tela

Instante 2

Page 16: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Periféricos de Entrada - Teclado

Teclado install_keyboard() /* Para inicializar as

rotinas do teclado */

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

Váriável global int key[] permite ver quais teclas

estão pressionadas. constantes definidas para

identificar cada tecla

Page 17: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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 - Teclado

Page 18: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Periféricos de Entrada - Mouse

Usa-se a função Usa-se a função show_mouseshow_mouse para que o cursor do mouse para que o cursor do mouse seja mostrado no bitmap especificadoseja mostrado no bitmap especificado

Passando Passando NULLNULL como parâmetro esconde o cursor do mouse como parâmetro esconde o cursor do mouse Deve-se ter cuidado ao desenhar algo na tela pois o cursor Deve-se ter cuidado ao desenhar algo na tela pois o cursor

do mouse pode passar por cima e estragar o desenho, por do mouse pode passar por cima e estragar o desenho, por isso é sempre bom escondê-lo antes de desenhar qualquer isso é sempre bom escondê-lo antes de desenhar qualquer coisacoisashow_mouse(screen); /* mostra o mouse na tela */show_mouse(NULL); /* esconde o mouse */

Page 19: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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.

Periféricos de Entrada - Mouse

Page 20: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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.

Page 21: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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().

Page 22: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Page 23: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Page 24: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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

Page 25: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Timming no Allegro

Exemplo:

volatile int x=0; //Variável glogal modificada em um timer

void Anda(void) { //Timer

x++;}

END_OF FUNCTION(Anda); //Necessário após a declaração de um timer

int main(void) { //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);}

Page 26: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Exemplo de Jogos

Swear

Page 27: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Exemplo de Jogos

Icy Tower

Page 28: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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.

Page 29: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Instalando Allegro

Devc++

• Clique no botão Install e selecione o caminho onde você salvou o pacote de instalação do Allegro:

Page 30: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Usando Allegro no Devc++

Crie um Novo Projeto no DevC++, Selecione a aba MultiMedia, e clique em Allegro Application(static):

Page 31: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

Bibliografia

Site principal do Allegro http://alleg.sourceforge.net

Site principal de aplicações (games) em allegro http://www.allegro.cc

Tutorial allegro vivace http://www.grandgent.com/gfoot/vivace/vivace.html

Page 32: Ana Queiroga (aicmq) André Guedes (agl) Bruno Batista (bamb) Bruno Lins (bfol)

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