320 likes | 461 Views
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
E N D
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
Instante 3 Instante 1 Instante 2: Limpar a tela Animação • Qual o problema desta técnica? Efeito Flicker - efeito de cintilação ou vibração de uma imagem na tela do computador
Buffer Instante 3 Instante 1 Instante 2: Limpar a tela Tela Instante 3 Instante 1 Instante 2 Animação • Qual a solução? Double Buffering
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
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_xe 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) { //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);}
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 • 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
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