Como eu disse no artigo de Timer no Allegro, eu vou postar uma classe que eu fiz para auxiliar o trabalho com timers.

Para utilizar, basta fazer assim:

CTimer *timer1 = new CTimer(SECS_TO_TIMER(1)); // Timer para 1 segundo

Eu criei o timer, porém ele ainda não está contando, para iniciar ele, faça assim:

timer1->Start();

Para pausar:

timer1->Pause();

Para pegar a contagem:

timer1->getCount();

Para resetar o contador:

timer1->Reset();

Vou citar também o método getStatus, que retorna o status atual do Timer, TIMER_PAUSED, se ele estiver pausado e TIMER_STARTED se ele estiver funcionando.

Está bem simples, porém é bem útil! =D

Aqui está o código:
CTimer.h

/***************************************************\
**            Desenvolvido por CrociDB             **
**                                                 **
** Voce pode usar a vontade este codigo, desde que **
**  coloque os devidos creditos ao autor original. **
**                                                 **
**   Nao me resposabilizo por seus atos com este   **
**                      codigo.                    **
**                                                 **
\***************************************************/

#include <allegro.h>

#define TIMER_PAUSED                0
#define TIMER_STARTED               1

class CTimer
{
private:
    int         iCount;
    int         velocidade;
    int         status;

    static void update(void *param);

public:
                CTimer(int vel);
                ~CTimer();

    void        Start();
    void        Pause();
    int         getCount();
    void        Reset();
    int         getStatus();
    void        desc();
};

CTimer.cpp

/***************************************************\
**            Desenvolvido por CrociDB             **
**                                                 **
** Voce pode usar a vontade este codigo, desde que **
**  coloque os devidos creditos ao autor original. **
**                                                 **
**   Nao me resposabilizo por seus atos com este   **
**                      codigo.                    **
**                                                 **
\***************************************************/

#include "CTimer.h"

CTimer::CTimer(int vel)
{
    this->velocidade = vel;

    iCount = 0;
    status = TIMER_PAUSED;

    LOCK_VARIABLE(iCount);
    LOCK_FUNCTION(update);
}

void CTimer::update(void *param)
{
    CTimer *pthis = (CTimer*)param;
    ++(pthis->iCount);
} END_OF_FUNCTION(update)

void CTimer::Start()
{
    install_param_int(CTimer::update, this, velocidade);
    status = TIMER_STARTED;
}

void CTimer::Pause()
{
    remove_param_int(CTimer::update, this);
    status = TIMER_PAUSED;
}

int CTimer::getCount()
{
    return this->iCount;
}

void CTimer::Reset()
{
    this->iCount = 0;
}

int CTimer::getStatus()
{
    return status;
}

void CTimer::desc()
{
    this->iCount--;
}

CTimer::~CTimer()
{
    remove_param_int(CTimer::update, this);
}

Eu uso ele em quase todos os meus projetos, e você pode usar a vontade! hihihi

Valeu, qualquer dúvida posta aeeew! =D

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. Timer no Allegro
  2. Classe pra Animação em Allegro
  3. MotionBlur com Allegro
  4. Fontes TTF no Allegro
  5. Fade In/Out com fblend no Allegro

8 Responses to “Classe de Timer para Allegro”

  1. sam123 Says:

    A minha é bem parecida, mas eu na interrupção instalada, em vez de incrementar uma unidade a variável que “conta” o tempo, eu somo ao valor dela velocidade. Desse jeito iCount, armazena o valor “real” do tempo passado. Não sei se me expliquei bem.

  2. crocidb Says:

    Ah Tá! Entendi!

    Dessa forma também é bem interessante!

    O que eu esqueci de colocar nessa classe, são métodos para mudar e pegar a velocidade… hehehe

    Vlw

  3. Diego Says:

    Bacana a classe, mas eu tenho uma dica. Ao invés de um #define para TIMER_PAUSED/STARTED, seria mais interessante criar um tipo enum. Dessa forma o código se encaixaria melhor no padrão C++. Ficaria algo mais ou menos assim:

    typedef enum TimerStatus
    {
    TIMER_PAUSED,
    TIMER_STARTED
    };

    Bem, é só uma dica e você, obviamente, não tem que mudar nada. Espero que não me ache intrometido demais pra ficar palpitando no teu código :P

  4. crocidb Says:

    Pow Diego, valeu mesmo pela dica! Eu tinha pensado mesmo nisso quando postei aqui (por que faz um tempo que eu fiz essa classe), mas me deu preguiça de mudar! hehehe

    A dica está aí, quem quiser, sinta-se a vontade em mudar! =D

    Valeu mesmo cara!

  5. paulof Says:

    O iCount não conta! Fica sempre no zero…
    Eu criei um objeto CTimer e usei o Start()
    mas quando fui pegar o iCount retorna
    sempre ZERO! =/

  6. CrociDB Says:

    Hmm… você deve estar fazendo algo errado.

    Verifique o intervalo que está colocando no timer, talvez seja muito grande.

    E para pegar o resultado, utilize o getCount().

    Qualquer dúvida, só postar.

  7. paulof Says:

    Hmm, talvez eu esteja colocando o objeto
    em algum lugar errado?
    O intervalo é SECS_TO_TIMER(1), o objeto
    é instanciado e inicializado (Start()) dentro
    do main após o install_timer()…

    Se você pudesse me enviar uma utilização
    da classe, tenho 99% de certeza que eu
    que to errando hehe.. vlw

  8. Marco Says:

    Em vez de por CTimer *timer1 = new CTimer(SECS_TO_TIMER(1));
    ponha: CTimer *timer1 = new CTimer(1000);
    1000 seria 1 segundo

Leave a Reply

Powered by WP Hashcash

Web Analytics