Inicjalizacja i obsługa błędów
Pierwsze co musisz zrobić, by skorzystać z biblioteki SDL, to oczywicie dołšczyć jej plik nagłówkowy, by zapoznać kompilator z zawartociš tej biblioteki:
#include
Program używajšcy SDL zaczyna się w normalnej, standardowej funkcji main ;-) Jest tak nawet gdy tworzysz projekt dla systemu Windows, bo wtedy SDL realizuje windowsowš funkcję WinMain gdzie w swoim wnętrzu. Takie rozwišzanie jest konieczne, by można było przenosić kod pomiędzy różnymi platformami systemowymi bez żadnych zmian [inne systemy niż Windows nie używajš przecież tej niestandardowej funkcji WinMain :-P].
#include
//Tu zaczyna się nasz program używajšcy SDL
int main()
{
//Tu będzie jego treć...
}
Podsystemy biblioteki SDL
Biblioteka SDL składa się z 8 podsystemów, z których każdy odpowiada za co innego. Przypomina tym trochę bibliotekę DirectX, jednak jak pewnie wiesz, sš między nimi pewne różnice ;-J Poniżej masz listę tych podsystemów wraz z opisem, czym się zajmuje każdy z nich:
VIDEO Podsystem odpowiedzialny za wywietlanie grafiki 2D
AUDIO Podsystem odpowiedzialny za podstawowš obsługę dwięku
EVENTS Podsystem odpowiedzialny za obsługę zdarzeń
CDROM Podsystem odpowiedzialny za odtwarzanie muzyki CD-Audio i obsługę CD-ROMu
JOYSTICK Podsystem obsługi joysticka
TIMER Podsystem odmierzania czasu
THREADS Podsystem odpowiedzialny za obsługę wštków
FILES Podsystem wejcia/wyjcia plikowego
Prygotowanie do pracy
Aby rozpoczšć zabawę z SDL, trzeba jš najpierw zainicjalizować [przygotować do pracy]. Zanim wywołasz jakškolwiek funkcję z biblioteki SDL, musisz więc najpierw wywołać funkcję SDL_Init, której nagłówek prezentuje się tak:
int SDL_Init(Uint32 flags);
Pozwala Ci ona wybrać podsystemy, z których masz zamiar korzystać i przygotowuje je do pracy. Automatycznie przygotowuje trzy podsystemy: EVENTS, THREADS i FILES. Możesz wybrać dodatkowe podsystemy, podajšc jej odpowiednie parametry, które poznasz lada moment.
Jak widzisz, funkcja SDL_Init pobiera tylko jeden parametr, jednak jego typ może wydawać ci się dziwny :-P Biblioteka SDL wprowadza kilka nowych, własnych typów danych, by zapewnić jednakowy rozmiar danych w pamięci na różnych platformach. Typ Uint32 możesz rozumieć jako typ unsigned int z gwarancjš, że zajmie 32 bity w pamięci.
Parametr ten służy głównie do wybierania, które podsystemy majš być dodatkowo zainicjalizowane, jednak ma też kilka innych możliwoci. Możesz w nim przekazać jednš z poniższych stałych:
SDL_INIT_VIDEO Podsystem graficzny
SDL_INIT_AUDIO Podsystem dwięku
SDL_INIT_TIMER Podsystem odmierzania czasu
SDL_INIT_CDROM Podsystem obsługi CD-ROMu
SDL_INIT_JOYSTICK Podsystem obsługi joysticka
SDL_INIT_EVERYTHING Inicjalizuje wszystkie podsystemy
SDL_INIT_NOPARACHUTE SDL nie będzie za ciebie obsługiwać wyjštków
SDL_INIT_EVENTTHREAD Do odbierania zdarzeń zostanie utworzony osobny wštek
Powyższe stałe sš flagami bitowymi, więc możesz je łšczyć operatorem |. Przykładowo inicjalizacja podsystemów VIDEO i TIMER mogłaby wyglšdać tak:
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
Funkcja zwraca 0 gdy inicjalizacja się powiodła. W przeciwnym razie zwraca -1.
Włšczanie/wyłšczanie podsystemów
Czasami nie da się zainicjalizować od razu wszystkiego. Przykładowo chcesz najpierw wywietlić menu gry, z którego użytkownik wybierze czy chce skorzystać z joysticka. Dopiero wtedy można zainicjalizować podsystem joysticka. Co zrobić w takiej sytuacji? Jak uruchomić podsystem JOYSTICK, skoro funkcja SDL_Init była już wywołana?! :-/
Twórcy biblioteki przygotowali jš na takie sytuacje ;-) Możesz włšczyć dodatkowe podsystemy w póniejszym czasie. Służy do tego funkcja SDL_InitSubSystem i pobiera ona dokładnie te same parametry, co SDL_Init. Tak wyglšda jej nagłówek:
int SDL_InitSubSystem(Uint32 flags);
Gdy wszystko poszło dobrze, zwraca 0. W przypadku błędu zwraca -1.
Gdy dany podsystem przestaje ci być potrzebny, możesz wyłšczyć tylko ten jeden podsystem, pozostawiajšc resztę. Robi się to funkcjš SDL_QuitSubSystem. Pobiera ona te same parametry, co poprzednie funkcje. Nie zwraca jednak żadnej wartoci. To zresztš logiczne, bo jeli chcesz wyłšczyć jaki podsystem i miałoby się to nie udać, naraziłoby cię na kolejne błędy :-P Musi się udać zawsze.
void SDL_QuitSubSystem(Uint32 flags);
Ostateczne zakończenie całego SDL wymaga funkcji SDL_Quit. Nie pobiera ona żadnych parametrów i nic nie zwraca. Zamyka ona wszystkie podsystemy [włšcznie z tymi trzema domylnymi] i zwalnia zasoby przydzielone dla SDL. Jej nagłówek to:
void SDL_Quit(void);
Tš funkcję będziesz wywoływać, gdy zechcesz zakończyć pracę z SDL. Jeli obawiasz się, że zapomnisz po sobie posprzštać, możesz na przykład ustawić tš funkcję jako handler w wywołaniu atexit gdy tylko inicjalizacja SDL zakończy się sukcesem, np. tak:
if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0 ) {
//Co poszło nie tak. Wywietl komunikat o błędzie i zakończ z kodem błędu
cout << "Błšd inicjalizacji SDL!" << endl;
return -1;
}
//Inicjalizacja się powiodła, więc ustawiamy handler atexit()
atexit(SDL_Quit);
Przy okazji warto zauważyć, że w systemie Windows bibliotka SDL przekierowuje standardowe kanały wyjciowe do plików majšych nazwy stdout.txt i stderr.txt. Gdyby tak nie robiła, głupawy Windows tworzyłby ci dodatkowe okno konsoli gdy tylko co wypiszesz na stdout [ach te Windowsy.. ;-P].
Najdziwniejszš funkcjš inicjalizacji SDL jest SDL_WasInit. Sprawdza ona, które podsystemy zostały zainicjalizowane, a które nie. Oto jej nagłówek:
Uint32 SDL_WasInit(Uint32 flags);
Co ciekawe, możesz zapytać jš o konkretny zestaw podsystemów, podajšc odpowiednie flagi SDL_INIT_* w parametrze. Funkcja wemie te twoje flagi i sprawdzi tylko te podsystemy, o które pytasz. Jako wynik zwróci wartoć, która jest połšczeniem flag bitowych tylko uruchomionych podsystemów, i tylko sporód tych, o które pytasz.
Najprostszy sposób użycia tej funkcji to pytanie o to, czy jeden konkretny podsystem już działa. Wykorzystujemy wtedy fakt, że jeli żaden z podanych przez ciebie podsystemów nie pracuje, wynikiem funkcji będzie 0:
if ( SDL_WasInit(SDL_INIT_AUDIO) ) //Podsystem AUDIO działa...
else //Podsystem AUDIO nie działa...
Obsługa błędów
Wiele funkcji SDL w przypadku błędu zwraca po prostu -1. Ta wartoć niewiele jednak mówi o przyczynie błędu. W tym celu istnieje funkcja SDL_GetError.
bla bla bla
#include
#include
using namespace std;
int main()
{
cout << "Startujemy SDL..." << endl;
// Przygotuj podsystemy: domylne, VIDEO i AUDIO.
if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0 ) {
cout << "Błšd inicjalizacji SDL: " << SDL_GetError() << endl;
return -1;
}
cout << "SDL gotowy do pracy!" << endl;
// Tu będzie normalne działanie programu...
cout << "Kończymy pracę SDL..." << endl;
// Wyłšczamy wszystkie podsystemy SDL.
SDL_Quit();
cout << "Program zakończony" << endl;
}
Wyszukiwarka
Podobne podstrony:
BIBLIOGRAFIA
Bibliografia dzieĹ WĹodzimierza Ilicza Lenina
Biblioteka PHP WysyĹanie pliku na serwer
sdl
Bibliotekarka
Biblioterapia bibliografia
czy warto miec biblioteczke krĂłtkie wypracowanie
Posacki A Techniki psychosomatyczne czy duchowe inicjacje
BIBLIOGRAFIE REGIONALNE
SZCZEGUĹOWA INSTRUKCJA OBSĹĂGI ZEGARKĂW CASIO
BIBLIOGRAFIA
Gene Sharp Bibliography
biblio (3)
BIBLIOGRAPHY#2 Ignatius of Antioch & the Church of the Martyrs
bibliografia mp
wiÄcej podobnych podstron