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 <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>

#include <stdio.h>
#include <stdbool.h>

const int LARGURA_TELA = 640;
const int ALTURA_TELA = 480;

ALLEGRO_DISPLAY *janela = NULL;
ALLEGRO_EVENT_QUEUE *fila_eventos = NULL;

bool inicializar();

int main(void)
{
    bool sair = false;

    if (!inicializar())
    {
        return -1;
    }

    float raio = 30.0;
    float x = raio;
    float y = raio;
    int dir_x = 1, dir_y = 1;

    while (!sair)
    {
        if (!al_is_event_queue_empty(fila_eventos))
        {
            ALLEGRO_EVENT evento;
            al_wait_for_event(fila_eventos, &evento);

            if (evento.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
            {
                sair = true;
            }
        }

        al_draw_filled_circle(x, y, raio, al_map_rgb(255, 0, 0));
        al_flip_display();
        al_clear_to_color(al_map_rgb(0, 0, 0));
        x += 1.0 * dir_x;
        y += 1.0 * dir_y;        

        if (x >= LARGURA_TELA - raio)
        {
            dir_x = -1;
            x = LARGURA_TELA - raio;
        } else if (x <= raio) {
            dir_x = 1;
            x = raio;
        }

        if (y >= ALTURA_TELA - raio)
        {
            dir_y = -1;
            y = ALTURA_TELA - raio;
        } else if (y <= raio) {
            dir_y = 1;
            y = raio;
        }

        al_rest(0.005);
    }

    al_destroy_event_queue(fila_eventos);
    al_destroy_display(janela);

    return 0;
}

bool inicializar()
{
    if (!al_init())
    {
        fprintf(stderr, "Falha ao inicializar Allegro.\n");
        return false;
    }

    if (!al_init_primitives_addon())
    {
        fprintf(stderr, "Falha ao inicializar add-on allegro_primitives.\n");
        return false;
    }

    janela = al_create_display(LARGURA_TELA, ALTURA_TELA);
    if (!janela)
    {
        fprintf(stderr, "Falha ao criar janela.\n");
        return false;
    }

    al_set_window_title(janela, "Animando!!!");

    fila_eventos = al_create_event_queue();
    if (!fila_eventos)
    {
        fprintf(stderr, "Falha ao criar fila de eventos.\n");
        al_destroy_display(janela);
        return false;
    }

    al_register_event_source(fila_eventos, al_get_display_event_source(janela));

    return true;
}

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

7 comentários sobre “Tutorial Allegro 5 #9 – Animações

  1. Romoaldo rodrigues

    Por favor me ajude.
    Preciso fazer um ponteiro de um velocimetro girar em uma animação,
    mas naum sei q comando usar.

    Pode me ajudar?

  2. Lich

    Esse código não está totalmente correto, né?

    deveria ser(?):
    (…)
    int dir_x = 1, dir_y = 1;
    x += 1.0 * dir_x;
    y += 1.0 * dir_y;
    (…)

    Estou curtindo o tutorial, você está de parabens.
    Quando terminar um game, posto o link por aqui.

  3. Otávio Henrique Fonseca

    Boa tarde amigo, parabéns pelo blog ae. Tenho q fazer um pong, mas as minhas palhetas não recebem o comando de movimentar, comparei com um outro exemplo e parece estar tudo certo. 🙁 Se tiver como me ajudar manda um email para otaviohpf@hotmail.com que eu lhe respondo com o código. Obrigado.

  4. Olá Rafael, saberia me dizer como eu poderia criar vários círculos, mas estes círculos em movimentos aleatórios, e eles não “batem” nas laterias , ao sair do lado direito da tela, o círculo reaparece do lado direito e vice -versa. Obrigado.

Deixe uma resposta