SDL
SDL
je knihovna pro tvorbu interaktivních grafických aplikací a her.
Umožňuje vám vytvářet okna, vykreslovat do nich jednotlivé pixely, obrázky či text, snímat vstup z
myši a klávesnice či třeba přehrávat zvuk. Jedná se tak v podstatě o tzv. herní engine, i když
ve srovnání např. s enginy Unity nebo Unreal
je tento engine velmi jednoduchý.
Instalace SDL
Narozdíl od knihovny, kterou jsme si ukazovali pro vytváření GIF
animací, SDL
obsahuje
spoustu zdrojových i hlavičkových souborů, a nebylo by tak ideální ji kopírovat k našemu programu.
Připojíme ji tedy k našemu programu jako klasickou
knihovnu. Abychom knihovnu mohli použít, nejprve
si ji musíme stáhnout. To můžeme udělat dvěmi způsoby:
- Instalace pomocí správce balíčků (doporučeno): Jelikož je
SDL
velmi známá a používaná knihovna, ve většině distribucí Linuxu není problém ji nainstalovat přímo z balíčkového manažeru. V Ubuntu to můžete provést pomocí následujícího příkazu v terminálu, který nainstaluje kromě balíčku se základní funkcionalitou také dva další balíčky nutné pro vykreslování obrázků a textu1:
Výhodou tohoto způsobu je, že knihovna bude nainstalována v systémových cestách,$ sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev
gcc
ji tak bude mět naleznout i bez toho, abychom mu museli zadat explicitní cestu. Nevýhodou je, že verze knihoven v systémových balíčcích typicky bývají zastaralé.1Pokud by vás zajímalo, které všechny soubory a kam se nainstalovaly, můžete po instalaci balíčků použít příkaz
$ dpkg -L libsdl2-dev
- Manuální stažení knihovny: Knihovnu si můžete také stáhnout manuálně, např. z
webu SDL. Některé knihovny můžete naleznout na internetu
už přeložené, nicméně
SDL
oficiálně pro Linux přeložené knihovní soubory (.so
) nenabízí. V tomto případě tak musíte knihovnu nejenom stáhnout, ale také ručně přeložit, než ji budete moct použít ve svém programu.
Přilinkování knihovny SDL
Pokud jste nainstalovali SDL
pomocí systémových balíčků, stačí při překladu programu přilinkovat
knihovnu SDL2
:
$ gcc main.c -lSDL2
Pokud jste knihovnu překládali manuálně, musíte ještě použít parametry -I
pro předání cesty k
hlavičkovým souborům a -L
pro předání cesty k adresáři s přeloženou knihovnou, jak jsme si
vysvětlovali zde.
Pro práci s obrázky bude dále nutné přilinkovat knihovnu SDL2_image
a pro práci s textem knihovnu
SDL2_ttf
.
Dokumentace
Abyste mohli používat nějakou složitější knihovnu, je nutné se zorientovat v její dokumentaci. V té naleznete jednak deklarace a popis fungování jednotlivých funkcí, které knihovna nabízí, ale také různé návody pro to, jak s knihovnou pracovat.
Dokumentaci funkcí SDL
naleznete zde, návody pro jeho
použití například tady.
SDL
je relativně rozsáhlá knihovna a není v silách tohoto textu, abychom ji plně popsali. Proto níže naleznete pouze velmi stručný "Hello world" a seznam věcí, které vám SDL umožňuje. Zbytek najdete v dokumentaci a návodech na internetu.
SDL
hello world
Abychom něco vykreslili, tak jako první věc musíme nainicializovat SDL a vytvořit okno2:
2Pro zpřehlednění kódu bude v ukázkách níže vynechána kontrola chyb. Celý program i s kontrolou chyb naleznete na konci této sekce.
#include <SDL2/SDL.h>
int main()
{
SDL_Init(SDL_INIT_VIDEO); // Inicializace SDL
// Vytvoření okna
SDL_Window* window = SDL_CreateWindow(
"SDL experiments", // Název
100, // Souřadnice x
100, // Souřadnice y
800, // Šířka
600, // Výška
SDL_WINDOW_SHOWN
);
Jakmile máme otevřené okno, můžeme do něj něco začít vykreslovat. K tomu musíme nejprve vytvořit
SDL_Renderer
, neboli kreslítko:
// Vytvoření kreslítka
SDL_Renderer* renderer = SDL_CreateRenderer(
window,
-1,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC
);
S kreslítkem už můžeme něco nakreslit na obrazovku. Musíme vytvořit tzv. herní smyčku (game loop), která se bude provádět neustále dokola. Ve smyčce nejprve získáme události, které nastaly (např. došlo ke stisknutí klávesy nebo pohybu myši), poté je zpracujeme, vykreslíme nový obsah okna a odešleme jej k vykreslení (za použití tzv. double bufferingu).
Konkrétně budeme vykreslovat jednoduchou posouvající se čáru, dokud uživatel nezavře otevřené okno:
SDL_Event e;
bool quit = false;
int pos = 100;
while (!quit)
{
while (SDL_PollEvent(&e))
{
if (e.type == SDL_QUIT)
{
quit = true;
}
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Nastavení barvy na černou
SDL_RenderClear(renderer); // Vykreslení pozadí
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // Nastavení barvy na červenou
SDL_RenderDrawLine(renderer, pos, pos, pos + 10, pos + 10); // Vykreslení čáry
pos++;
SDL_RenderPresent(renderer); // Prezentace kreslítka
}
A na konci už akorát vše uvolníme:
// Uvolnění prostředků
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
Pokud spustíte program využívající
SDL
s Address sanitizerem, může se stát, že vám sanitizer zobrazí nějakou neuvolněnou paměť. Pokud zdroj alokace nepochází z vašeho kódu, můžete tyto chyby ignorovat.
Celý kód i s ošetřením chyb
#include <SDL2/SDL.h>
#include <stdbool.h>
int main()
{
if (SDL_Init(SDL_INIT_VIDEO)) {
fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
return 1;
}
SDL_Window* window = SDL_CreateWindow("SDL experiments", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
if (!window) {
fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (!renderer) {
SDL_DestroyWindow(window);
fprintf(stderr, "SDL_CreateRenderer Error: %s", SDL_GetError());
SDL_Quit();
return 1;
}
SDL_Event e;
bool quit = false;
int pos = 100;
while (!quit)
{
while (SDL_PollEvent(&e))
{
if (e.type == SDL_QUIT)
{
quit = true;
}
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Nastavení barvy na černou
SDL_RenderClear(renderer); // Vykreslení pozadí
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // Nastavení barvy na červenou
SDL_RenderDrawLine(renderer, pos, pos, pos + 10, pos + 10); // Vykreslení čáry
pos++;
SDL_RenderPresent(renderer); // Prezentace kreslítka
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
Co lze dělat pomocí SDL
?
Knihovna SDL
nabízí spoustu funkcionality k tvorbě interaktivních aplikací a her. Můžete s ní
například: