Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: 'Rares'
http://rares.tk
Biblioteki C++

Obsługa zdarzeń

[kurs] Rozdział 6. Obsługa zdarzeń.

Obsługa zdarzeń

Przez poprzednie lekcje zauważyłeś, że wszystkie programy uruchamiają się i po 2 sekundach wyłączają. Odpowiadała za to funkcja SDL_Delay, którą wywoływaliśmy z argumentem liczbowym podanym w nawiasach. Nasze programy uruchamiały się na 2 sekundy, lecz liczba wpisana w argumencie funkcji wynosiła 2000. Nie są to sekundy, lecz milisekundy, które po przeliczeniu dają wartość 2 sekund. Wszystkie dzisiejsze programy można zamknąć, wciskając przycisk X, który zawsze jest w okienku. Nasze programy nie mają takiej funkcji, co jest bardzo uciążliwe. Wyobraź sobie, co by było, gdybyś stworzył grę, która wyłączałaby się po kilku sekundach, powiedzmy po 3600, czyli po godzinie. A co jeśli użytkownik chciałby grać dłużej? Musiałby uruchamiać grę ponownie. Inny użytkownik chciałby zagrać tylko pół godziny. Musiałby wtedy wyłączać aplikację przez menedżer zadań, co byłoby bardzo uciążliwe. Dlatego ktoś bardzo mądry wpadł na pomysł pisania aplikacji, które można minimalizować, maksymalizować lub zamykać, co bardzo ułatwia m.in. granie. Na dzisiejszej lekcji nauczysz się obsługi zdarzeń, którymi można kontrolować działanie aplikacji. Będzie to bardzo prosty przykład, więc lekcja powinna być krótka i przyjemna. Tradycyjnie kod:

C/C++
#include <SDL.h>
SDL_Surface * ekran = NULL;
SDL_Event zdarzenie;
bool wyjscie = false;

int main( int argc, char * args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );
    ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    SDL_WM_SetCaption( "Zdarzenia", NULL );
    SDL_Flip( ekran );
    while( !wyjscie )
    {
        while( SDL_PollEvent( & zdarzenie ) )
        {
            if( zdarzenie.type == SDL_QUIT )
            {
                wyjscie = true;
            }
        }
    }
    SDL_Quit();
    return 0;
}

Zaraz na początku pojawia się nowa zmienna: SDL_Event zdarzenie;Jest to zmienna, która posłuży nam do sprawdzania czy i jakie zdarzenie wystąpiło.

bool wyjscie = false; - później definiujemy zmienną typu bool o nazwie wyjscie. Posłuży nam ona do sprawdzania czy program ma być zamknięty. Na razie ma wartość false, dzięki czemu program od razu po włączeniu nie wyłączy się. Dalej, to co już znasz i w końcu pojawia się nowa funkcja:

SDL_WM_SetCaption("Zdarzenia",NULL);. Dzięki niej nadajemy oknu nazwę, która jest podana w cudzysłowie. Drugi argument to informacja na temat ikony, która pojawia się przy nazwie. Jest to ta mała ikonka. Na razie nie chcemy mieć ikonki, więc podajmy tam wartość NULL (zero). Następnie pojawia się pętla. Pętla będzie się wykonywała dopóki zmienna wyjscie ma wartość fałszywą, czyli zerową. Ta zmienna jak wiesz służy do kontrolowania czy program ma być zamknięty. Oto najważniejsza część kodu:

C/C++
while( !wyjscie )
{
    while( SDL_PollEvent( & zdarzenie ) )
    {
        if( zdarzenie.type == SDL_QUIT )
        {
            wyjscie = true;
        }
    }
}

W środku pojawia się zagnieżdżona pętla, która tym razem wykonuje się dopóki otrzymywane są komunikaty. W warunku podajemy funkcję:

SDL_PollEvent(&zdarzenie). Ta funkcja odbiera zdarzenia. W argumencie funkcji podajemy adres obiektu zdarzenie, który jak wiesz jest typu SDL_Event i służy właśnie do zdarzeń. Potem mamy instrukcję warunkową, która sprawdza czy użytkownik nie zamknął programu. Najpierw podajemy zmienną typu SDL_Event, potem po kropce typ zdarzenia. My chcemy sprawdzić czy nie wystąpiły zdarzenia ogólne (minimalizacja, zamknięcie etc.), więc podajemy słowo kluczowe type. Kropkę podajemy dlatego, że jest to struktura. Po znaku równości podajemy rodzaj tego zdarzenia. W tym programie sprawdzamy czy użytkownik nie zakończył działania programu. SDL_QUIT to flaga oznaczająca zamknięty program. Jeśli takie zdarzenie wystąpiło (czyli kliknięcie użytkownika w X w celu zamknięcia okna) to program zmienia wartość zmiennej wyjście z fałszywej na prawdziwą. Wewnętrzna pętla jest przerywana co każdy obieg, o ile program nic nie robi. Kiedy ruszasz myszką, klikasz lub wciskasz coś na klawiaturze pętla ta jest ciągle kontynuowana. Kiedy nic nie będziesz robił, np. nie będziesz ruszał myszką to pętla ta jest przerywana i sprawdzany jest warunek pętli zewnętrznej. Aby mieć pewność, że się tego nauczysz, przeczytaj opis obiegu pętli:

  • 1. Program zaczyna obieg pętli, która wykonuje się dopóki zmienna wyjscie jest nieprawdziwa.
  • 2. Następuje obieg kolejnej pętli, której wykonuje się dopóki program wysyła komunikaty.
  • 3. Program sprawdza czy użytkownik nie zakończył programu.
  • 4. Jeśli tak, następuje zmiana wartości wyjscie na true.
  • 5. Pętla odbierająca komunikaty jest przerywana.
  • 6. Jeśli zmienna wyjscie ma wartość prawdziwą, to pętla główna jest przerywana, jeśli nie powrót do punktu pierwszego.

W poprzednich lekcjach programy, które pisałeś wyłączały się po 2 sekundach. Ten program działa dopóki go nie zamkniesz. Przyznasz, że w końcu programy działają tak jak powinny, bo kto pisze gry/programy, które wyłączają się po kilku sekundach?
Poprzedni dokument Następny dokument
Trochę więcej o sprite'ach Obsługa klawiatury