IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

2. diel - SDĽ - Vytvorenie okná a vstup od užívateľa

V tomto diele si povieme niečo o základnom rozvrhnutie aplikácie, o vytvorení okná ao užívateľskom vstupe.

Nekonečná slučka

Každá hra, prípadne aplikácie, ktorá niečo vykresľuje (ai samotný operačný systém), pracuje v slučke, ktorá je nekonečná.

int main()
{
    LoadConfiguration();
    Inicialization();
    while(true)
    {
        ProcessInput();
        UpdateScrene();
        RenderScrene();
    }
    Shutdown();
    return;
}

Na začiatku načítame konfiguráciu, potom inicializujeme základný systém, s ktorým budeme pracovať. Načítanie konfigurácia nie je nutné, ak žiadnu nemáme. Aplikácia následne vkročí do nekonečnej slučky, v ktorej sa neustále opakujú tri aktivity: získanie vstupu, aktualizácie scény a vykreslenie.

Podľa vstupu určíme, čo sa má ďalej odohrať - napríklad pri stlačení určitej klávesy posunieme hrdinu daným smerom. Pri aktualizácii scény vypočítame nový stav scény. Ako príklad uvediem polohu na mape. Môže to platiť samozrejme aj pre iné postavy, ako postavu hráča. Tie sa po mape pohybujú samostatne, nezávisle na vstupe od užívateľa (ten ovláda len hlavného hrdinu). Novú polohu ostatných postáv vypočítame práve v tejto fáze.

V poslednom kroku sa scéna vykreslí. Väčšinou sa vždy minimálne jeden objekt na mape pohybuje, preto je nutné scénu vykresliť vždy. Počet cyklov za sekundu udáva FPS (Frames per Second) - teda počet vykreslenie, ktoré aplikácie vykoná za sekundu. Ak v prvej fáze (pri vstupe) zaregistrujeme udalosť, ktorá aplikáciu vypína (stlačenie Esc alebo napríklad vypnutie aplikácie krížikom), vyskočíme z nekonečnej slučky a aplikáciu vypneme. Tento scenár budeme využívať aj my.

Inicializácia SDL

K inicializácii SDL slúži funkcia SDL_Init. Prvým parametrom sú flagy inicializujúcich jednotlivé subsystémy SDL. Nás bude zaujímať predovšetkým flag SDL_INIT_VIDEO, ktorý inicializuje vykresľovanie a prácu s grafikou. Ak budeme chcieť pridať ďalšie subsystém, použijeme operátor OR (SDL_INIT_VIDEO|SDL_INIT_AUDIO). Subsystémy môžeme inicializovať aj postupne a to funkciou SDL_InitSubSys­tem, ktorá prijíma rovnaké parametre ako SDL_Init.

Pre vypnutie subsystému nájdeme v SDL funkcii SDL_QuitSubSub­system. Prijíma rovnaké parametre ako SDL_Init. Pre vypnutie všetkých subsystémov použijeme SDL_Quit. Môžeme tiež overiť, či bol subsystém inicializovaný funkcií SDL_WasInit. Tá vracia bitovú masku. Ak chceme zistiť, či bol určitý systém inicializovaný, musíme použiť binárne AND (viac v dokumentácii).

Vytvorenie okna

Základné funkcie je SDL_CreateWindow. Prvým parametrom je ukazovateľ na reťazec. Podľa tohto textu sa okno pomenuje. Ďalšie dva parametre sú súradnice ľavého horného rohu okna. Tu môžeme použiť konštanty SDL_WINDOWPOS_CENTERED alebo SDL_WINDOWPOS_UNDEFINED. Prvý konštanta vytvorí okno presne na strede obrazovky, druhá to potom nechá na operačnom systéme. Ďalšie dve súradnice sú šírka a výška okna. Posledným parametrom sú opäť flagy, ktoré upravujú vzhľad okna. Nájdeme tu flagy pre skryté okno (SDL_WINDOW_HIDDEN), minimalizované (SDL_WINDOW_MINIMIZED), okno s podporou OpenGL (SDL_WINDOW_OPENGL), fullscreen okno (SDL_WINDOW_FULLSCREEN) a ďalšie. Funkcia vracia ukazovateľ na štruktúru SDL_Window, s ktorou budeme ďalej pracovať.

Pokiaľ už okno nepotrebujeme, zrušíme ho unkcie SDL_DestroyWin­dow, ktorá sa o všetko postará. Pretože sa jedná o knižnicu určenú pre C, žiadne objekty sa neruší volaním delete.

Okrem toho máme k dispozícii funkcie pre manipuláciu s oknom. Môžeme nastavovať jeho svetlosť, pozíciu, maximálna a minimálna veľkosť, fullscreen a podobné veci. Pre viac informácií presmerujem na dokumentáciu. Tieto funkcie zatiaľ nebudeme potrebovať.

Získanie vstupu od užívateľa

Pre užívateľský vstup je situácia trochu komplikovaná, pretože každá udalosť má iné dáta, ktorá prenáša. Napríklad pre stlačenie tlačidla myši bude mať udalosť údaje o pozíciu, kde bola myš stlačená, zatiaľ čo u stlačení klávesy bude jediný údaj o klávese, ktorá bola stlačená. Z toho vyplýva, že každá udalosť má vlastnú štruktúru.

SDL nám to našťastie trochu uľahčuje - definuje union (typ, ktorý môže nadobúdať jeden z nadefinovaných typov), a zároveň každá štruktúra má premennú type, v ktorej je uložený jeden z enumerátora SDL_EventType. Onen vyššie spomínaný union je SDL_Event, ktorý v sebe obsahuje všetky štruktúry udalostí. To znamená, že SDL_Event obsahuje vždy atribút type, na základe ktorého sa môže program ďalej rozhodovať, ako bude s dátami pracovať.

Získanie udalostí

Základnou funkciou je SDL_PollEvent, ktorý uloží do prvého parametra typu SDL_Event * prvá udalosť vo fronte. Zároveň vracia hodnotu 1, ak bola udalosť odovzdaná. Pokiaľ už žiadne ďalšie udalosti vo fronte nie sú, vráti 0. Z toho možno ľahko odvodiť, že ak chceme vyzdvihnú všetky udalosti vo fronte, zavoláme túto funkciu v cykle.

SDL_Event * Event = new SDL_Event;
while (SDL_PollEvent(event))
{
    if (event->type == SDL_QUIT)
        EndGame();
    else if (event->type == SDL_KEYDOWN)
        MovePlayer();
}

Typy udalostí

Udalosť typu SDL_QUIT volá operačný systém a aplikácie by na neho mala vždy reagovať. Ide práve o zatvorenie okna krížikom, Alt + F4 a podobné spôsoby.

Ďalšími dôležitými udalosťami sú:
SDL_MOUSEBUTTON - registruje stlačenie tlačidla myši
SDL_KEYDOWN - registruje stlačenie klávesy
SDL_MOUSEMOTION - registruje pohyb myši

Udalosti budú podrobnejšie rozobraté v jednom z nasledujúcich dielov.

Spojme všetko dohromady

Aký teda bude návrh konečného programu? Zo začiatku inicializujeme SDL, potom vytvoríme nekonečnú slučku a ak zachytíme udalosť typu SDL_QUIT, tak aplikáciu ukončíme.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1009x (3.34 MB)

 

Predchádzajúci článok
SDL - Úvod a inštalácia
Všetky články v sekcii
SDĽ
Preskočiť článok
(neodporúčame)
SDĽ - Základy vykresľovanie
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity