Kurs programowania grafiki (SDL) mady by Oskar1233
CZ. 1
Link do oryginału.
Witam czytelników. Dzisiaj zaczynam pisać tutorial dotyczący SDL’a. Na początek trzeba pobrać pliki nagłówkowe i biblioteki stąd. SDL jest przenośny, więc na stronie jest także link do binarki na linuksa. Kiedy już pobierzesz biblioteki i nagłówki, wrzucisz je do odpowiednich folderów kompilatora, to musisz dolinkować do projektu ściągnięte biblioteki (nie będę tego tłumaczyć, bo w każdym środowisku robi się to inaczej). Musimy oczywiście „zaincludować” pliki nagłówkowe:
(POMINĄŁEM NAWIASY OSTRE, BO STRONA „MYŚLI”, ŻE TO HTML; ZA KŁOPOTY SORRY)
Na początku funkcji main() trzeba umieścić funkcję inicjującą SDL’a, a jest nią SDL_Init(Uint32 flags). W argumencie flags umieszczamy stałe czegoś, co chcemy zainicjować. Najczęściej używa się SDL_INIT_EVERYTHING – flagę inicjującą wszystko – i SDL_INIT_VIDEO – flagę inicjującą tryb graficzny. Po wykonaniu tej funkcji musimy utworzyć wskaźnik na zmienną typu SDL_Surface, aby móc zainicjować powierzchnię okna, która będzie nam potrzebna, aby w tym oknie coś wyświetlić. Zrobimy to funkcją SDL_SetVideoMode(int w, int h, int bpp, Uint32 flags). Argument w to szerokość w pikselach, h to wysokość, a bpp to ilość bitów na piksel (najczęściej 32). Pole flags może przyjmować wiele różnych wartości, nie wymienię wszystkich, gdyż są one rzadko używane. Oto niektóre z nich:
SDL_FULLSCREEN – tryb pełnoekranowy
SDL_DOUBLEBUF – podwójny bufor, ustawiamy tą flagę, gdy obraz na ekranie miga
SDL_OPENGL – tryb łączący SDL’a z OpenGL’em, umożliwia to tworzenie obrazów 3D, czym nie będę się zajmować w tym artykule, gdyż jest on jedynie o SDL’u, czyli grafice 2D.
Teraz możemy już napisać swój pierwszy program. Pokażę Wam kod, a potem wytłumaczę co i jak.
Kod:
#include SDL\SDL.h
#undef main
int main()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface *okno;
okno = SDL_SetVideoMode(800, 600, 32, SDL_DOUBLEBUF);
if(okno == NULL) return 0;
SDL_Delay(1000);
SDL_Quit();
}
(TUTAJ TEŻ POMINĄŁEM NAWIASY OSTRE)
Teraz wytłumaczę co i jak. Linijka #undef main pojawiła się w kodzie dlatego, że SDL tworzy swoją kopię tej funkcji i musimy usunąć pierwszą jej kopię. Pod koniec programu pojawiła się nowa funkcja – SDL_Delay(). Dzięki niej program zatrzyma się na określony czas. Wartość tego czasu podajemy w milisekundach (1000 milisekund = 1 sekunda). Na samym końcu jest też funkcja SDL_Quit(). Ona odpowiada za „posprzątanie” po SDL’u i zniszczenie okna. Spróbuj poeksperymentować z parametrami w funkcji inicjującej tryb graficzny – pomoże Ci to zapamiętać różne flagi.
To tyle na dziś, niedługo pojawi się druga część tutoriala.
CZ. 2
Witam, dzisiaj powiemy sobie nieco o powierzchniach, ich wyświetlaniu oraz o spritach, czyli przezroczystych tylko w niektórych miejscach obrazkach.
Napiszę trochę kodu, a później wszystko opiszę.
Kod:
#include
#include
using namespace std;
#undef main
SDL_Surface *LoadImage(string sFileName)
{
SDL_Surface *loaded = NULL;
SDL_Surface *optimized = NULL;
loaded = SDL_LoadBMP(sFileName.c_str());
if(loaded != NULL)
{
optimized = SDL_DisplayFormat(loaded);
SDL_FreeSurface(loaded);
if(optimized != NULL)
{
Uint32 ColorKey;
ColorKey = SDL_MapRGB(optimized->format, 255, 0, 255);
SDL_SetColorKey(optimized, SRC_COLORKEY, ColorKey);
return optimized;
}
}
}
void ApplyImage(int x, int y, SDL_Surface *image, SDL_Surface *destination)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_BlitSurface(image, NULL, destination, ▭);
}
int main()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface *screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE);
SDL_Surface *image = LoadImage(“obrazek.bmp”);
ApplyImage(50, 50, image, screen);
SDL_Flip(screen);
SDL_Delay(1000);
}
Funkcja LoadImage odpowiada za wczytanie bitmapy z pliku. Najpierw deklarujemy dwie zmienne – obrazek załadowany z pliku i gotowy do zwrócenia przez funkcję. Później, funkcją SDL_LoadBMP ładujemy bitmapę z pliku. Funkcja ta przyjmuje jako parametr ścieżkę do pliku, ale typu char*, a wiadomo, że nasza zmienna sFileName jest typu string – musimy więc dokonać konwersji, a robi się to funkcją c_str(), która jest w strukturze (klasie?
) string. Zwraca nam ona tablicę znaków. Następnie sprawdzamy, czy załadowana powierzchnia nie jest pusta, a jeśli tak dokonujemy konwersji z formatu 24-bitowego do 32-bitowego, gdyż takich używamy – w trzecim parametrze funkcji SDL_SetVideoMode podaliśmy 32 – a Windows zapisuje bitmapy w 24 bitach. Dokonujemy tego funkcją SDL_DisplayFormat, która jako parametr przyjmuje powierzchnię, którą konwertujemy, a zwraca wskaźnik na powierzchnię już skonwertowaną. Później zwalniamy zasoby zmiennej loaded – nie będzie ona nam już potrzebna. Teraz sprawdzamy, czy zmienna optimized nie jest pusta – jeśli nie, dokonujemy usunięcia pixeli w kolorze (255, 0, 255). Stają się one przezroczyste na załadowanej powierzchni, czyli ta bitmapa staje się tzw. spritem. Aby dokonać usunięcia pixeli, potrzebujemy zmiennej typu Uint32, która przechowa dane o kolorze, więc tworzymy ją i przypisujemy jej kolor już wcześniej wspomniany. Później ustawiamy funkcją SDL_SetColorKey przezroczystość dla odpowiednich pixeli.
Funkcja ApplyImage odpowiada za wyświetlanie obrazka. Jako parametry przyjmuje jego pozycję, wskaźnik na powierzchnię obrazka oraz wskaźnik na powierzchnię ekranu. Najpierw deklarujemy w niej strukturę typu SDL_Rect i przypisujemy jej polom odpowiednie zmienne. Teraz czas na gwóźdź programu – funkcję SDL_BlitSurface. Jako pierwszy parametr przyjmuje ona wskaźnik na wyświetlaną powierzchnię, później wskaźnik na strukturę typu SDL_Rect. Deklarując wcześniej jakąś strukturę tego typu, możemy przypisać polom w i h (odpowiednio szerokość i wysokość) odpowiednie liczby i uzyskać jedynie kawałek bitmapy, co sprawdzi się doskonale w animacji, ale o tym kiedy indziej. Jako 3-ci parametr przyjmuje wskaźnik na powierzchnię na której będziemy wyświetlać parametr pierwszy. Brzmi trochę zawile, ale jest to bardzo proste i intuicyjne, jedynie kolejność podawania parametrów trzeba niestety zapamiętać 
W funkcji main inicjujemy SDL’a, tworzymy wskaźnik na powierzchnię ekranu, tworzymy i wczytujemy obrazek, wyświetlamy go, zamieniamy bufory przedni z tylnym (funkcją SDL_Flip – jako parametr przyjmuje wskaźnik na powierzchnię ekranu, czyli w naszym wypadku zmienną screen) i odczekujemy sekundę, czyli 1000 milisekund dzięki funkcji SDL_Delay. Jako parametr przyjmuje ona oczywiście czas do odczekania w milisekundach.
I to by było na dziś tyle, omówiłem powierzchnie i sprajty, teraz możecie już zacząć tworzyć fajniejsze gry. W następnej lekcji opiszę animację lub obsługę urządzeń wejściowych (klawiatura, mysz), jeszcze nie wiem
PS: Nie wiem czemu, ale wcięcia w kodzie się pokiełbasiły ;/
PS: Dostałem pozwolenie od Oskara1233 na zamieszczenie tutaj tego kursu.
Ps2:Na razie tylko 2 część ale gdy pojawi się kolejna zaraz ją wkleję.
PS3:nie pojawi się wcześniej niż za około 11 dni ponieważ Oskar1233 jest na obozie.
To tyle z mojej strony życzę miłego programowania.