Classe de Timer para Allegro

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. Fontes TTF no Allegro
  4. MotionBlur com Allegro
  5. Fade In/Out com fblend no Allegro

8 Comments

  • sam123
    08/01/2008 - 09:49 | Permalink

    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.

  • crocidb
    11/01/2008 - 13:50 | Permalink

    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

  • 12/01/2008 - 02:49 | Permalink

    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

  • crocidb
    12/01/2008 - 03:48 | Permalink

    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!

  • paulof
    27/06/2009 - 17:45 | Permalink

    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! =/

  • 27/06/2009 - 17:52 | Permalink

    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.

  • paulof
    27/06/2009 - 18:01 | Permalink

    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

  • Marco
    12/09/2009 - 03:39 | Permalink

    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

    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>