Conheça a iniciativa da Biblioteca dos Desenvolvedores
Índice da Biblioteca
Área dos Usuários
Fórum de Discussão
Controle de Tempo
Todas as linguagens de programação tem acesso a algum componente ou controle de tempo.
No windows, desde que a janela é aberta, o sistema operacional começa a contar o tempo que ela esta aberta em clocks de máquina.
Poder usar esses componentes de tempo é muito importante em qualquer jogo. Eles servem para fazer animações, controlar o tempo de jogabilidade ou mesmo o tempo de alguma fase.
VOCÊ PRECISA
SABER...
Para usar o controle de tempo do allegro, precisamos conhecer como funciona um ponteiro para função.
As rotinas de tempo são utilizadas para substituir as paradas de código "comando rest()" ou os gotos do basic.
Por isso não é muito aconselhável utilizar o comando rest() em seu jogos.
install_timer
Esta função precisa ser chamada no ínicio do programa para que seja habilitado a utilização de timers do allegro.
Funciona assim como o install_keyboard().
remove_timer
Remove todo e qualquer controle de tempo. Esta função é chamada automaticamente no final do programa pelo comando allegro_exit();
install_int
Esta é a nossa função chave, esta função serve para instalar um timer handler.
Ela possuí dois parâmetros:
int install_int(void (*proc)(), int speed);
O primeiro é um ponteiro para uma função.
No primeiro parametros você precisa informar o nome de uma função que é uma função que retorna um void sem parametros que será executada várias vezes no tempo determinado pelo segundo parametro.
E o segundo é a velocidade do contador de tempo em milisegundos, onde 1 segundo é igual a 1000 milisegundos.
VOCÊ PRECISA
SABER...
O que é um handler ?
Imagine um Handler como um ponteiro, só que ele não aponta para um endereço de memória e sim para um serviço ( que pode ser um serviço de seu programa, de outro programa ou do sistema operacional ).
VOCÊ PRECISA
SABER...
Chamar novamente a função com o primeiro parametro igual faz com que o handler timer seje recriado ( havendo modificação do segundo parametro ), substituindo assim o controlador de tempo anterior.
Desta forma, não podemos ter dois handlers de tempo para uma mesma função.
Exemplo:
No exemplo abaixo.. fazemos com que uma variável seja incrementada apos 5 segundos.
Como esta função é controlada pelo hardware, ela pode funcionar contando o tempo mais rapido em alguns computadores ou o tempo mais lento em outros. Veremos como usar macros para controlar isto. CÓDIGO...#include <allegro.h>
Esta é uma função modificadora da função original.
Ela aceita parametros personalizados e também tem sua velocidade controlada pelo hardware( clock ticks ).
VOCÊ PRECISA
SABER...
Clock Tick é a menor unidade reconhecida por um dispositivo computacional.
Geralmente um clock tick se refere ao sistema de clock principal, que pode rodar a 66MHz ou,
66 Milhões de clock ticks ( ciclos do processador ) por segundo.
Computadores modernos rodam muito mais rápido que 66MHz mais todo PC pode executar apenas 1 instrução em 1 clock tick ( ciclo ).
O Allegro nos deixa converter o formato de hardware com a ajuda dos seguintes macros, que podem ser utilizadas como o segundo parametro:
SECS_TO_TIMER(secs) - Pega o número em segundos entre cada clock tick
MSEC_TO_TIMER(msec) - Pega o número em milisegundos entre cada clock tick.
Usar este parametro deixa a função install_int_ex igual a função install_int.
BPS_TO_TIMER(bps) - Pega o número de clock tick a cada segundo
BPM_TO_TIMER(bpm) - Pega o número de clock tick a cada minuto
Exemplo:
// a cada 10 segundos
install_int_ex( funcao1, SECS_TO_TIMER(10) );
// a cada 10 segundos( 10000 milisegundos )
install_int_ex( funcao1, MSEC_TO_TIMER(10000) );
// a cada 1000 clock tick por segundo
install_int_ex( funcao1, BPS_TO_TIMER(1000) );
// a cada 100000 clock tick por minuto
install_int_ex( funcao1, BPM_TO_TIMER(100000) );
VOCÊ PRECISA
SABER...
Se você usa um compilador que roda em DOS modo protegido como o DJGPP, as variáveis e funções utilizados pelos install_int devem ser bloqueadas com as macros LOCK_VARIABLE.
Caso seu programa não esteje contando corretamente, leia sobre isto em:
Esta função remove um handler regitrado para a função enviada por parametro.
Exemplo :
install_int_ex( funcao1, SECS_TO_TIMER(10) ); // cria contador remove_int( funcao1 ); // remove o contador que executava a funcao1
install_param_int e install_param_int_ex
O prototipo da função assusta:
int install_param_int(void (*proc)(void *), void *param, int speed);
É a mesma coisa que o install_int porém, com uma grande diferença de que você pode passar um parametro para essa função. ( E usar os modificadores no install_param_int_ex ).
Como esse parametro é um void, você poderá passar qualquer tipo, fazendo a conversão antes e depois para poder usar os tipos. Essa função é um pouco complexa, por isso vou dar um exemplo completo da utilização.
Exemplo :
No exemplo abaixo, instalamos um timer que incrementa um contador a cada 5 segundos.
Quando este contador chegar a 5, fizemos com que o timer seja desligado.