Wymagane jest zapoznanie się z następującymi podrozdziałami:
P019 - Pierwszy program dla Windows
OL031 - Instalacja biblioteki SDL w środowisku Dev-C++
Artykuł nie jest już rozwijany
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
-lSDLBiblioteka SDL zawiera 8 podsystemów:
- Obsługa dźwięku - Audio
- Obsługa obrazu - Video
- Obsługa CDROM
- Obsługa Joysticka
- Obsługa liczników czasu - Timers
- Obsługa zdarzeń - Events Handling
- Obsługa plików - File I/O
- 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 }
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.
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe