Tutorial Allegro 5 #9 – Animações

Padrão

Olá! No post de hoje, não teremos necessariamente nenhum conceito novo sobre a biblioteca Allegro 5. Na verdade, vou mostrar como fazer uma animação simples, utilizando funções que já vimos nos posts anteriores. Vocês verão que, com o que já viram, já dá pra começar a bolar um jogo simples!

Bom, nosso aplicativo consiste em um círculo vermelho se movendo pela tela, e sendo rebatido caso toque as bordas da tela. Simplesmente isso, mas já será possível de entender o princípio das animações. Vamos dar uma olhada no código:

#include &lt;allegro5/allegro.h&gt;<br />
#include &lt;allegro5/allegro_primitives.h&gt;</p>
<p>#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;</p>
<p>bool inicializar();</p>
<p>int main(void)<br />
{<br />
    bool sair = false;</p>
<p>    if (!inicializar())<br />
    {<br />
        return -1;<br />
    }</p>
<p>    float raio = 30.0;<br />
    float x = raio;<br />
    float y = raio;<br />
    int dir_x = 1, dir_y = 1;</p>
<p>    while (!sair)<br />
    {<br />
        if (!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_DISPLAY_CLOSE)<br />
            {<br />
                sair = true;<br />
            }<br />
        }</p>
<p>        al_draw_filled_circle(x, y, raio, al_map_rgb(255, 0, 0));<br />
        al_flip_display();<br />
        al_clear_to_color(al_map_rgb(0, 0, 0));<br />
        x += 1.0 * dir_x;<br />
        y += 1.0 * dir_y;        </p>
<p>        if (x &gt;= LARGURA_TELA - raio)<br />
        {<br />
            dir_x = -1;<br />
            x = LARGURA_TELA - raio;<br />
        } else if (x &lt;= raio) {<br />
            dir_x = 1;<br />
            x = raio;<br />
        }</p>
<p>        if (y &gt;= ALTURA_TELA - raio)<br />
        {<br />
            dir_y = -1;<br />
            y = ALTURA_TELA - raio;<br />
        } else if (y &lt;= raio) {<br />
            dir_y = 1;<br />
            y = raio;<br />
        }</p>
<p>        al_rest(0.005);<br />
    }</p>
<p>    al_destroy_event_queue(fila_eventos);<br />
    al_destroy_display(janela);</p>
<p>    return 0;<br />
}</p>
<p>bool inicializar()<br />
{<br />
    if (!al_init())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar Allegro.\n&quot;);<br />
        return false;<br />
    }</p>
<p>    if (!al_init_primitives_addon())<br />
    {<br />
        fprintf(stderr, &quot;Falha ao inicializar add-on allegro_primitives.\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;Animando!!!&quot;);</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>    al_register_event_source(fila_eventos, al_get_display_event_source(janela));</p>
<p>    return true;<br />
}

Bom, a princípio vocês podem perceber que não há funções novas. Realmente, tudo que está aí já foi visto nos tutoriais anteriores. O que podemos destacar então? As variáveis de controle presentes em nossa função main(). Temos a variável raio que define o raio de nosso círculo, as variáveis x e y que representam as coordenadas da tela onde o círculo será desenhado, e as variáveis dir_x e dir_y que servem de referencial de direção do movimento do círculo. Dentro do looping principal, após o tratamento do evento de fechar a janela, temos a parte que realmente nos interessa. Desenhamos o círculo na posição referente às variáveis x e y. Logo após, atualizamos a tela e a apagamos, para criar o efeito de animação (animação = várias imagens estáticas sendo exibidas uma após a outra). Após isso, incrementamos o valor das variáveis x e y para movimentar o círculo, realizando uma multiplicação pela direção (para movimentar o círculo no sentido correto).

Pra finalizar a lógica, fazemos duas verificações, para evitar que o círculo saia da janela. Assim, invertemos o sentido quando o círculo atinge algum dos limites da tela, fazendo com que ele seja rebatido para o sentido oposto.

Assim, nossa “obra de arte” fica mais ou menos assim:

Pra linkar, adicionamos a biblioteca Allegro e o add-on de primitivas:

  • Windows: -lallegro-5.0.5-mt -lallegro_primitives-5.0.5-mt
  • Linux: -lallegro -lallegro_primitives

Bom, é isso então! Acredito que com os conceitos que vimos até agora, já dá pra fazer algumas coisas bem legais! Então… divirtam-se! 😀