Timer no Allegro

Tem muita coisa na internet sobre Timers no Allegro, a maioria ensina a mesma coisa, mas como a quantidade de perguntas nos fóruns sobre isso também é grande, eu resolvi postar aqui como uma referência, assim fica mais fácil pra postar o link! hehehe

Vamos lá então!

Timer (temporizador) é uma coisa de suma importância num jogo. Com ele você pode pegar e limitar o FPS (quadros por segundo) de um jogo, pode fazer missões com tempo, pode pegar o tempo que o jogador demorou para salvar o seu jogo, pode fazer contagens regressivas e milhares de outras coisas, a limitação é sua criatividade.

E com Allegro é bem simples criar um temporizador, com algumas linhas você já tem um timer! Nós vamos desenvolver o timer em C. Depois eu posto uma classe de Timer Pra C++ que eu fiz.

Em primeiro lugar, nós chamamos a função install_timer(); na inicialização do programa, depois criamos uma variável global e volatile, assim:

 volatile int count; // Variável Global

Essa variável vai ser incrementada a cada intervalo de tempo definido pelo nosso timer. Agora agente cria uma função que incrementa essa variável, pois o nosso timer funciona com callbacks, ou seja, ele chama uma função a cada intervalo de tempo, e como nós queremos que essa variável seja incrementada nesse intervalo, apenas definimos a função para incrementá-la.

void Conta()
{
   count++;
}
END_OF_FUNCTION(Conta);

LOCK_FUNCTION(Conta);
LOCK_VARIABLE(count);

Você pode ver algo de estranho aqui, essas três macros. Sim, elas são necessárias para não ter problemas com a memória, nunca se esqueça de colocá-las! =D

Agora nós criamos o nosso timer própriamente dito, é a função install_int_ex que instala um Thread (processo independente) a cada intervalo de tempo.

install_int_ex(Conta, SECS_TO_TIMER(1));

Como você pode ver, ele aceita dois parâmetros. O primeiro é a função a ser chamada, o outro é o intervalo de tempo, e que através da Macro SECS_TO_TIMER ele define para um segundo. Você pode usar outras macros, com a MSEC_TO_TIMER, que aceita milisegundos, tem outras também, veja o manual do Allegro.

Agora então você pode, por exemplo, mostrar na tela quantos segundos fazem que o usuário abriu o programa, assim:

textprintf_ex(buffer, font, 10, 10, 0xFFFFFF, -1, "Segundos: %i", count);

E não se esqueça de, no final do programa ou quando precisar parar o timer, chamar a função:

remove_int(Conta);

Pronto! Aí está o nosso timer simples! =D

Depois eu vou postar aqui uma classe que eu fiz de timer para C++, ficou muito simples de usá-la!

Até!

Google Buzz
Compartilhar: Share this post with the world.
  • Twitter
  • Posterous
  • Facebook
  • del.icio.us
  • Digg
  • Friendfeed
  • Google
  • LinkedIn
  • Reddit
  • StumbleUpon
  • Technorati

Posts semelhantes:

  1. Classe de Timer para Allegro
  2. Allegro 5
  3. Fontes TTF no Allegro
  4. Fade In/Out com Allegro
  5. Fade In/Out com fblend no Allegro

6 Comments

  • sam123
    07/01/2008 - 15:47 | Permalink

    O teu esforço é provável que ajuda muita gente lá na Unidev, seria interessante se você fixasse um tópico com esta tua entrada.
    Sobre eliminar os timers no final do programa, o Allegro elimina pra você, não é preciso usar remove_int.

  • crocidb
    07/01/2008 - 17:33 | Permalink

    Sim, ele remove, mas eu acho uma boa prática de programação removê-lo, por que assim você tem mais controle (frescura ^^), e foi também com intenção de dizer que você pode removê-lo e readicioná-lo normalmente! =D

    Vlwww aee pelo comentário! xD

  • Pingback: Classe de Timer para Allegro « CrociDBlog

  • pinuja
    09/01/2008 - 13:07 | Permalink

    Daeeew Croci!
    Muito útil esse tutorial, acabei de usar ele pra fazer um esqueminha aqui hehe ^^… eu tenho uma dúvida quanto ao LOCK_VARIABLE(var), ele é obrigado usar?… é que na função que to usando, ela não tem nenhuma variável contadora, a função só reseta algumas coisas no jogo… olha só:

    if( nViradas == 2 ){
    LOCK_FUNCTION(resetaVirou);
    install_int_ex(resetaVirou, SECS_TO_TIMER(2));
    }

    e dentro da função resetaVirou eu uso o remove_int(resetaVirou); …

    Falow

  • crocidb
    11/01/2008 - 14:10 | Permalink

    Ah, você instala o timer para uma função que executa algumas funções e então se “auto-destroi”?

    Bom, nesse caso acho que não é necessário o uso da macro, por que você não está usando uma variável! =D

    Flw

  • Gamba
    27/10/2009 - 02:59 | Permalink

    baca o material, ficou bem explicadinho

  • Leave a Reply

    Your email address will not be published. Required fields are marked *

    *

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>