Tag Archives: classe

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

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