Tutorial Allegro 5 #4 – Escrevendo Texto Usando Fontes True Type (TTF)

Padrão

Olá pessoal!

Em mais um post da série sobre programação de jogos, hoje vamos ver como escrever texto na tela utilizando fontes True Type. As fontes True Type são essas que você utiliza no seu computador nos editores de texto. Você encontra uma porção delas em C:\Windows\Fonts (caso esteja usando o Windows).

Para o uso de fontes, será necessário utilizar duas extensões da biblioteca Allegro: allegro_font (funções gerais relativas a fontes e escrita de texto) e allegro_ttf (para o uso das fontes true type propriamente ditas).

Vamos dar uma olhada no nosso código e já comentamos sobre ele logo em seguida:

// Os arquivos de cabeçalho
#include <allegro5/allegro.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>

// Para utilizarmos a função fprintf
#include <stdio.h>

// Atributos da tela
const int LARGURA_TELA = 640;
const int ALTURA_TELA = 480;

int main(void)
{
    // A nossa janela
    ALLEGRO_DISPLAY *janela = NULL;

    // O nosso arquivo de fonte
    ALLEGRO_FONT *fonte = NULL;

    // Inicialização da biblioteca Allegro
    if (!al_init())
    {
        fprintf(stderr, "Falha ao inicializar a Allegro.\n");
        return -1;
    }

    // Inicialização do add-on para uso de fontes
    al_init_font_addon();

    // Inicialização do add-on para uso de fontes True Type
    if (!al_init_ttf_addon())
    {
        fprintf(stderr, "Falha ao inicializar add-on allegro_ttf.\n");
        return -1;
    }

    // Criação da nossa janela
    janela = al_create_display(LARGURA_TELA, ALTURA_TELA);
    if (!janela)
    {
        fprintf(stderr, "Falha ao criar janela.\n");
        return -1;
    }

    // Carregando o arquivo de fonte
    fonte = al_load_font("BRADHITC.TTF", 48, 0);
    if (!fonte)
    {
        al_destroy_display(janela);
        fprintf(stderr, "Falha ao carregar fonte.\n");
        return -1;
    }

    // Preenchemos a tela com a cor branca
    al_clear_to_color(al_map_rgb(255, 255, 255));

    // Texto alinhado à esquerda
    al_draw_text(fonte, al_map_rgb(255, 0, 0), 10, 10, ALLEGRO_ALIGN_LEFT, "Esquerda");

    // Texto alinhado à direita
    al_draw_text(fonte, al_map_rgb(0, 255, 0), LARGURA_TELA - 10, 50, ALLEGRO_ALIGN_RIGHT, "Direita");

    // Texto centralizado
    al_draw_text(fonte, al_map_rgb(0, 0, 255), LARGURA_TELA / 2, 90, ALLEGRO_ALIGN_CENTRE, "Centro");

    // Exemplo de impressão de valores variáveis
    int i = 2;
    char *texto = "Uma string qualquer";
    al_draw_textf(fonte, al_map_rgb(0, 0, 0), LARGURA_TELA / 2, 250, ALLEGRO_ALIGN_CENTRE, "Teste %d - %s", i, texto);

    // Atualizamos a tela
    al_flip_display();

    // E aguardamos 10 segundos
    al_rest(10.0);

    // Desalocação da fonte e da janela
    al_destroy_font(fonte);
    al_destroy_display(janela);

    return 0;
}

A estrutura do código assemelha-se bastante com a que definimos no último post. De início, podemos perceber a inclusão dos arquivos de cabeçalho relativos aos add-ons que estamos utilizando (allegro_font.h e allegro_ttf.h). No início da função main(), temos um novo tipo de dados: ALLEGRO_FONT. Este é o tipo que representará o nosso arquivo de fonte, e com o qual renderizaremos nossas mensagens.

Após a inicialização da biblioteca Allegro, inicializamos o add-on allegro_font através da função al_init_font_addon() e o add-on allegro_ttf através da chamada à função al_init_ttf_addon(). Caso você venha a utilizar fontes bitmap, também será necessário inicializar o add-on allegro_image.

Após a criação da janela, carregamos a fonte utilizando a função al_load_font(). Os parâmetros são: o nome da fonte, o tamanho da fonte e as flags, que podem ter os valores ALLEGRO_TTF_NO_KERNING (desabilitar o uso de kerning, mesmo que a fonte suporte esse recurso) e/ou ALLEGRO_TTF_MONOCHROME (praticamente, esta flag desativa o anti-aliasing da fonte). Estas flags se aplicam se a fonte for no formato True Type.

Para escrever o texto, utilizamos duas funções: al_draw_text() (para textos estáticos ou que não possuem variáveis) e al_draw_textf() (para textos com variáveis ou formatados – semelhante ao printf()). Os argumentos para a função al_draw_text() são: arquivo de fonte (no formato ALLEGRO_FONT), cor (no exemplo, mapeado pela função al_map_rgb()), posição x (horizontal), posição y (vertical), flags (já vou explicar) e o texto. No caso da função al_draw_textf(), a diferença é que a partir do último parâmetro, podemos ter n elementos, de forma a montar a mensagem formatada, como ocorre com a função printf(). Quanto às flags, o valor pode ser 0 ou um dos valores: ALLEGRO_ALIGN_LEFT, ALLEGRO_ALIGN_CENTRE ou ALLEGRO_ALIGN_RIGHT. O padrão 0 alinha o texto à esquerda. Dependendo da flag utilizada, as coordenadas X e Y correspondem a um ponto diferente do texto. No caso da flag ALLEGRO_ALIGN_LEFT, as coordenadas X e Y correspondem ao canto superior esquerdo do texto. Já no caso de ALLEGRO_ALIGN_CENTRE, corresponde ao ponto central do texto, e na flag ALLEGRO_ALIGN_RIGHT, corresponde ao canto superior direito do texto.

Por fim, temos a função al_destroy_font() para realizar a desalocação do arquivo de fonte, quando o mesmo não for mais utilizado.

O aplicativo rodando deve ficar parecido com isto:

Obviamente, escolha o arquivo de fonte de seu gosto e ajuste o nome da fonte na chamada à função al_load_font() – senão o programa não roda…

Para compilar, use as seguintes opções no linker:

  • Windows: -lallegro_ttf-5.0.4-mt -lallegro_font-5.0.4-mt -lallegro-5.0.4-mt
  • Linux: -lallegro_ttf -lallegro_font -lallegro
Bom divertimento e até a próxima! 😀

12 comentários sobre “Tutorial Allegro 5 #4 – Escrevendo Texto Usando Fontes True Type (TTF)

  1. Rafael

    Fazendo de acordo com o tutorial, funciona perfeitamente, mas como faço para exibir acentos e cedilha ? Fiz um teste substituindo o char* = “Uma string qualquer”, para char* = “Atenção”; mas só exibe “Aten”. Como faço para exibir certo ?
    Estou usando Allegro 5 com Code::Blocks 10.05.
    Obrigado

    • Olá Rafael!

      Para a utilização de strings com caracteres especiais, você deve utilizar as strings com codificação UTF-8 fornecidas pela Allegro. Essas strings possuem um tipo próprio e suas próprias funções para desenhá-las na tela. Ex:

      ALLEGRO_USTR* stringCodificada = al_ustr_new("Isso é um teste");
      ...
      al_draw_ustr(fonte, al_map_rgb(0, 0, 0), 10, 10, ALLEGRO_ALIGN_LEFT, stringCodificada);

      Na documentação da Allegro você encontra maiores informações sobre o seu uso: http://www.allegro.cc/manual/5/utf8.html

      Obrigado pela visita! 🙂

  2. Rafael Moura

    Olá, copiei o codigo e compilei, porem da erro, na hora de inicializar o
    al_init_ttf_addon(); ele trava, ai eu tirei os fprintf de erro e da a seguinte mensagem quando compilo:Assertion failed:font,file d:Librariesbuildallegrosrcallegro-5.0.xallegro-5.0.xaddonsfonttext.c, line 73, o que esta acontecendo sera, já que todos ou outros codigos que voce postou aqui estao funcionando corretamente? Obrigado

    • Você está utilizando Windows, certo? Verifique se a versão do Allegro que você está usando foi compilada para uso no seu compilador. Lá na parte “files” do site da Allegro, tem as versões da biblioteca pra cada uma das versões do MinGW (a mais recente, somente a partir da 4.5). Caso esteja utilizando o MinGW que vem com o Code::Blocks, a última versão do Allegro suportada por ele é a 5.0.5.

      • Rafael Moura

        Olá, dei uma pesquisada, era apenas o diretorio da fonte que o programa nao estava xando, coloquei a linha: ” fonte = al_load_font(“C:/Windows/Fonts/arial.ttf”, 48, 0);” e deu certo
        Obrigado pela atençao!!

  3. Cara não funciona, do modo que está ai o “al_load_font” retorna um ponteiro “null”.

    Eu vi os comentários e tentei fazer dando o endereço da fonte, não funcionou.

    Uso o windows 7, codebloks 10.05, allegro-5.0.6, mingw-4.5.0, dx80_mgw.

    No codeblocks no linker tem apenas esse:
    C:Program FilesCodeBlocksMinGWallegro5libliballegro-5.0.6-monolith-mt.a

    O erro estaria em não ter -lallegro_ttf-5.0.4-mt -lallegro_font-5.0.4-mt -lallegro-5.0.4-mt?

    Como ficaria?

    • Bom eu consegui resolver e vou mostrar como pra que outros usuários consigam caso tenham o mesmo problema.

      Adicionei a inicialização de fontes ttf isso:
      al_init_ttf_addon();
      Em fonte coloquei o “TTF” em minusculo “ttf” e dei o caminho completo, assim:fonte = al_load_ttf_font(“D:/projeto/data/font/BELL.ttf”, 48, 0);

      Na verdade nem precisa é só colocar a pasta data dentro de debug, tinha esquecido isso também.

      Obrigado pelos posts.

  4. Renan Souza Daniel

    Olá! Estou com um problema: não consigo fazer com que o programa inicialize a fonte. Ja coloquei o caminho na pasta WindowsFont, ja coloquei a fonte na pasta do programa, ja troquei a extensão pra minusculo, bom ja fiz de tudo! E sempre que executo o programa da o erro que a fonte não pode ser inicializada. Pode me ajudar?

  5. Renato

    Quando eu Compilo no dev roda, mas se eu colocar todas dll(s) na pasta do projeto com a fonte que estou usando, sempre da um problema nessa DLL: allegro_ttf-5.0.10-mt quando mando rodar, não sei oq pode estar acontecendo 🙁

Deixe uma resposta