Tworzenie grafiki SDL

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.

Tworzenie własnej biblioteki graficznej mylib

SDL

Począwszy od tej lekcji będziemy tworzyć kolejne procedury graficzne. Ułatwią nam one programowanie grafiki w środowisku SDL. Na tej lekcji utworzymy:

  • Projekt Dev-C++
  • Plik nagłówkowy mylib.h
  • Plik biblioteki mylib.cpp

Projekt Dev-C++

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
wysokość obrazu w liniach skanujących
głębia bitowa pikseli
rodzaj powierzchni graficznej

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

 

Plik biblioteki mylib.cpp

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.

 

Plik nagłówkowy mylib.h

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.

 

 

Podsumowanie

Na końcu tej lekcji powinieneś posiadać:

 



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.