Wyświetlanie sprite'ów
Na poprzedniej lekcji mówiłem Ci, że do wyświetlania okna i grafiki w SDL-u musimy zadeklarować powierzchnię. Jest to zmienna taka jak każda inna, z tym że możemy ją wykorzystywać tylko do pewnych celów. Zmienna typu int służy przedewszystkim do przechowywania liczb i działania na nich, natomiast zmienna typu surface (powierzchnia) może pełnić funkcję związane z grafiką. Jakie to funkcje po części dowiesz się na tej lekcji. Kiedy mamy już taką zmienną możemy np. wyświetlić obrazek. Wczytujemy za pomocą odpowiedniej funkcji obraz do zmiennej i wyświetlamy go za pomocą innej. Obrazki 2D, które wyświetlamy w SDL-u i każdej innej bibliotece 2D nazywane są sprite'ami. Zanim napiszesz program przygotuj sobie obraz o rozdzielczości 640x480. Postaraj się, aby nie był jednokolorowy. Napisz tam coś lub narysuj - ważne, żeby coś było. Możesz skorzystać z pliku, który ściągnąłeś wraz z kursem. Znajduje się w katalogu "Lekcja 3" i nazywa się "obraz.bmp". Kod:
#include <SDL.h>
SDL_Surface * ekran = NULL;
SDL_Surface * obraz = NULL;
int main( int argc, char * args[] )
{
SDL_Init( SDL_INIT_EVERYTHING );
ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
obraz = SDL_LoadBMP( "obraz.bmp" );
SDL_BlitSurface( obraz, NULL, ekran, NULL );
SDL_Flip( ekran );
SDL_Delay( 2000 );
SDL_Quit();
SDL_FreeSurface( obraz );
return 0;
}
Najpierw dołączamy SDL, potem deklarujemy powierzchnie od ekranu oraz wyświetlanego obrazu. Następnie funkcja główna, instalacja SDL-a, czyli wszystko co już znasz. Następne linijki należy omówić:
ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
- tworzenie okna
obraz = SDL_LoadBMP( "obraz.bmp" );
- podobnie jak w tworzeniu okna zaczynamy od powierzchni, do której przypisujemy za pomocą znaku "=" funkcję. Nowa funkcja nazywa się
SDL_LoadBMP. Jest to łatwe to zapamiętania, gdyż funkcja nosi taką nazwę, jak czynność, którą wykonuje. Load "ang. wczytaj, a BMP" jest to po prostu bitmapa. W nawiasach, czyli w argumencie funkcji podajemy nazwę pliku oraz (po kropce) jego rozszerzenie. W tym programie wczytujemy plik bmp, więc po kropce wpisujemy bmp. Nazwa i rozszerzenie muszą być podane w cudzysłowie.
SDL_BlitSurface( obraz, NULL, ekran, NULL );
- kolejna nowa funkcja. Ta służy do kopiowania powierzchni na inną powierzchnię. W argumentach podajemy po kolei:
obraz Najpierw podajemy, którą powierzchnię chcemy skopiować.
NULL - tutaj ustalamy jaki fragment powierzchni chcemy skopiować. W tym programie kopiujemy całą bitmapę, więc wpisujemy NULL (czyli zero). Dokładnie o kopiowaniu fragmentów bitmapy napiszę na innej lekcji.
ekran - podajemy miejsce docelowe bitmapy, czyli gdzie chcemy ją skopiować.
NULL - w ostatnim argumencie ustalamy gdzie wkleić bitmapę. Kopiujemy i wyświetlamy ją na całym ekranie, więc tutaj wstawiamy
NULL.
SDL_FreeSurface( obraz );
- na koniec funkcja, która usuwa powierzchnię z pamięci.
Free surface - oznacza "uwolnij" powierzchnię, czyli po prostu skasuj. W argumencie funkcji, podajemy nazwę powierzchni, której chcemy się pozbyć.
Jeśli jesteś bystry, to zauważyłeś, że definiowaliśmy dwie powierzchnie "ekran oraz obraz, a usunęliśmy tylko jedną z nich" obraz. Cała tajemnica polega na tym, że jest to powierzchnia software'owa. Spójrz tutaj:
ekran = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
Taka powierzchnia jest przechowywana w pamięci i jest automatycznie kasowana przez system, po zakończeniu programu, więc nie musimy się martwić o kasowanie jest z pamięci.