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:
    $ sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev
    Výhodou tohoto způsobu je, že knihovna bude nainstalována v systémových cestách, 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:

  • Vykreslovat body, čáry či obdélníky.
  • Reprezentovat obdélníky a počítat jejich průniky (např. pro detekci kolizí herních objektů).
  • Reagovat na vstup uživatele, ať už z klávesnice nebo z myši.
  • Načítat a vykreslovat obrázky.
  • Načítat a vykreslovat text.
  • Přehrávat zvuk.