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_InitSubSystem, ktorá
prijíma rovnaké parametre ako SDL_Init.
Pre vypnutie subsystému nájdeme v SDL funkcii SDL_QuitSubSubsystem. 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_DestroyWindow,
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 podmienkamiStiahnuté 1009x (3.34 MB)