Tutorial Allegro 5 #2 – Colocando uma Imagem na Tela

Padrão

Aqui estamos nós novamente, para o segundo post da série sobre programação de jogos usando a Allegro 5. No post de hoje, veremos como carregar uma imagem e colocá-la na tela.

Já disse no último post que a Allegro 5 possui uma série de add-ons que possibilitam muitas facilidades ao desenvolvimento. Além disso, a divisão em add-ons é útil para que você não tenha que colocar uma porção de funções que não usa na hora de distribuir seu jogo. Você inclui somente as bibliotecas que utilizou, diminuindo consideravelmente o tamanho.

Na versão atual da biblioteca (versão 5.0.4), os add-ons disponíveis são os seguintes:

  • allegro: as funções de núcleo
  • allegro_main: a biblioteca de compatibilidade que permite a função main() funcionar em todos os compiladores. Requerida apenas do OS X
  • allegro_acodec: codecs de áudio, como Ogg e Wav
  • allegro_audio: o subsistema básico de áudio
  • allegro_color: conversão entre vários formatos de cor
  • allegro_dialog: caixas de diálogo nativas, como “abrir arquivo…”
  • allegro_font: fontes bitmap básicas
  • allegro_image: formatos de imagem, como JPEG e PNG
  • allegro_memfile: uma interface para carregar arquivos da memória
  • allegro_physfs: uma interface para carregar arquivos de locais abstratas, como arquivos Zip
  • allegro_primitives: funções básicas de desenho, como retângulos e linhas
  • allegro_ttf: carregamento arquivos .ttf

Como pode ser visto, dá pra fazer bastante coisa com os add-ons que antes, com o Allegro 4, só estava disponível com o uso de bibliotecas de terceiros.

Bom, neste segundo tutorial, utilizaremos o add-on allegro_image para carregarmos uma imagem e a mostrarmos na tela. Com o uso desta biblioteca, podemos utilizar diversos tipos de imagens (Bitmap, PNG, JPEG…).

Assim como no outro tutorial, vamos dar uma olhada no código e em seguida vou explicando o que tem de novo nele. Também estou usando a linguagem C.

// Inclui o cabeçalho da bibilioteca Allegro 5
#include <allegro5/allegro.h>

// Inclui o cabeçalho do add-on para uso de imagens
#include <allegro5/allegro_image.h>

int main(void)
{
    // Variável representando a janela principal
    ALLEGRO_DISPLAY *janela = NULL;

    // Variável representando a imagem
    ALLEGRO_BITMAP *imagem = NULL;

    // Inicializa a Allegro
    al_init();

    // Inicializa o add-on para utilização de imagens
    al_init_image_addon();

    // Configura a janela
    janela = al_create_display(640, 480);

    // Carrega a imagem
    imagem = al_load_bitmap("sunshine.jpg");

    // Desenha a imagem na tela
    al_draw_bitmap(imagem, 0, 0, 0);

    // Atualiza a tela
    al_flip_display();

    // Segura a execução por 10 segundos
    al_rest(10.0);

    // Finaliza a janela
    al_destroy_display(janela);

    return 0;
}

Em relação ao último tutorial, temos apenas diferenças pequenas. Em primeiro lugar, adicionamos o arquivo de cabeçalho correspondente ao add-on allegro_image. Além disso, declaramos uma variável do tipo ALLEGRO_BITMAP (ponteiro, assim como quase tudo no Allegro) que representará a nossa imagem. Além disso, para utilizar o add-on, é preciso realizar uma chamada a al_init_image_addon() que inicializa as engines de renderização dos formatos de imagem disponíveis no sistema. Da mesma forma como a função de inicialização da Allegro, não é necessário chamar a função de encerramento, já que ela é executada automaticamente quando o programa é encerrado.

Além dessa parte de inicialização, temos a função que carrega o nosso arquivo de imagem (função al_load_bitmap), que simplesmente recebe o caminho relativou ou absoluto da imagem a ser carregada, retornando um ponteiro para o tipo ALLEGRO_BITMAP. Por fim, temos a função que desenha a nossa imagem no bitmap ativo (lembra que eu falei da máquina de estados no primeiro tutorial?). A função al_draw_bitmap recebe como parâmetros o bitmap a ser desenhado, a posição x, a posição y e as flags de espelhamento ALLEGRO_FLIP_HORIZONTAL e/ou ALLEGRO_FLIP_VERTICAL. Como no exemplo não pretendemos alterar a imagem original, passamos 0 no último argumento.

No mais, atualizamos a tela e deixamos ela ativa por 10 segundos. O resultado deve ser algo parecido com isso (qualquer imagem em 640×480 deve ficar boa):

Para compilar, coloque as seguintes flags no linker:

  • no Windows: -lallegro_image-5.0.4-mt -lallegro-5.0.4-mt
  • no Linux: -lallegro_image -lallegro
Bom, espero ter ajudado com mais esse tutorial e espero vocês no próximo! Comentem, opinem e deem sugestões, para que o conteúdo do blog fique cada vez melhor! Valeu! 😀

19 comentários sobre “Tutorial Allegro 5 #2 – Colocando uma Imagem na Tela

  1. Thiago Pereira

    Oi Rafael, muito bom o tutorial!
    Bom, gostaria de saber como o add-on allegro_image carrega a imagem se não especificamos o caminho onde a imagem se localiza? Tenho um projeto para fazer com essa biblioteca allegro e gostaria de entender melhor. Valeu

    • Rafael

      Na realidade, o caminho é aquele especificado na linha 25. Porém, neste caso foi passado o caminho relativo, ou seja, o caminho do arquivo em relação ao executável. No caso desse exemplo, a imagem ficaria na mesma pasta que o executável.

  2. cleucyano

    olá amigo, primeiramente parabens pelo post.. me ajudou muito… mas travei nesse… fiz tudo mas no fim nao da certo… aparece o erro 1… ou entao quando da certo, aparece o que fizemos no primeiro tutorial… aparece a janela branca… o que faço???

    att, cleucyano

  3. Carlos

    Rafael muito show seus tutoriais, me diz uma coisa, eu estou usando a biblioteca Allegro 5 programando em C puro, e tive uma erro na exibição de uma imagem, ela faz o al_load_bitmap corretamente, mas no al_draw_bitmap aborta o programa com erro, algo te vem a mente?

    • Olá Carlos! Muito provavelmente seja pelo fato da imagem não ter sido carregada corretamente. Em 99% dos casos é isso. Faça um ‘if’ verificando se a imagem foi realmente carregada. Por ex:

      ALLEGRO_BITMAP *imagem = al_load_bitmap(“sunshine.jpg”);
      if (!imagem) return -1;

  4. Ramon

    Em qual diretório deve estar a imagem de background?
    Estou usando o codeblocs no Ubuntu e a mensagem de erro foi:

    obj/Debug/fade.o||In function `inicializar’:|
    /home/ramon/Documentos/Allegro/Allegro/fade.c|89|undefined reference to `al_init_image_addon’|

    me ajuda?

  5. Jessica

    Eu estou trabalhando em um projeto de Processamento de Imagens Médicas e gostaria de saber se essa Biblioteca Allegro5 é compatível com imagens de extensão .pgm, pois testei com essa extensão e não conseguir, desde já agradeço

  6. J Carlos Viana F

    Não deveria usar al_destroy_bitmap(imagem) antes de return 0? para liberar a memória da imagem alocada? Essa função existe no allegro 5, e não acho que libera automaticamente…

  7. mas

    Olá honorável Rafael, ocorreu um erro inesperado quando tentei copilar o código do seu tutorial no visual studio 2013 (Obs: Eu achei a imagem que você usou no seu tutorial no google, salvei e coloquei na mesma pasta do arquivo) e aparece a seguinte mensagem http://prntscr.com/4u0qxw na tela tem alguma sugestão ?

    • Murilo Andrade

      Atualmente estou com a versao 5.0.7 (Windows) e estava com o mesmo problema adicionando allegro-5.0.7-monolith-md-debug.lib no linker.
      Consegui solucionar esse problema adicionando o arquivo nao-monolith, ou seja, allegro-5.0.7-md-debug.lib

      []`s

  8. Jose Timm

    Olá Rafael, parabéns pelo blog!
    Queria ajuda, quando uso o codigo acima aparece o seguinte erro :
    “/tmp/cc6vTm4F.o: na função `main’:
    teste.c:(.text+0x62): referência indefinida para `al_init_image_addon’
    collect2: error: ld returned 1 exit status”
    Compilação falhou.
    Agradeço desde já.

  9. Olá! Primeiramente meus parabéns pela série de tutoriais do Allegro 5, sem sombra de dúvidas o melhor que já vi na internet. Mas a minha dúvida é a seguinte: Gostaria de colocar a imagem utilizada no programa em um local especifico como posso proceder? É possível?

    • Aipi

      Sim, é possível. Você pode inserir desta forma caso esteja usando o Mac:
      imagem = al_load_bitmap(“/Users/macbookpro/Desktop/image.jpg”);

      Ou dessa forma caso esteja usando Windows:
      imagem = al_load_bitmap(“C:\Users\Joseph\Desktop\image.jpg”);

      Linux:
      imagem = al_load_bitmap(“/root/Desktop/image.jpg”);

      Abraços

  10. Brener Gomes SI

    Olá estou utilizando esta biblioteca para um trabalho de Engine de Jogos porem o meu nao esta dando erro algum mas ao inciar o programa apos alguns segundos jogando ele trava o pc e apos um momento ele volta ao normal o pc mas fecha o programa. Coloquei todos os comandos para destruir as imagens mas ainda da este problema. Caso saiba o que pode ser me ajudaria muito. Obrigado

    • Nuno

      Bom dia Brener, estou com o mesmo problema: o jogo roda por um tempo e depois trava dando erro da crash. Andei pesquisando e parece ser algum erro de algum drive do windows 7. Se descobrir algo, por favor me passe. Continuo pesquisando por aqui e se descobrir te aviso. abraço. Nuno

Deixe uma resposta