LLamy - Technická dokumentácia
Revízia 1.0, copyright ©Andrej Krutak 2004

e-mail: andrek@inmail.sk
História: 1.0: Prvá verzia

Obsah:
1 Všeobecná štruktúra programu
2 Priebeh programu
3 Dodatky

Poznámka: Táto dokumentácia neobsahuje podrobný popis funkcií častí programu. Je to z viacerých dôvodov. Za prvé, hrubý popis dôležitých funkcií nájdete v jednotlivých hlavičkových a zdrojových súboroch (aj keď v anglickom jazyku :). Za druhé, spôsob, akým som jednotlivé funkcie implementoval je natoľko triviálny, že to snáď pochopí každý, kto sa trochu vyzná do C++ a má záujem o pochopenie. V niektorých zložitejších častiach programu sú pre lepšie pochopenie umiestnené komentáre :)

1 Všeobecná štruktúra programu
Zdrojové kódy programu llamy sú rozdelené na 4 logické celky:
  • llamy.cpp, llamy.h - funkcie a definície potrebné na inicializáciu grafiky a zvukov, ukladanie a načítanie konfigurácie a obsahuje aj hlavnú programovú "slučku" (ktorá zabezpečuje zobrazenie menu a spustenie jednotlivých častí programu...)
  • func.cpp, func.h - rôzne funkcie na prácu s obrázkami, zvukmi, textom a pod. Sú to väčšinou dosť obecné funkcie, takže sa používajú vo všetkých častiach programu...
  • playlevel.cpp, playlevel.h - zabezpečuje "simuláciu" aktuálneho levelu, komunikáciu s používateľom a pod.
  • map.cpp, map.h - obsahuje definície a implementácie objektov (tried) potrebných na simuláciu

    2 Priebeh programu
    Nasledujú diagramy, ktorý názorne zobrazujú priebeh programu:
    main()
    načítanie konfigurácie
    spracovanie konfigurácie
    reset:
    inicializácia SDL
    zobrazenie úvodnej obrazovky
    zobrazenie menu (showMenu())
    (možný skok na reset)
    uvoľnenie prostriedkov
    uloženie konfigurácie

    Zobrazenie menu:
    showMenu()
    načítanie definícií levelov
    restart:
    zobrazenie grafického menu pomocou funkcie showMenu2, ktorá vráti číslo vybranej položky; potom podľa výsledku:
    0) spustenie aktuálneho levelu (playLevel), po návrate z funkcie môže dôjsť k aktualizovaniu najvyššieho dosiahnutého levela
    1) zobrazenie dialógu na výber levelu (showLevelSelect)
    2) zobrazenie dialógu na zmenu nastavení (showSettings). Ak sa zmenili kritické nastavenia, funkcia vráti hodnotu 1, čím spôsobí novú inicializáciu SDL.
    3) koniec funkcie (návratová hodnota 0 spôsobí ukončenie programu)
    skok na restart

    Funkcie showLevelSelect a showSettings sú vo svojej podstate veľmi jednoduché a teda myslím, že je zbytočné popisovať ich funkciu. Preto sa rovno "vrhnem" na popis fungovania hlavnej časti programu - funkcie "playLevel".
    playLevel()
    načítanie grafických objektov
    načítanie mapy
    zobrazenie uvítacej obrazovky levelu
    inicializácia uživateľského prostredia
    hlavná slučka:
    vykreslenie levela, všetkých objektov a grafického prostredia
    spracovanie správ z grafického prostredia (klávesnica, myš, uzatváranie okna) - tu je možné vyskočiť z hlavnej slučky. V tejto časti sa aj nastavujú akcie llamám.
    nastavenie rýchlosti vypúštania llám
    simulácia "jedného životného kroku" mapy (Map::iterate)
    ukončenie:
    uvoľnenie prostriedkov
    volajúcej funkcii je vrátená informácia, či uživateľ prešiel level

    Metóda triedy Map iterate vykonáva všetky potrebné volania, aby sa nasimuloval jeden krok mapy...
    Map::iterate()
    inkrementuje aktuálny čas
    prípadne vytvorí nové llamy
    prejde všetky prebiehajúce akcie a zníži im zvyšný čas (a akcie, ktoré už nemajú existovať, zruší)
    prejde všetky živé llamy a každej umožní vykonať aktuálnu akciu (LLama::move)

    Metóda triedy LLama move vykonáva všetky potrebné volania, aby sa nasimuloval jeden krok llamy (LLama::doPhysics, LLama::doAction)...

    LLama::doPhysics()simulácia fyziky
    akutalizuje vertikálnu rýchlosť llamy (tiažovné zrýchlenie, berie do úvahy aj krídla)
    premiestňuje llamu po celej trajektórii
    ak narazí na zem a "letí" prirýchlo, "zabije" llamu a vytvorí na jej mieste kôpku
    inak ak narazí na zem, nastaví jej vertikálnu rýchlosť na 0
    inak nič (tzn. bude letieť ďalej) ;-)


    LLama::doAction()vykonávanie akcií
    v závislosti na akutálnej akcii zavolá jednu z funkcií doWalk, doDig, doExplode, doStairs, doDigger, doBlock, doClimb, doWings
    doAtomBomb tu nie je preto, lebo tento "nástroj" sa spracováva priamo vo funkcii playLevel, ktorá priradí všetkým živým LLamám akciu explode...


    Metóda triedy LLama doAction

    3 Dodatky
    Zobrazovanie explózií a podobných efektov
    Zobrazovanie a prehrávanie efektov je vyriešené pomocou tzv. akcií (sú to iné akcie, ako sú priradené llamám!). S týmito akciami sa pracuje pomocou metód triedy Map addAction, getActionCount a getAction. Pomocou funkcie addAction môže napr. LLama pri svojom výbuchu pridať do zoznamu akcií akciu ACTION_EXPLOSION. Vo funkcii playLevel sa potom prechádzaja zoznam akcií mapy a v prípade potreby sa prehrá nejaký zvuk alebo zobrazí vhodná časť animácie... Ako som už písal, v metóde Map::iterate pri každom kroku dôjde k zníženiu počítadla pre každú akciu, takže po istom čase dôjde k ukončeniu každej akcie :)

    Použité knižnice
    Na prácu s grafikou je v programe použitá knižnica SDL (ktorá je multiplatformová, takže LLamy idú aj na Linuxe :-), spolu s SDL_mixer (správa zvukov), SDL_Image (načítanie JPG, PNG...), SGE (jedoduchšia práca s obrázkami)