Omówienie
Skoro znasz już zagadnienie związane z eventami, czas omówić czym są i jak działają timery. Timer jest źródłem eventowym które w regularnych odstępach czasu generuje event. Wykorzystuje się je do regulacji czasu działania kodu. Przykładowo generowanie FPS, czy dostosowanie prędkości animacji postaci w grze.
Wyjaśnienie funkcji
Funkcje dotyczące timerów które omówię poniżej, znajdziesz w
oficjalnej dokumentacji.
ALLEGRO_TIMER * al_create_timer( double speed_secs )
Za pomocą powyższej funkcji, tworzymy timer allokując dla niego pamięć. Jako parametr podajemy czas (wartość dodatnią), co jaki ma być generowany event. Funkcja w razie powodzenia zwraca wskaźnik na obiekt timera, w razie niepowodzenia zwraca
NULL. Timer domyślnie jest zastopowany.
ALLEGRO_TIMER
Obiekt w którym przechowujemy adres timera, dla dalszych operacji na nim.
void al_start_timer( ALLEGRO_TIMER * timer )
Za pomocą powyższej funkcji, startujemy timer który podamy w parametrze.
void al_register_event_source( ALLEGRO_EVENT_QUEUE * queue, al_get_timer_event_source( ALLEGRO_TIMER * timer ) )
Za pomocą połączenia powyższych dwóch funkcji. Jednej rejestrującej źródło eventowe, drugiej pobierające źródło eventowe od timera. Rejestrujemy timer w kolejce.
void al_destroy_timer( ALLEGRO_TIMER * timer )
Skoro na początku allokujemy pamięć dla timera. Gdy przestajemy go już potrzebować, należy zwolnic pamięć za pomocą powyższej funkcji. Funkcja przed zwolnieniem pamięci stopuje timer.
Przykład użycia
Zwróć uwagę na komentarze, tłumaczą kod.
#include <stdio.h>
#include <allegro5/allegro.h>
int main( int argc, char * argv[] )
{
ALLEGRO_DISPLAY * display = NULL;
ALLEGRO_EVENT_QUEUE * kolejka = NULL;
ALLEGRO_EVENT ev1;
ALLEGRO_TIMER * timer_FPS = NULL;
int done = 0;
if( !al_init() )
{
fprintf( stderr, "Failed to initialize allegro!\n" );
return - 1;
}
kolejka = al_create_event_queue();
if( kolejka == NULL )
{
fprintf( stderr, "Failed to create event queue!\n" );
return - 1;
}
timer_FPS = al_create_timer( 1.0 / 30 );
if( !timer_FPS )
{
fprintf( stderr, "Failed to create FPS timer!\n" );
return - 1;
}
al_register_event_source( kolejka, al_get_timer_event_source( timer_FPS ) );
display = al_create_display( 640, 480 );
if( display == NULL )
{
fprintf( stderr, "Failed to create display!\n" );
return - 1;
}
al_register_event_source( kolejka, al_get_display_event_source( display ) );
al_start_timer( timer_FPS );
while( !done )
{
al_wait_for_event( kolejka, & ev1 );
switch( ev1.type )
{
case ALLEGRO_EVENT_DISPLAY_CLOSE:
done = 1;
break;
case ALLEGRO_EVENT_TIMER:
al_clear_to_color( al_map_rgb( 20, 75, 80 ) );
al_flip_display();
break;
default: break;
}
}
al_destroy_display( display );
al_destroy_event_queue( kolejka );
al_destroy_timer( timer_FPS );
return 0;
}
Powyższy przykład przedstawia generowanie regularnego FPS. Możesz sprawdzić to za pomocą darmowej wersji programu
Fraps.
Dodatkowe informacje
Gdy zajrzysz do dokumentacji w zakładce Timer, spotkasz dodatkowe funkcje. Między innymi dostajesz makra dla konwersji czasu, możliwość stopowania i wznawiania timera. Manipulację prędkością generowania przez timer eventów oraz zarządzanie zmienną licznika timera.
Gdy będziesz potrzebować zastosować więcej niż jeden timer, mimo sprawdzenia typu eventu. Należy również odczytać z struktury eventu,
ID timera.