Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] Poradnik do Simple DirectMedia Layer 2 (SDL2)


Gość skprime

Rekomendowane odpowiedzi

Opublikowano

1. Wstęp

 

1.1. Co to jest SDL2?

 

SDL2 jest to wieloplatformowa biblioteka pozwalająca na pisanie gier i innych aplikacji multimedialnych dzięki temu, że

umożliwia nam otwieranie okienek (Oraz ich pełną konfigurację), tworzenie w nich zawartości GL'a,
daję nam dostęp do wejść takich jak myszka, klawiatura, joysticki, i.t.d., możliwość tworzenia messagebox'ow,
udostępnia timer, eventy, filesystem, i.t.d..
 
SDL2 będziemy używać z OpenGL'em. Jeżeli zamierzacie tworzyć gry polecam zapoznać się także z GLEW i używać
razem z SDL2 (Być może również stworzę jakiś poradnik na temat GLEW).
 
Co jest dużym plusem SDL2? Piszemy jeden, taki sam kod i działa on na każdej platformie tak samo, bez żadnych zmian.
 
1.2. Język programowania
 
My będziemy używać C++, aczkolwiek biblioteka SDL2 ma swoje wrappery na inne języki, np. na C# (SDL2#).
 
1.3. Wymagania
 
Wymagana jest podstawowa wiedza na temat C++ i OpenGL'a.
 
2. Pobieranie, linkowanie
 
2.1. Jak pobrać SDL2?
 

 
SDL2 dostępny do pobrania jest tutaj: https://www.libsdl.org/download-2.0.php.
 
Przechodzimy w sekcję Development Libraries i tutaj musimy zdecydować:
 
-Jeżeli używamy Visual C++ wybieramy SDL2-devel-2.x.x-VC...
-Jeżeli używamy kompilatora MinGW wybieramy SDL2-devel-2.x.x-mingw...
 
Dostępny jest także download dla Mac OSX.
 

 
2.2. Jak zalinkować SDL2?
 

 
Nie będę tłumaczył jak zalinkować SDL2, ponieważ zakładam, że jeżeli chcecię tworzyć coś razem z SDL2 to znacię podstawy C++, a tym samym
wiecię jak zalinkować bibliotekę (Z SDL2 jest tak samo jak z innymi bibliotekami).
 
Ja używam kompilatora MinGW, wystarczy, że wrzucę gotowe foldery include, bin, lib wrzucę do folderu z MinGW. Następnie odpalam Eclipse i przechodzę do:
 
Ustawienia projektu (Properties)->C/C++ General->Paths and Symbols->Libraries i tam dodaję:
 
*SDL2
*SDL2main
*opengl32
 
Uwaga! Trzeba pamiętać o zalinkowaniu OpenGL'a! W Visual Studio do Input dodajemy opengl32.lib, a przykładowo w Eclipse z kompilatorem MinGW na Windowsie dodajemy opengl32.
 

 
3. Inicializacja i zamykanie SDL2
 

 
Zaczynamy od "zaincludowania" nagłówka SDL'a.
W moim przypadku jest to:
 
#include <SDL2/SDL.h>

Path może być różny w zależności gdzie plik SDL.h umieściliśmy i jak zalinkowaliśmy folder z tym plikiem.

 

Na Windowsie koniecznie trzeba będzie dodać pod tym include dodatkową linijkę:

#undef main

Jeżeli tworzymy projekt wieloplatformowy to tutaj daję wam kod, który automatycznię sprawdzi czy program działa na Windowsie, a jeżeli tak to "zundefuje" main'a:

#include <SDL2/SDL.h>
#if defined(WIN32) || defined(_WIN64)
#undef main
#endif

Zanim zaczniemy pracę z SDL2 to przydało by się go zainicjalizować. Użyjemy do tego SDL_Init:

SDL_Init(SDL_INIT_EVERYTHING);

Jeżeli nie chcemy inicializować wszystkiego to zamiast flagi SDL_INIT_EVERYTHING możemy wstawić inne flagi, na przykład:

SDL_Init(SDL_INIT_EVENTS | SDL_INIT_VIDEO);

SDL_Init zanim co kolwiek z SDL2 zrobimy, czyli zanim tworzymy okienko, zanim wyciągamy input.

 

Możemy dodać dodatkowę warunki if, np:

if (SDL_Init(SDL_INIT_EVERYTHING) != 0) //Init sie nie udal. 

Uwaga! Inicializacja nie dotyczy między innymi message box'ów.

 

Na końcu pracy programu (Pracy z SDL2) musimy go zamknąć, użyjemy do tego SDL_Quit:

SDL_Quit();

SDL_Quit możemy wywołać w dowolnym momencię działania programu, spowoduję to natychmiastowę zakończenię pracy programu.

 

Podsumowywując nasz poradnikowy main.cpp wygląda tak:

#include <SDL2/SDL.h>

int main()
{
	/* Init */
	SDL_Init(SDL_INIT_EVENTS | SDL_INIT_VIDEO);

	/* Quit everything */
	SDL_Quit();
	return 0;
}

 

 

 

4. Otwieramy okienko i tworzymy zawartość GL'a

 

 

 

 

W tym poradniku nie będziemy zajmować się multi-oknami, stworzymy jedno działające okienko z zawartością GL'a.

 

Aby to zrobić na początku tworzymy sobie obiekt z SDL_Window:

SDL_Window *window;

Teraz aby stworzyć okienko użyjemy SDL_CreateWindow podając od razu dane takie jak: tytuł, pozycję, rozmiar, flagi okna:

window = SDL_CreateWindow("MPCForum poradnik SDL2 by skprime", 400, 400, 1280, 720, SDL_WINDOW_OPENGL);

SDL_CreateWindow(Tytuł, pozycja x, pozycja y, szerokość, wysokość, flagi)

 

 

Możemy dodać dodatkowę warunki if według własnego uznania.

 

Następnie tworzymy zawartość GL'a:

SDL_GL_CreateContext(window);

I to wszystko, mamy okienko!

 

Teraz po każdym zakończonym renderowaniu musimy zrobić update naszego okienka, w przeciwnym razię bufory nie zamienią się i okienko będzie puste.

 

Robimy to za pomocą SDL_GL_SwapWindow:

SDL_GL_SwapWindow(window);

Po zakończonej pracy, przed SDL_Quit należy zniszczyć okno i zawartość GL'a, robimy to tak:

 

SDL_DestroyWindow(window);


SDL_GL_DeleteContext(SDL_GL_GetCurrentContext());

W dowolnym momencię możemy konfigurować naszę okno, zmieniać tytuł, pozycję, fullscreena, widoczność, i.t.d..

 

 

 

 

5. Prosty game loop

 

 

 

 

Warto dodać by prostego game loopa do naszego kodu, który będzie aktualizował rzeczy takie jak mysz, klawiatura, sprawdzał eventy, aktualizował czas i na końcu wywoływał funkcję draw, oto i skromny przykład:

#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>

void draw(SDL_Window *window)
{
	/* Najpierw trzeba posprzatac */
	glClear(GL_COLOR_BUFFER_BIT);
	glClearColor(0.0f, 0.0f, 0.0f, 255.0f); //Kolor tla (Kolor okna)

	//Renderer prostakata
	glBegin(GL_QUADS);
		glColor3f(1.0f, 1.0f, 1.0); //Kolor (W tym przypadku bialy)
		glVertex2f(-0.5f, 0.5f); //1szy Wierzcholek
		glVertex2f(0.5f, 0.5f); //2gi Wierzcholek
		glVertex2f(0.5f, -0.5f); //3ci Wierzcholek
		glVertex2f(-0.5f, -0.5f); //4ty Wierzcholek
	glEnd();

	SDL_GL_SwapWindow(window); //Po renderowaniu aktualizujemy okienko
}

void update(SDL_Window *window)
{
	bool running = true;

	SDL_Event event;

	while(running)
	{
		SDL_PumpEvents();

		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
			//Jezeli sprobojemy zamknac okienko
			case SDL_QUIT:
				running = false;
				break;
			}
		}

		draw(window);
	}
}

int main()
{
	/* Init */
	SDL_Init(SDL_INIT_EVENTS | SDL_INIT_VIDEO);

	/* Create window */
	SDL_Window *window = NULL; //Window handler

	window = SDL_CreateWindow("MPCForum poradnik SDL2 by skprime", 400, 400, 1280, 720, SDL_WINDOW_OPENGL);

	SDL_GL_CreateContext(window);

	SDL_GL_SwapWindow(window);

	/* Enter game loop */
	update(window);

	/* Destroy window */
	SDL_DestroyWindow(window);

	SDL_GL_DeleteContext(SDL_GL_GetCurrentContext());

	/* Quit everything */
	SDL_Quit();
	return 0;
}

Rezultatem tego kodu będzie biały prostokąt na ekranie.

 

 

 

 

6. Input

 

6.1. Input myszki

 

 

 

 

Aby uzyskać aktualną pozycję myszki tworzymy 2 zmienne int, na przykład x i y, w nich będzie przetrzymywana aktualna pozycja myszy.

 

W końcu nadszedł czas na użycie SDL_GetMouseState:

int x, y;

SDL_GetMouseState(&x, &y);

Po tej czynności zmienna x zawiera pozycję myszki x (Poziomo), a zmienna y pozycję myszki y (Pionowo).

 

SDL_GetMouseState wykonujemy co każdego update (Co każdy tick), jeżeli wywołamy to raz, to pozycja myszki zwyczajnie nie będzie aktualizowana dla każdego frame, pozostanie taka sama.

 

Aby korzystać z SDL_GetMouseState includujemy SDL_events.h (No chyba, że zaincludowaliśmy wcześniej SDL.h).

 

Niezbędne jest to, aby przed każdym SDL_GetMouseState wcześniej wykonać gdzieś SDL_PumpEvents();, na przykład na początku funkcji/metody update(); (Jak w przykładowym game loopie wyżej).

 

 

 

 

UWAGA! Poradnik będzie regularnie poprawiany, ulepszany, będą dodawane nowe zagadnienia.

Opublikowano

Gdy przeczytałem ten poradnik pomyślałem sobie "Ch*lera to jest serio łatwe i szybko tą wiedzę można przyswoić w takim czasie" . Bardzo czytelny ;) Dobra robota oby więcej takich na forum

Opublikowano

meeeh boli mnie OpenGL, imo SFML > sdl > allegro

 

poza tym

 

 

Wymagana jest podstawowa wiedza na temat C++

 

ale i tak używasz globalnych zmiennych.

Opublikowano

poza tym

 

Wymagana jest podstawowa wiedza na temat C++

ale i tak używasz globalnych zmiennych.

Mnie też to boli i jestem tego świadom, jak by to powiedzieć.. Chciałem zrobić to wszystko w jednym pliku na potrzeby poradnika udostępniając wszystkim funkcją dostęp do zmiennych.
Opublikowano

 

meeeh boli mnie OpenGL, imo SFML > sdl > allegro

 

poza tym

Wymagana jest podstawowa wiedza na temat C++

 

ale i tak używasz globalnych zmiennych.

Mnie też to boli i jestem tego świadom, jak by to powiedzieć.. Chciałem zrobić to wszystko w jednym pliku na potrzeby poradnika udostępniając wszystkim funkcją dostęp do zmiennych.

 

To mogłeś przekazać do funkcji. IMO to żadne wytłumaczenie, a uczenie złych praktyk jest w poradnikach nie na miejscu.

Opublikowano

 

 

meeeh boli mnie OpenGL, imo SFML > sdl > allegro

 

poza tym

Wymagana jest podstawowa wiedza na temat C++

 ale i tak używasz globalnych zmiennych.

Mnie też to boli i jestem tego świadom, jak by to powiedzieć.. Chciałem zrobić to wszystko w jednym pliku na potrzeby poradnika udostępniając wszystkim funkcją dostęp do zmiennych.

To mogłeś przekazać do funkcji. IMO to żadne wytłumaczenie, a uczenie złych praktyk jest w poradnikach nie na miejscu.

W takim razie jestem skłonny to poprawić.

 

Edit:

 

Done. :)

  • 3 miesiące temu...
  • 2 miesiące temu...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...