Inicjalizacja biblioteki SDL

Powrót do spisu treści

Wymagane jest zapoznanie się z następującymi podrozdziałami:

P019 - Pierwszy program dla Windows
OL031 - Instalacja biblioteki SDL w środowisku Dev-C++

 

Artykuł w PRZEBUDOWIE


SDL

Biblioteka SDL (ang. Simple Directmedia Layer) udostępnia programiście funkcje i typy danych, dzięki którym ma on prosty dostęp do podstawowych elementów systemu komputerowego, z których najczęściej korzysta się w programach graficznych. Celem naszych zajęć na kole informatycznym nie będzie nauka programowania całej biblioteki SDL (jest to zadanie skomplikowane i czasochłonne) - potraktujemy ją raczej jako narzędzie do nauki algorytmów graficznych i poznamy tylko w stopniu koniecznym do realizacji naszych celów.

Podstawowym członem biblioteki jest plik SDL.dll, czyli biblioteka dynamicznie ładowana w trakcie uruchomienia korzystającego z niej programu. Bez tego pliku nie będzie działał żaden program skompilowany pod SDL, dlatego powinien być umieszczony albo w katalogu uruchomieniowym programu, albo w katalogu systemowym Windows (C:\Windows\System32\).

Typowy program C++ wykorzystujący SDL posiada następującą budowę:

#include <SDL/SDL.h>

int main(int argc, char *argv[])
{

  ...

}

Funkcja main() musi być zdefiniowana w całości, wraz z typem i parametrami. Jeśli tego nie zrobisz, powstaną błędy etapu konsolidacji (łączenia kodu z biblioteką).

Projekt można wybrać jako aplikację Windows lub aplikację konsoli. W obu przypadkach należy wybrać opcję menu Projekt/Opcje projektu. W okienku dialogowym klikamy zakładkę Parametry i w okienku konsolidator wpisujemy poniższy tekst (można go przekopiować przez schowek Windows):

-lmingw32
-mwindows
-lSDLmain
-lSDL

Biblioteka SDL zawiera 8 podsystemów:

  1. Obsługa dźwięku - Audio
  2. Obsługa obrazu - Video
  3. Obsługa CDROM
  4. Obsługa Joysticka
  5. Obsługa liczników czasu - Timers
  6. Obsługa zdarzeń - Events Handling
  7. Obsługa plików - File I/O
  8. Obsługa wątków - Threading

Zanim wywołamy dowolną z funkcji biblioteki SDL, musimy ją koniecznie zainicjować. W tym celu na początku programu umieszczamy wywołanie funkcji inicjującej odpowiednie (wykorzystywane przez nasz program) podsystemy - SDL_Init(). Automatycznie inicjowane są trzy ostatnie - obsługa zdarzeń, plików oraz wątków. Pozostałe musimy jawnie podać. Każdy z podsystemów posiada odpowiednią stałą, którą można łączyć operatorem sumy logicznej | i przekazać funkcji SDL_Init() jako parametr:

SDL_INIT_VIDEO  - inicjalizacja podsystemu obrazu
SDL_INIT_AUDIO  - inicjalizacja podsystemu dźwięku
SDL_INIT_CDROM  - inicjalizacja podsystemu obsługi CDROM
SDL_INIT_JOYSTICK  - inicjalizacja podsystemu obsługi joysticka
SDL_INIT_TIMER  - inicjalizacja podsystemu liczników czasu
SDL_INIT_EVERYTHING  - inicjalizacja wszystkich wymienionych powyżej podsystemów
SDL_INIT_NOPARACHUTE  - zapobiega przechwytywaniu przez SDL sygnałów błędów fatalnych
SDL_INIT_EVENTTHREAD  - inicjalizacja podsystemu obsługi wątków

Na przykład załóżmy, iż mamy zamiar pracować z obrazem, dźwiękiem i joystickiem. Wywołanie funkcji SDL_Init() jest następujące:

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK);

Jeśli wywołanie SDL_Init() powiedzie się, to funkcja zwraca wartość 0. W przeciwnym razie zwracana jest wartość -1. Pozwala to w prosty sposób testować wynik inicjalizacji:

if(SLD_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK))
{
  ...  // coś poszło źle, tutaj kod wykonywany w razie błędu inicjalizacji podsystemów
}
else
{
  ...  // wszystko OK, tutaj kod korzystający z funkcji biblioteki SDL
}

W przypadku wystąpienia błędu w bibliotece SDL możemy wykorzystać funkcję SDL_GetError(), która zwraca łańcuch znakowy (jego adres) opisujący w języku angielskim rodzaj błędu. Na przykład tak (stosując funkcje systemowe Windows tracisz na przenośności aplikacji, zamiast MessageBox można po prostu zapisać wynik SDL_GetError w pliku tekstowym):

#include <SDL/SDL.h>
#include <windows.h>

int main(int argc, char *argv[])
{

  if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK))
    MessageBox(0, SDL_GetError(), "Błąd inicjalizacji SDL", MB_OK);
  else
  {
    ... // program główny
  }
}

Powyższy program wyświetli w przypadku błędu okienko wiadomości z opisem błędu, a po jego zatwierdzeniu przez użytkownika zakończy działanie aplikacji.

Jeśli inicjalizacja biblioteki SDL powiodła się, to przed zakończeniem działania programu należy wywołać funkcję SDL_Quit(), która posprząta pamięć i struktury systemowe. Ponieważ działanie programu może być zamykane w wielu różnych przypadkach, to wygodnie jest skorzystać z funkcji C++:

atexit(SDL_Quit);

Funkcja atexit() przyjmuje jako parametr adres innej funkcji (zwróć uwagę, iż adres funkcji przekazujemy przez nazwę bez nawiasów, gdyż inaczej oznaczałoby to wywołanie funkcji i przekazanie jako parametr jej wyniku), która ma zostać wywołana tuż przed zakończeniem programu. Wywoływana funkcja musi być funkcją bezparametrową - taką właśnie jest funkcja SDL_Quit(). Dzięki atexit() nie musimy już pamiętać o wstawieniu wywołania SDL_Quit() we wszystkich miejscach, gdzie ewentualnie chcielibyśmy zakończyć nasz program, np. funkcją exit(kod_wyjścia).

Ostatecznie otrzymujemy następujący szkielet programu SDL:

#include <SDL/SDL.h>
#include <windows.h>

int main(int argc, char *argv[])
{

  if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK))
  {
    MessageBox(0, SDL_GetError(), "Błąd inicjalizacji SDL", MB_OK);
    exit(-1);         // wyświetlamy opis błędu i kończymy
  }
  atexit(SDL_Quit);   // przy zakończeniu będzie wywołane SDL_Quit

    ...               // program główny
}

Podsumowanie

SDL_Init(podsystemy) - inicjuje wybrane podsystemy biblioteki SDL.

SDL_Quit() - funkcja do wykonania przy zakończeniu pracy z biblioteką SDL

SDL_GetError() - zwraca wskaźnik do tekstu opisującego ostatni błąd w bibliotece SDL. Opis jest w języku angielskim.

atexit(adres funkcji) - wywołuje wskazaną funkcję przed zakończeniem programu w C++

exit(kod wyjścia) - kończy działanie programu

MessageBox(uchwyt, tekst okienka, tytuł okienka, typ okna) - wyświetla proste okienko wiadomości. Działa tylko w systemie Microsoft Windows. Dla kompatybilności możesz zapisywać komunikaty w pliku dyskowym.



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.