terça-feira, 9 de fevereiro de 2010

Allegro - Uma biblioteca em C para programar jogos





Bom, como o próprio título da postagem indica, Allegro é uma biblioteca escrita na linguagem C com o propósito de facilitar a programação de jogos e outras aplicações multimídia. Esta biblioteca inclui desde funções para manipulação de gráficos primitivos (pontos, linhas, retângulos, elipses, polígonos, etc.), sprites, arquivos de som, joysticks, teclado, até a criação de GUIs (interfaces gráficas) simples e gráficos em 3D.

Allegro é uma biblioteca livre de código fonte aberto para o desenvolvimento de video games.

O objetivo principal é a independência de plataforma de operação. O mesmo código-fonte, sem tirar nem pôr um único caractere que seja, deve compilar e rodar em todas as plataformas suportadas. Um objetivo de curto prazo é a plataforma 64-bits.

O seu principal uso é no escopo da programação de jogos. Atualmente ela possui uma grande comunidade pois além de possuir diversos recursos nativamente (gráficos 2D, 3D com OpenGL, entrada de dados pelo teclado e mouse, RLE-Sprites, exibição de vídeos e controle de som) a API é bastante extensível fazendo que com existam diversos addons disponíveis.

A interface pública de acesso da biblioteca é escrita em C, porém há alguns extensores (não-oficiais) para outras linguagem de programação. Internamente seu código fonte é escrito em uma mistura de C, Assembly (drivers i386), C++ e Objective-C.

Historicamente, um ponto forte do Allegro era sua performance. Uma parcela de seu código fonte era escrita de forma otimizada em Assembler para situações em que tempo de processamento é fundamental. Quando seu código fonte deixou de ser escrito exclusivamente para DOS alguns desses processamentos críticos passaram a ser feitos pelo sistema operacional, como por exemplo, com o uso interno da biblioteca DirectX no Windows.

A biblioteca Allegro foi originalmente compilada por Shawn Hargreaves para a plataforma Atari ST, mas com o desaparecimento desta plataforma Allegro fez uma breve passagem pelo Borland C até ser adotada pelo DJGPP onde alcançou sua maturidade, em uma mistura de Código C com Assembly.

Há muito tempo que deixou de ser uma pequena biblioteca modo 13 e hoje utiliza recursos modernos como DirectX ou um Servidor X. Uma grande quantidade de pacotes adicionais pode ser encontrada na página própria. Por apresentar uma sintaxe simples e encapsular diversas rotinas complexas em comandos facilmente decoráveis, tornou-se uma API ideal para iniciantes e para projetos que disponham de pouco tempo para sua finalização.

A palavra "Allegro" também pode ser um acrônimo recursivo para "Allegro Low LEvel Game ROutines".

Veja algumas especificações da biblioteca:

  • Suporte em código para as plataformas DOS, Windows, Unix, BeOS, QNX, e Mac OS.

  • Funções de desenho incluindo putpixel(plotar pixel), getpixel(ler pixel), linhas, retângulos, texturas simples, preenchimento gouraud(forma de preencher suavemente entre um tom e outro de cor), curvas, preenchimento baseado em padrões, mascaramento, sprites compilados, mudança de escala em imagens e rotação, transparência e luz, texto com suporte a fontes, remoção de bordas e imagens que não aparecem na tela para ganho de desempenho, e pode desenhar diretamente para memória de vídeo ou imagens em memória independente do tamanho.

  • Drive gráfico para DOS com suporte a VGA(mode 13h) mode-x, e modos SVGA com modos com profundidade de cor de 8, 15, 16, 24, e 32 bits, utilização de todas vantagens do VBE 2.0 mascaramento para mapeamento linear e acesso a aceleração de Hardware se disponível. Suporte para outras funcionalidades de vídeo disponível por meio do projeto FreeBE/AF.

  • Drive gráfico para windows usando directX em modo tela cheia e para modos janela diversas rotinas para desenho direto nos contextos de renderização da GDI.
  • Drive gráfico para Unix para X, DGA, fbcon, SVGALib, VBE/AF, modo-X, e o modo vga padrão.

  • Drive gráfico para BeOS utilizando BWindowScreen em modo tela cheia e BDirectWindow em modo janela.

  • Movimento da tela em hardware e triple buffering(utilização de 3 paginas de memória para melhorar a animação), e manipulação de paleta de cores. Player integrado de vídeos FLI/FLC.

  • Suporte para musica MIDI com mais de 64 efeitos simultâneos, possibilidade de gravação de arquivos wav e entrada de MIDI. Suporte simplificado para acesso de teclado, mouse, joystick, e temporizadores de alta fidelidade, incluindo retrância vertical simulada para a versão DOS.

  • Rotinas para leitura de arquivos comprimidos com LZSS. Suporte para arquivos de dados com múltiplos objetos.

  • Funções matemáticas incluindo aritmética de ponto fixo, tabelas trigonométricas pré-compiladas, e manipulação de vetores/matrizes 3D. Diversas rotinas para operação com GUI gerenciado pela allegro.

  • Suporte interno para caracteres 16 e UTF-8 bits.

Depois de algum tempo me ferrando me esforçando para desenvolver um jogo em C/C++ com gráficos decentes, passei por bibliotecas como OpenGL, SDL e GLUT. Mas nenhuma é tão completa e boa quanto a Allegro. É possível com Allegro desenvolver um jogo completo em 3D com efeitos visuais, som de qualidade, suporte a joystick, interface gráfica e uma pá de extras, tudo o que um jogo que preste tem direito, sem usar nenhuma outra biblioteca adicional. Quer coisa mais prática que isso?

Eu comecei a "brincar" com Allegro ontem, e é muito fácil de configurar e usar, pelo menos no meu ambiente (Windows XP/Dev-C++/MinGW). Nesse post eu vou mostrar onde baixar essa biblioteca, como configurar o Dev-C++ com MinGW para compilar os programas, e alguns links úteis. Repare que tudo aqui diz respeito ao Windows, e não ao Linux.

O que você precisa?


Você precisa da IDE Dev-C++ com o compilador gcc/g++ (MinGW).

Caso você não tenha essa IDE, então baixe pelamordedeus né:
http://www.baixaki.com.br/download/dev-c-.htm

Se não vier com os compiladores da MinGW, pode baixar separado, procure no link abaixo:
http://sourceforge.net/projects/mingw/files/

Onde baixar a biblioteca, a docmuentação e os exemplos?


Bom, se você já tem o Dev-C++ instalado com MinGW e funcionando, agora precisa baixar a biblioteca. Como eu suponho que você usa Windows, vou passar o link para você fazer o download da biblioteca na forma pré-compilada.

Clicando nos links abaixo vai baixar os executáveis 7z. É como um arquivo ZIP que se auto-extrai. Quando terminar de baixar, clique duas vezes e escolha onde quer extrair os arquivos compactados. Pra organizar é bom criar antes uma pasta chamada Allegro na raíz ("C:\Allegro\") e extrair tudo lá pra dentro.

Clique aqui para baixar a biblioteca Allegro pré-compilada (MinGW):
http://cdn.allegro.cc/4.2.2/allegro-mingw-4.2.2.exe

Clique aqui para baixar a documentação da biblioteca em formato CHM:
http://cdn.allegro.cc/4.2.2/allegro-chmdocs-4.2.2.exe

Clique aqui para baixar os exemplos e ferramentas úteis:
http://cdn.allegro.cc/4.2.2/allegro-misc-4.2.2.exe

Como configurar o Dev-C++ para compilar os programas?


Essa parte é bem... tá, tá bom, não é tão simples.

Abra o Dev-C++ e siga os passos a seguir que dá tudo certo:

1. Clique em "Arquivo", "Novo", e "Projeto..."
2. Selecione "Empty Project", dê um nome ao projeto, e clique em OK.
3. Salve o projeto em algum lugar.
4. Clique em "Projeto" e "Opções do Projeto".
5. Clique no guia "Parâmetros", e clique no botão "Adicionar"
6. Procure pelo arquivo "liballeg.a". Supondo que você tenha instalado a biblioteca em "C:\Allegro\", vá em "C:\Allegro\lib\", escolha "liballeg.a" e clique em OK.
7. Clique no guia "Arquivos/Diretórios", clique em "Diretórios de Include", e clique no ícone da pasta à direita.
8. Supondo que você tenha instalado a biblioteca em "C:\Allegro\", Selecione a pasta dos Includes em "C:\Allegro\include\" e clique em OK.
9. Clique em "Adicionar" e clique em OK.
10. Clique em "Arquivo", "Novo", "Arquivo Fonte" e clique em Yes.
11. Tudo certo, Dev-C++ já está configurado para compilar e linkar os programas usando Allegro. Já pode começar a escrever o seu programa neste arquivo.

Observação importante!

Como estamos usando MinGW, você deve sempre acrescentar a macro END_OF_MAIN() logo depois do método main do seu programa, mas não coloque um ponto-e-vírgula no final porque isso é uma macro e não uma função! Exemplo:

#include "allegro.h"

int main(void)
{
// Código...
}
END_OF_MAIN()

Links úteis para aprender a usar Allegro


Acredito que a melhor forma de aprender qualquer coisa é na prática. Tem toda a documentação necessária para aprender a usar as funções e estruturas da biblioteca, então é só olhar os exemplos e modificá-los, assim você aprende através da imitação, que nem os chimpanzés.

Inclusive, eu postei um artigo mostrando como programar um Hello World (Olá Mundo) usando C++ com Allegro. Clique aqui para conferir: http://fernando-aires.blogspot.com/2010/06/hello-world-ola-mundo-em-c-com-allegro.html

Ou se quizer mais informações sobre a Allegro, dê uma olhada nesses links a seguir:

Site oficial da Allegro - http://alleg.sourceforge.net/
Vários projetos - http://www.allegro.cc/

Gostou? Deixa comentário.
Dúvidas? Me envie e-mail.