Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych. Autor artykułu: mgr Jerzy Wałaszek, wersja1.0 |
©2008 mgr
Jerzy Wałaszek |
Poprzednie tematy, które należy przerobić przed przystąpieniem do tej lekcji
01 - Instalacja biblioteki SDL dla Dev-C++
02 - Powierzchnia graficzna w SDL - stawianie punktów
Na tej lekcji dowiesz się w jaki sposób można utworzyć własną bibliotekę funkcji graficznych pracujących w środowisku SDL. Bibliotekę tworzymy od podstaw i będziemy z niej korzystali we wszystkich dalszych projektach SDL. Zapoznaj się z tą lekcją nawet w przypadku, gdy nie zamierzasz tworzyć swojej biblioteki. Zawarte tutaj informacje są wykorzystywane we wszystkich programach w SDL, które utworzymy.
Począwszy od tej lekcji będziemy tworzyć kolejne procedury graficzne. Ułatwią nam one programowanie grafiki w środowisku SDL. Na tej lekcji utworzymy:
|
Przygotuj katalog na swoim dysku twardym, w którym umieścisz projekt Dev-C++. Proponuję utworzyć katalog o nazwie SDL, a następnie tworzyć w nim katalogi 001, 002 itd, dla kolejnych projektów.
Uruchom IDE Dev-C++ i utwórz nowy projekt Windows Application. Projekt zapisz w przygotowanym wcześniej katalogu na swoim dysku twardym.
Treść okienka edytora usuń - nie będzie nam potrzebna w SDL. Wejdź do opcji menu Projekt → Opcje projektu. W okienku dialogowym wybierz zakładkę Parametry. Do pola Konsolidator przepisz poniższe cztery wiersze:
-lmingw32
-mwindows
-lSDLmain
-lSDL
Zamknij okno opcji projektu.
Do okna edytora przekopiuj poniższy szablon programu SDL:
// Szablon aplikacji SDL // (C)2009 I LO w Tarnowie //------------------------ #include <mylib.h> extern SDL_Surface * screen; int main(int argc, char *argv[]) { if(!SDL_Init(SDL_INIT_VIDEO)) { atexit(SDL_Quit); screen = SDL_SetVideoMode(320, 240, 32, SDL_HWSURFACE|SDL_DOUBLEBUF); if(SDL_MUSTLOCK(screen)) SDL_LockSurface(screen); // Tutaj wstawiasz swój kod if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); SDL_Flip(screen); bool escape = false; SDL_Event event; do { while (SDL_PollEvent(&event)) if ((event.type == SDL_QUIT) || (event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_ESCAPE)) escape = true; } while(!escape); SDL_FreeSurface(screen); } return 0; } |
Nie kompiluj jeszcze tego pliku. Poniżej wyjaśniamy poszczególne elementy szablonu. Jeśli czegoś na razie nie rozumiesz, nie przejmuj się - wyjaśni się z czasem.
#include <mylib.h>
|
Dołączenie pliku nagłówkowego naszej biblioteki. Ten plik stworzymy za chwilę. |
extern SDL_Surface * screen; |
Deklaracja struktury SDL_Surface, która zawiera informacje o buforze obrazowym. Strukturę tę będziemy przechowywać w module biblioteki. Słówko extern informuje kompilator, iż definicja znajduje się w innym pliku. Strukturę SDL_Surface będzie zawsze wskazywała zmienna screen. |
int main(int argc, char *argv[]) { |
Główna funkcja programu - nie zmieniaj listy argumentów, gdyż inaczej SDL jej nie znajdzie. |
if(!SDL_Init(SDL_INIT_VIDEO)) { |
Funkcja SDL_Init inicjuje bibliotekę SDL. Jako parametr podajemy znaczniki podsystemów, które mają zostać zainicjowane. W naszym przypadku będziemy korzystali tylko z podsystemu video. Jeśli wynik SDL_Init() jest zerowy, to nie udało się zainicjować danego systemu i program się nie uruchomi - całość programu jest w klamerkach funkcji if. |
atexit(SDL_Quit); |
Kończąc pracę z SDL należy wywołać funkcję SDL_Quit(). Aby o tym nie zapomnieć, stosujemy funkcję atexit(), która przy zakończeniu programu automatycznie wykona kod funkcji przekazanej w parametrze. |
screen = SDL_SetVideoMode(320,240,32,SDL_HWSURFACE|SDL_DOUBLEBUF); |
Inicjujemy wskaźnik do struktury SDL_Surface. Funkcja SDL_SetVideoMode
tworzy strukturę SDL_Surface i zwraca jej wskaźnik. Kolejne parametry tej
funkcji to: szerokość obrazu w pikselach |
if(SDL_MUSTLOCK(screen)) SDL_LockSurface(screen); |
Jeśli to konieczne, blokujemy dostęp do powierzchni rysowania innym aplikacjom. |
// Tutaj wstawiasz swój kod
|
W to miejsce będziemy wpisywali nasz kod graficzny. |
if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); |
Odblokowujemy powierzchnię graficzną |
SDL_Flip(screen);
|
Zawartość bufora obrazowego przepisujemy na ekran - jeśli w buforze umieścimy piksele, to nie pojawią się one od razu na ekranie - dopiero po zastosowaniu funkcji SDL_Flip() lub SDL_UpdateRect() - będziemy się tym zajmować na dalszych zajęciach. |
bool escape = false; SDL_Event event; do { while (SDL_PollEvent(&event)) if ((event.type == SDL_QUIT) || (event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_ESCAPE)) escape = true; } while(!escape); |
Pętla obsługi zdarzeń. Jej zadaniem jest oczekiwanie na klawisz ESC lub na zamknięcie okna aplikacji. |
SDL_FreeSurface(screen);
|
Zwolnienie pamięci zajmowanej przez strukturę SDL_Surface |
Utwórz w Dev-C++ nowy plik i zapisz go w katalogu:
c:\dev-cpp\include
pod nazwą mylib.cpp. W pliku tym będziemy umieszczali funkcje graficzne naszej
biblioteki. Plik mylib.cpp będzie musiał być dołączany do każdego projektu
wykorzystującego tę bibliotekę. Dlatego właśnie umieściliśmy go w katalogu
include, aby był łatwy do odszukania.
Skopiuj do tego pliku poniższy tekst i zapisz na dysku:
// Biblioteka procedur graficznych dla SDL // Tryb pikseli 32-bitowych // (C)2009 I-LO Tarnów //---------------------------------------- #include <mylib.h> SDL_Surface * screen; // globalna powierzchnia graficzna |
Na razie nasza biblioteka nie zawiera żadnych funkcji - tworzymy w niej jedynie wskaźnik do struktury SDL_Surface o nazwie screen. Zwróć uwagę, iż biblioteka wykorzystuje ten sam plik nagłówkowy, co program główny - jest to celowe działanie.
Ponownie utwórz w Dev-C++ nowy plik i zapisz go w katalogu:
c:\dev-cpp\include
pod nazwą mylib.h. W pliku tym znajdą się definicje funkcji i struktur danych
naszej biblioteki. Na początek wpisz do niego tekst:
// Biblioteka procedur graficznych dla SDL // Tryb pikseli 32-bitowych // (C)2009 I-LO Tarnów //---------------------------------------- #include <SDL/SDL.h> |
Teraz dokonaj próbnej kompilacji programu. Jeśli nie otrzymasz błędów, uruchom program - powinno się pojawić okienko z czarnym tłem i tytułem SDL_app. Okno znika po naciśnięciu klawisza ESC. Jeśli się tak nie stanie, to krok po kroku powtórz całą procedurę tworzenia projektu.
Na końcu tej lekcji powinieneś posiadać:
projekt Dev-C++ ustawiony na współpracę z SDL
plik szablonu programu SDL w katalogu projektowym
plik źródłowy biblioteki mylib.cpp w katalogu c:\dev-cpp\include
plik nagłówkowy mylib.h w katalogu c:\dev-cpp\include
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