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<br />
#include &lt;allegro5/allegro.h&gt;<br />
#include &lt;allegro5/allegro_font.h&gt;<br />
#include &lt;allegro5/allegro_ttf.h&gt;</p>
<p>// Para utilizarmos a função fprintf<br />
#include &lt;stdio.h&gt;</p>
<p>// Atributos da tela<br />
const int LARGURA_TELA = 640;<br />
const int ALTURA_TELA = 480;</p>
<p>int main(void)<br />
{<br />
    // A nossa janela<br />
    ALLEGRO_DISPLAY *janela = NULL;</p>
<p>    // O nosso arquivo de fonte<br />
    ALLEGRO_FONT *fonte = NULL;</p>
<p>    // Inicialização da biblioteca Allegro<br />
    if (!al_init())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar a Allegro.\n&quot;);<br />
        return -1;<br />
    }</p>
<p>    // Inicialização do add-on para uso de fontes<br />
    al_init_font_addon();</p>
<p>    // Inicialização do add-on para uso de fontes True Type<br />
    if (!al_init_ttf_addon())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar add-on allegro_ttf.\n&quot;);<br />
        return -1;<br />
    }</p>
<p>    // Criação da nossa janela<br />
    janela = al_create_display(LARGURA_TELA, ALTURA_TELA);<br />
    if (!janela)<br />
    {<br />
        fprintf(stderr, &quot;Falha ao criar janela.\n&quot;);<br />
        return -1;<br />
    }</p>
<p>    // Carregando o arquivo de fonte<br />
    fonte = al_load_font(&quot;BRADHITC.TTF&quot;, 48, 0);<br />
    if (!fonte)<br />
    {<br />
        al_destroy_display(janela);<br />
        fprintf(stderr, &quot;Falha ao carregar fonte.\n&quot;);<br />
        return -1;<br />
    }</p>
<p>    // Preenchemos a tela com a cor branca<br />
    al_clear_to_color(al_map_rgb(255, 255, 255));</p>
<p>    // Texto alinhado à esquerda<br />
    al_draw_text(fonte, al_map_rgb(255, 0, 0), 10, 10, ALLEGRO_ALIGN_LEFT, &quot;Esquerda&quot;);</p>
<p>    // Texto alinhado à direita<br />
    al_draw_text(fonte, al_map_rgb(0, 255, 0), LARGURA_TELA - 10, 50, ALLEGRO_ALIGN_RIGHT, &quot;Direita&quot;);</p>
<p>    // Texto centralizado<br />
    al_draw_text(fonte, al_map_rgb(0, 0, 255), LARGURA_TELA / 2, 90, ALLEGRO_ALIGN_CENTRE, &quot;Centro&quot;);</p>
<p>    // Exemplo de impressão de valores variáveis<br />
    int i = 2;<br />
    char *texto = &quot;Uma string qualquer&quot;;<br />
    al_draw_textf(fonte, al_map_rgb(0, 0, 0), LARGURA_TELA / 2, 250, ALLEGRO_ALIGN_CENTRE, &quot;Teste %d - %s&quot;, i, texto);</p>
<p>    // Atualizamos a tela<br />
    al_flip_display();</p>
<p>    // E aguardamos 10 segundos<br />
    al_rest(10.0);</p>
<p>    // Desalocação da fonte e da janela<br />
    al_destroy_font(fonte);<br />
    al_destroy_display(janela);</p>
<p>    return 0;<br />
}

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! 😀