Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Michał Kozakiewicz (michal3)
Biblioteki C++

Timery, regulacja czasu

[lekcja]

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.

C/C++
#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;
   
    /* Tworzymy obiekt w którym przetrzymamy adres timera,
         * oraz zmienną na potrzebę zatrzymania pętli while */
    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;
    }
   
    /* Tworzymy timer, obsługujemy błąd i  rejestujemy go w kolejce */
    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 ) );
   
   
    /* Startuj timer */
    al_start_timer( timer_FPS );
   
    /* Główna pętla */
    while( !done )
    {
        al_wait_for_event( kolejka, & ev1 );
       
        /* Jeżeli pojawi się event, wybierz co należy wykonać */
        switch( ev1.type )
        {
        case ALLEGRO_EVENT_DISPLAY_CLOSE:
            done = 1;
            break;
           
        case ALLEGRO_EVENT_TIMER: /* Dla eventu od timera, odświerz display */
            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 );
   
    /* Zwolnij pamięć timera */
    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.
Poprzedni dokument Następny dokument
Zdarzenia i kolejka zdarzeń Kurs GTK+, C++