SDL
Strefa Linuksa
Strona główna |
Spis treści |
O autorze |
Księga gości |
Sonda |
Forum |
Reklama |
Kontakt |
Linki |
Nie, nie, nie, to nie wynik akcji Microsoftu... :) To wolna, przenośna
i szybka biblioteka do tworzenia gier i innych aplikacji graficznych.
Działa pod Linuxem, Windows i MacOS'em. Pozwala wykorzystać akcelerację
2D i 3D (przy wsparciu OpenGL). Obsługuje mysz, klawiaturę, dźwięk, CD-ROM,
zegar, pliki i joya. O jej jakości świadczy fakt, że została użyta do
przeniesienia Civ:CTP do Linuxa. Strona projektu to
www.libsdl.org.
Aby użyć biblioteki w swoim projekcie, trzeba przede wszystkim użyć jej
pliku nagłówkowego SDL.h. Następnie należy zainicjalizować bibliotekę
poleceniem SDL_Init(). Argumentem są zORowane stałe inicjalizacji.
Ich nazwy zaczynają się na SDL_INIT_. Są to: TIMER, AUDIO, VIDEO, CDROM,
JOYSTICK, NOPARACHUTE, EVENTTHREAD, EVERYTHING. Po kolei, odpowiadają za:
inicjalizację zegarów, dźwięku, grafiki, cedeka, dżoja, wyłączenie systemu
antyawaryjnego, włączenie wątku obsługującego zdarzenia, włączenie wszystkiego.
Kolejną funkcją powinna być funkcja inicjalizująca tryb graficzny.
Ma ona postać SDL_SetVideoMode(int w, int h, int bpp, Uint32 flags).
Znaczenie pierwszych trzech jest logiczne, natomiast flagi to: SDL_SWSURFACE
- powoduje, że bufor ekranu będzie w pamięci komputera, SDL_HWSURFACE
umieszcza ten bufor w pamięci karty graficznej, SDL_ASYNCBLIT pozwala na
asynchroniczne blity, SLD_ANYFORMAT pozwala na wybranie innej wartości
bpp niż podana w przypadku braku takiego trybu, SDL_HWPALETTE daje powierzchni
ekranu wyłączną paletę, SDL_DOUBLEBUF włącza podwójne buforowanie,
SDL_FULLSCREEN uruchamia tryb pełnoekranowy, SDL_OPENGL uaktywnia obsługę
OpenGL, SDL_RESIZABLE pozwala na zmianę wielkości okna graficznego.
Wynikiem działania tej funkcji jest wskaźnik na strukturę SDL_Surface,
którego można użyć do operacji graficznych. Po inicjalizacji warto
wywołać funkcję SDL_WM_SetCaption, która ustawi tytuł okna graficznego.
Na końcu programu niezbędne jest użycie SDL_Quit().
Teraz o podstawowej sprawie - operacjach na powierzchniach graficznych.
Powierzchnie graficzne reprezentowane są przez struktury SDL_Surface. Jedną
taką już masz - oznacza cały ekran. Można rzecz jasna tworzyć nowe powierzchnie
- za pomocą SDL_LoadBMP() ładującej grafikę z pliku lub SDL_CreateRGBSurface(),
tworzącej nową powierzchnię o dobranych parametrach. Do usunięcia tak
utworzonych powierzchni należy użyć SDL_FreeSurface().
Aby bezpośrednio edytować zawartość powierzchni graficznej, należy ją
zablokować, a po skończeniu operacji odblokować. Służą do tego
polecenia SDL_LockSurface() i SDL_UnlockSurface(). Po zablokowaniu
można dostać się do danych graficznych pod polem pixels struktury
SDL_Surface (surface->pixels). Rozmiar pojedynczego piksela znajduje się pod
surface->format->BytesPerPixel, a odstęp liniowy pod polem surface->pitch.
Jeśli powierzchnia jest powierzchnią RGB, wartość koloru można uzyskać
funkcją SDL_MapRGB(format, r, g, b). Ostatecznie, żeby zmienić wartość
koloru w dowolnym pixelu o współrzędnych x i y, w powierzchni 32bitowej,
wystarczy zrobić coś takiego:
(Uint32) (((Uint8 *) (surface->pixels)) [x + surface->pitch * y]) =
SDL_MapRGB (surface->format, r, g, b).
Częściej spotykaną formą manipulacji grafiką jest blitowanie, tj. kopiowanie
danych graficznych z jednej powierzchni do drugiej. Tu realizowane jest to
funkcją SDL_BlitSurface (źródło, obszar_źródłowy, przeznaczenie,
obszar_przeznaczenia), gdzie źródło i przeznaczenie to powierzchnie
SDL_Surface, a obszar_* to struktury SDL_Rect. Ta struktura ma cztery pola -
x, y, w, h; pierwsze dwa to współrzędne obszaru, a następne dwa to jego
rozmiary. Blity wykonywane funkcją SDL_BlitSurface() są akcelerowane,
jeśli jest to możliwe (tj. obie powierzchnie są w pamięci karty, a karta
obsługuje akcelerację.
Kiedy przygotujesz już klatkę obrazu do wyświetlenia, należy użyć
funkcji SDL_Flip(). Podziała ona zawsze, czy ekran jest podwójnie buforowany
czy nie.
Dobra, już umiecie rysować grafikę... Lecz działanie aplikacji graficznej
nie polega tylko na tworzeniu grafiki. Niezbędna też jest zdolność reagowania
na zdarzenia zewnętrzne, tj. obsługę myszy, klawiatury, dżoja...
W bibliotece SDL zdarzenie symbolizuje struktura SDL_Event. Aby odbierać
zdarzenia, używa się funkcji SDL_PollEvent (SDL_Event *) i SDL_WaitEvent
(SDL_Event *). Pierwsza funkcja odczytuje zdarzenie i zwraca 1 jeśli jakieś
było, w przeciwnym razie zwraca 0. Druga funkcja czeka na zdarzenie i zwraca
1 kiedy się pojawi, lub zwraca 0 jeśli wystąpił błąd. Jako argument podajemy
adres naszej struktury SDL_Event. Jeśli funkcje te zwracają 1, wypełniają
wskazaną strukturę danymi o zaistniałym zdarzeniu. Aby się dowiedzieć, jakie
to było zdarzenie, należy sprawdzić pole type struktury SDL_Event.
Możliwe wartości są oznaczone przez stałe. Są to: SDL_ACTIVEEVENT - okno jest
aktywowane lub deaktywowane, SDL_KEYDOWN i KEYUP - naciśnięcie i puszczenie
klawisza, SDL_MOUSEMOTION, BUTTONDOWN i BUTTONUP - ruch myszy, naciśnięcie i
puszczenie przycisku myshy, SDL_JOYAXISMOTION, JOYBALLMOTION, JOYHATMOTION,
JOYBUTTONDOWN, JOYBUTTONUP - ruch drążkiem, trackballem, hat-switchem dżoja,
naciśnięcie i puszczenie fajera w dżoju, SDL_QUIT - zamknięcie okna,
SDL_VIDEORESIZE - zmiana rozmiaru okna. W zależności od rodzaju zdarzenia
możemy obsłużyć je lub nie. Jeśli je obsługujemy, musimy koniecznie użyć
specjalistycznych danych. Są one zachowane w strukturach wewnątrz
struktury SDL_Event: active, key, motion, button, jaxis, jball, jhat, jbutton,
resize, quit, user, syswm. Każda z tych struktur zawiera informacje
niezbędne do obsługi zdarzenia, np. położenie myszy, numer przycisku myszy,
kod wciśniętego klawisza... Nie mam zamiaru się o nich tu rozpisywać -
wystarczy zajrzeć do pliku SDL_events.h biblioteki SDL.
Możliwe jest też samodzielne wysyłanie zdarzeń - SDL_PushEvent() - oraz
tworzenie własnych zdarzeń. Ale myślę, że do tego dojdziecie już sami...
Eksperymenty z biblioteką pozostawiam Wam.
Strona testowana z Mozillą 0.9.1, Konquerorem, Lynxem, Linksem oraz IE 5.5.
w górę
Copyright © 2000-2001 Marek Materzok Wszelkie Prawa Zastrzeżone.
Wyszukiwarka
Podobne podstrony:
sdlIceBreaker README SDLSDL Einicjalizacja i obslóga bedów biblioteki SDLNeHeGL SDL TODOCIT 2014 z omówieniem ekspertów Rödl & Partner ebook demoNeHeGL SDL READMEREADME SDLREADME SDLGry na Atari 2600 README SDLSDL ttfwięcej podobnych podstron