Você está na página 1de 5

http://www.bdjogos.com/biblioteca_conteudo.php?

id=16

Controle de Tempo
Todas as linguagens de programao tem acesso a algum componente ou controle de tempo. No windows, desde que a janela aberta, o sistema operacional comea a contar o tempo que ela esta aberta em clocks de mquina. Poder usar esses componentes de tempo muito importante em qualquer jogo. Eles servem para fazer animaes, 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 funo. http://www.bdjogos.com/adrw/c/ponteirofuncoes.htm

DICA...
As rotinas de tempo so utilizadas para substituir as paradas de cdigo "comando rest()" ou os gotos do basic. Por isso no muito aconselhvel utilizar o comando rest() em seu jogos.

install_timer Esta funo precisa ser chamada no nicio do programa para que seja habilitado a utilizao de timers do allegro. Funciona assim como o install_keyboard().

remove_timer Remove todo e qualquer controle de tempo. Esta funo chamada automaticamente no final do programa pelo comando allegro_exit();

install_int Esta a nossa funo chave, esta funo serve para instalar um timer handler. Ela possu dois parmetros: int install_int(void (*proc)(), int speed); O primeiro um ponteiro para uma funo. No primeiro parametros voc precisa informar o nome de uma funo que uma funo que retorna um void sem parametros que ser executada vrias 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 ?

1 de 5

14/11/2008 14:41

http://www.bdjogos.com/biblioteca_conteudo.php?id=16

Imagine um Handler como um ponteiro, s que ele no aponta para um endereo de memria e sim para um servio ( que pode ser um servio de seu programa, de outro programa ou do sistema operacional ).

VOC PRECISA SABER...


Chamar novamente a funo com o primeiro parametro igual faz com que o handler timer seje recriado ( havendo modificao do segundo parametro ), substituindo assim o controlador de tempo anterior. Desta forma, no podemos ter dois handlers de tempo para uma mesma funo. Exemplo: No exemplo abaixo.. fazemos com que uma varivel seja incrementada apos 5 segundos. Como esta funo 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.

CDIGO...
#include <allegro.h> int vcontador; // prototipo void contador(); int main() { allegro_init(); set_color_depth(16); install_keyboard(); set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0); install_timer(); install_int( contador, 5000 );

int vcontador = 0; // Lao principal while( !key[KEY_ESC] ) { vcontador = ::vcontador; clear( screen ); textprintf_ex( screen, font, 10, 10, makecol(255,0,0), -1, "Variavel Contador: %d", vcontador ); vsync(); }

allegro_exit(); return 0; } END_OF_MAIN(); void contador() { ::vcontador++; }

FIM DO CDIGO

2 de 5

14/11/2008 14:41

http://www.bdjogos.com/biblioteca_conteudo.php?id=16

install_int_ex Esta uma funo modificadora da funo original. Ela aceita parametros personalizados e tambm 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 Milhes de clock ticks ( ciclos do processador ) por segundo. Computadores modernos rodam muito mais rpido que 66MHz mais todo PC pode executar apenas 1 instruo 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 nmero em segundos entre cada clock tick MSEC_TO_TIMER(msec) - Pega o nmero em milisegundos entre cada clock tick. Usar este parametro deixa a funo install_int_ex igual a funo install_int. BPS_TO_TIMER(bps) - Pega o nmero de clock tick a cada segundo BPM_TO_TIMER(bpm) - Pega o nmero 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 variveis e funes utilizados pelos install_int devem ser bloqueadas com as macros LOCK_VARIABLE. Caso seu programa no esteje contando corretamente, leia sobre isto em: http://www.allegro.cc/manual/api/timer-routines/install_int_ex

remove_int Esta funo remove um handler regitrado para a funo enviada por parametro. Exemplo : install_int_ex( funcao1, SECS_TO_TIMER(10) ); // cria contador remove_int( funcao1 ); // remove o contador que executava a funcao1

3 de 5

14/11/2008 14:41

http://www.bdjogos.com/biblioteca_conteudo.php?id=16

install_param_int e install_param_int_ex O prototipo da funo assusta: int install_param_int(void (*proc)(void *), void *param, int speed); a mesma coisa que o install_int porm, com uma grande diferena de que voc pode passar um parametro para essa funo. ( E usar os modificadores no install_param_int_ex ). Como esse parametro um void, voc poder passar qualquer tipo, fazendo a converso antes e depois para poder usar os tipos. Essa funo um pouco complexa, por isso vou dar um exemplo completo da utilizao. 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.

CDIGO...
#include <allegro.h> #include <iostream> int vcontador; // prototipo void contador( void * ); int main() { allegro_init(); set_color_depth(16); install_keyboard(); set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0); install_timer(); int total = 5; install_param_int( contador, (void *)&total, 5000 );

int vcontador = 0; // Lao principal while( !key[KEY_ESC] ) { vcontador = ::vcontador; clear( screen ); textprintf_ex( screen, font, 10, 10, makecol(255,0,0), -1, "Variavel Contador: %d", vcontador ); vsync(); }

allegro_exit(); return 0; } END_OF_MAIN(); void contador( void *b) { ::vcontador++; int *c = (int *)b; int a = (*c); if ( ::vcontador == a ) { remove_param_int( contador, (void *)b ); } }

FIM DO CDIGO

remove_param_int

4 de 5

14/11/2008 14:41

http://www.bdjogos.com/biblioteca_conteudo.php?id=16

Esta funo remove um handler regitrado para a funo enviada por parametro. Exemplo : install_param_int( contador, (void *)&total, 5000 ); // cria contador remove_param_int( contador, (void *)b ); // remove o contador que executava a contador

rest Esta funo faz com que o programa espere pelo tempo especificado no parametro. void rest(unsigned int time); Exemplo : rest( 5000 ); // espera 5 segundos

rest_callback Esta funo faz com que o programa espere pelo tempo especificado no parametro, durante a espera, ela executa a funo enviada no segundo parametro. void rest_callback(long time, void (*callback)()) A funo enviada tem que ser void e nao pode ter parametros. Exemplo : rest_callback( 10000, pause ); // espera 10 segundos e enquanto isso executa a funo pause

Contribuidor Adriano Waltrick 14/08/2007 Voltar 01/06/2007 (C) Copyright. Todos os Direitos Reservados. Leia a poltica de privacidade do portal. proibida a cpia de contedo deste site de acordo com a Lei Brasileira de Direitos Autorais.

5 de 5

14/11/2008 14:41