Tutorial Allegro 5 #6 – Utilizando o Teclado

Padrão

Olá pessoal! Temos hoje mais um post da série sobre Allegro 5. Desta vez, veremos como manipular as entradas vindas do teclado.

Como vocês verão no código, o tratamento, assim como no mouse, é realizado através da manipulação de eventos. O aplicativo consiste em exibir na tela qual das setas é pressionada. Coisa simples, mas que permitirá verificar como tratar estes eventos vindos do teclado.

Assim como das outras vezes, vamos dar uma olhada no código e comentar sobre o que tem de novo nele.

#include &lt;allegro5/allegro.h&gt;<br />
#include &lt;allegro5/allegro_font.h&gt;<br />
#include &lt;allegro5/allegro_ttf.h&gt;<br />
#include &lt;allegro5/allegro_image.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdbool.h&gt;</p>
<p>const int LARGURA_TELA = 640;<br />
const int ALTURA_TELA = 480;</p>
<p>ALLEGRO_DISPLAY *janela = NULL;<br />
ALLEGRO_EVENT_QUEUE *fila_eventos = NULL;<br />
ALLEGRO_BITMAP *fundo = NULL;<br />
ALLEGRO_FONT *fonte = NULL;</p>
<p>bool inicializar();</p>
<p>int main(void)<br />
{<br />
    bool sair = false;<br />
    int tecla = 0;</p>
<p>    if (!inicializar())<br />
    {<br />
        return -1;<br />
    }</p>
<p>    al_draw_bitmap(fundo, 0, 0, 0);</p>
<p>    while (!sair)<br />
    {<br />
        while(!al_is_event_queue_empty(fila_eventos))<br />
        {<br />
            ALLEGRO_EVENT evento;<br />
            al_wait_for_event(fila_eventos, &amp;evento);</p>
<p>            if (evento.type == ALLEGRO_EVENT_KEY_DOWN)<br />
            {<br />
                switch(evento.keyboard.keycode)<br />
                {<br />
                case ALLEGRO_KEY_UP:<br />
                    tecla = 1;<br />
                    break;<br />
                case ALLEGRO_KEY_DOWN:<br />
                    tecla = 2;<br />
                    break;<br />
                case ALLEGRO_KEY_LEFT:<br />
                    tecla = 3;<br />
                    break;<br />
                case ALLEGRO_KEY_RIGHT:<br />
                    tecla = 4;<br />
                    break;<br />
                }<br />
            }<br />
            else if (evento.type == ALLEGRO_EVENT_DISPLAY_CLOSE)<br />
            {<br />
                sair = true;<br />
            }<br />
        }</p>
<p>        if (tecla)<br />
        {<br />
            al_draw_bitmap(fundo, 0, 0, 0);</p>
<p>            switch (tecla)<br />
            {<br />
            case 1:<br />
                al_draw_text(fonte, al_map_rgb(255, 255, 255), LARGURA_TELA / 2,<br />
                        ALTURA_TELA / 2 - al_get_font_ascent(fonte) / 2,<br />
                        ALLEGRO_ALIGN_CENTRE, &quot;Seta para cima&quot;);<br />
                break;<br />
            case 2:<br />
                al_draw_text(fonte, al_map_rgb(255, 255, 255), LARGURA_TELA / 2,<br />
                        ALTURA_TELA / 2 - al_get_font_ascent(fonte) / 2,<br />
                        ALLEGRO_ALIGN_CENTRE, &quot;Seta para baixo&quot;);<br />
                break;<br />
            case 3:<br />
                al_draw_text(fonte, al_map_rgb(255, 255, 255), LARGURA_TELA / 2,<br />
                        ALTURA_TELA / 2 - al_get_font_ascent(fonte) / 2,<br />
                        ALLEGRO_ALIGN_CENTRE, &quot;Seta esquerda&quot;);<br />
                break;<br />
            case 4:<br />
                al_draw_text(fonte, al_map_rgb(255, 255, 255), LARGURA_TELA / 2,<br />
                        ALTURA_TELA / 2 - al_get_font_ascent(fonte) / 2,<br />
                        ALLEGRO_ALIGN_CENTRE, &quot;Seta direita&quot;);<br />
                break;<br />
            }</p>
<p>            tecla = 0;<br />
        }</p>
<p>        al_flip_display();<br />
    }</p>
<p>    al_destroy_display(janela);<br />
    al_destroy_event_queue(fila_eventos);</p>
<p>    return 0;<br />
}</p>
<p>bool inicializar()<br />
{<br />
    if (!al_init())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar a Allegro.\n&quot;);<br />
        return false;<br />
    }</p>
<p>    al_init_font_addon();</p>
<p>    if (!al_init_ttf_addon())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar add-on allegro_ttf.\n&quot;);<br />
        return false;<br />
    }</p>
<p>    if (!al_init_image_addon())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar add-on allegro_image.\n&quot;);<br />
        return false;<br />
    }</p>
<p>    if (!al_install_keyboard())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar o teclado.\n&quot;);<br />
        return false;<br />
    }</p>
<p>    janela = al_create_display(LARGURA_TELA, ALTURA_TELA);<br />
    if (!janela)<br />
    {<br />
        fprintf(stderr, &quot;Falha ao criar janela.\n&quot;);<br />
        return false;<br />
    }</p>
<p>    al_set_window_title(janela, &quot;Utilizando o Teclado&quot;);</p>
<p>    fonte = al_load_font(&quot;comic.ttf&quot;, 72, 0);<br />
    if (!fonte)<br />
    {<br />
        fprintf(stderr, &quot;Falha ao carregar \&quot;fonte comic.ttf\&quot;.\n&quot;);<br />
        al_destroy_display(janela);<br />
        return false;<br />
    }</p>
<p>    fila_eventos = al_create_event_queue();<br />
    if (!fila_eventos)<br />
    {<br />
        fprintf(stderr, &quot;Falha ao criar fila de eventos.\n&quot;);<br />
        al_destroy_display(janela);<br />
        return false;<br />
    }</p>
<p>    fundo = al_load_bitmap(&quot;bg.jpg&quot;);<br />
    if (!fundo)<br />
    {<br />
        fprintf(stderr, &quot;Falha ao carregar imagem de fundo.\n&quot;);<br />
        al_destroy_display(janela);<br />
        al_destroy_event_queue(fila_eventos);<br />
        return false;<br />
    }</p>
<p>    al_register_event_source(fila_eventos, al_get_keyboard_event_source());<br />
    al_register_event_source(fila_eventos, al_get_display_event_source(janela));</p>
<p>    return true;<br />
}

Bom, visivelmente podemos citar a mudança na estrutura do programa. Desta vez, isolamos todas as tarefas relativas a inicialização do programa em uma função, que retorna um valor booleano. Como estamos fazendo o programa em C, para utilizar o tipo booleano é necessário incluir o arquivo stdbool.h no início. Nas variáveis básicas de nosso programa, não temos nenhuma novidade – apenas o fato de que as declaramos como globais. Ao iniciar o programa, temos a nossa flag indicadora de saída e uma variável inteira chamada tecla que representará qual das setas pressionamos. Em seguida há uma chamada à função de inicialização, onde podemos destacar a inicialização do teclado, através da função al_install_keyboard() e a consequente vinculação dos eventos originados nele à nossa fila, através da função al_register_event_source() recebendo como argumento o retorno da função al_get_keyboard_event_source().

Após as inicializações, iniciamos o looping do nosso programa. Da mesma forma que o aplicativo do mouse (post anterior), verificamos a presença de eventos e, caso existam, fazemos o seu tratamento. Desta vez, estamos relevando os eventos do tipo ALLEGRO_EVENT_KEY_DOWN, que indicam quando o usuário pressionou alguma tecla do teclado. Através do campo keyboard do evento, temos acesso a diversos dados, que possivelmente usaremos em tutoriais futuros. Para este, comparamos o conteúdo de keycode, comparando com as constantes que representam todas as teclas. No caso do exemplo, comparamos somente com as setas, que é o que nos interessa. De acordo com o valor do keycode, atribuímos um determinado valor a essa variável.

Por fim, fazemos uma verificação sobre o conteúdo da variável tecla, para decidirmos o que deve ser escrito na tela. Caso seu valor seja 0, então não há necessidade de atualizar a tela.

O aplicativo rodando fica assim:

Para compilar, precisaremos de alguns add-ons, ficando assim:

  • Windows: -lallegro-5.0.4-mt -lallegro_font-5.0.4-mt -lallegro_ttf-5.0.4-mt -lallegro_image-5.0.4-mt
  • Linux: -lallegro -lallegro_font -lallegro_ttf -lallegro_image

Bem pessoal, é isso. Os dois arquivos utilizados no tutorial (fonte e fundo) podem ser baixados aqui. Como podem perceber, desde que o conceito estrutural da biblioteca Allegro esteja fixado, o aprendizado de novas funcionalidades acaba se tornando natural e bem mais fácil.

Então, até a próxima!