Lovíme Minótaura (3. časť, Minotaur)
... pokračovanie z minulej lekcie
V každom správnom labyrinte má byť aspoň jeden Minotaurus. A pretože sme ešte len začiatočníci, nebudeme si život komplikovať zložitými animovanými 3D modely, ale použijeme jednoducho nejaký obrázok Minotaura, ktorý si rozhýbe v grafickom editore a potom obrázky nalepíme na 2D objekt. 2D objekt je zvláštny prípad objektu. Je to jednoduchá rovná plocha, ktorá sa neustále natáča smerom ku kamere. Pokiaľ ju opatríme napr. Obrázkom stromu, tak stále vidíme strom, nech ideme kam chceme.
Ak si budete pripravovať textúry Minotaura, použite veľkosť 256 x 256 bodov a okolie Minotaura vyplňte priehľadnou farbou. Alebo môžete použiť textúry, ktoré nájdete na konci lekcie. Okrem Minotaura si pripravíme ešte aj textúru tieňa pod Minotaurom, čo je biela plocha s šedým Flick uprostred.
Pripravte si funkciu vytvorenie minotaurov a zavolajte ju počas inicializácie programu. Zatiaľ len ako prvý pokus vytvoríme jedného Minotaura na nejaké pozíciu blízko nás. ID objektu uložíme teraz len do dočasná premennej. Nastavením prvku obrysy na hodnotu 0.8 zaistíme, že miesta s priehľadnou farbou budú priehľadná. U Minotaura môžeme vypnúť osvetlenie objektu, pretože obrázok je už nastínován a po stmavenie by pôsobil neprirodzene.
Funkcia obrysy sa líši od funkcie transparentnosť, ktorú sme používali predtým. Pri transparentnosti sa kombinujú grafické body objektu s grafickými bodmi pozadia. U obrysov sa testuje transparentnosť vykreslovaného bodu a buď sa bod vykreslí alebo nie. Zatiaľ čo pri transparentnosti sa ukladá hĺbková informácie o bode aj v prípade plnej transparentnosti, u obrysov sa nevykreslený bod chová ako by tam vôbec nebol. Obrysy neumožňujú hladké obrysy objektu, ale nevznikajú komplikácie pri viacnásobnom prekrytia priehľadných objektov.
Po spustení by ste mali uvidieť priamo pred sebou Minotaura. Keď okolo neho prechádzate, natáča sa stále na vás.
Po vytvorení Minotaura vytvoríme ešte jeho tieň. Bude to sivá plôška vznášajúce sa nepatrne nad zemou. Opäť zatiaľ len provizórne. Nastavíme priehľadnosť typu 20, ktorá pôsobí stmavenie podkladu.
Po spustení by mal byť pod Minotaurom viditeľný tieň.
Teraz si Minótaura rozmnožím. Připravtesi zoznam minotaurov. Počet minotaurůbude stačiť 10, budeme ich neustále recyklovať. V zozname budeme potrebovať premenné ID Minotaura, ID tieň Minotaura, súradnice X Minotaura a súradnice Z Minotaura.
Späť k Func vytvoreniu minotaurov. Minotaur budeme vytvárať v cykle pre všetky prvky zoznamu. Najskôr vytvoríme Minotaura, rovnako ako sme to urobili skúšobni pred chvíľou, len vypustíme príkazy pre nastavenie súradnice X a Z. Ďalej vytvoríme tieň, opäť rovnako a opäť bez nastavenia súradníc X a Z. Posledným príkazom v slučke bude zavolanie funkcie umiestnenie Minotaura, ktorá vygeneruje novú náhodnú pozíciu Minotaura. Zatiaľ funkciu nemáme, preto ju založte.
V obsluhe funkcie umiestnenie Minotaura budeme v nekonečnej slučke hľadať náhodnú voľnú pozíciu pre vybraného Minotaura. Najskôr vygenerujeme náhodnú súradnici. Bude to náhodné číslo odvodené z rozmerov plochy, s hodnotami 0.5, 1.5, 2.5 atď.
Po vygenerovaní náhodných súradníc otestujeme novú pozíciu, či je voľná. To znamená, musí tam byť prázdne políčko a nesmie tam byť žiadny iný aktér (test aktérov budeme mať až neskôr). Funkciu pre test priechodnosti odovzdávame ID Minotaura (kvôli testu kolízie aktérov) a odstup od steny Minotaura. Odstup od steny Minotaura je konštanta, ktorú si pripravte v spoločných premenných, jej hodnotu nastavte v inicializácii na 0.4. Ďalšie testovanú podmienkou bude, že nová pozícia musí mať určitú minimálnu vzdialenosť od kamery. Toje z toho dôvodu, aby sa po zastrelenie príšery neobjavila nová hneď u hráča, to by určite nevyzeralo moc dobre. Ak sú všetky podmienky splnené, aktualizuje sa nová súradnice Minotaura zavolaním funkcie aktualizácie súradnice Minotaura. Tú zatiaľ nemáme, pripravte si prázdnu. Potom sa slučka preruší. Ak nie sú podmienky splnené, pokračuje sa v hľadaní na nové náhodné pozíciu.
Vo funkcii aktualizácie súradníc Minotaura len jednoducho nastavíme Minotaura aj jeho tieň na aktuálne súradnice Minotaura.
Program spustite a prejdite sa pobludišti. Mali by ste nachádzať roztrúsené Minótaura. Je ich síce len ako šafranu, ale až vás budú hrýzť bude ich až moc. Ak chcete si urobiť prehľad, zmeňte na chvíľu v inicializácii výšku kamery Y na hodnotu napr. 3 a pridajte rotáciu X s hodnotou 0.5. Uvidíte bludisko s Minótaura z nadhľadu.
Minotaur rozhýbeme. Založte novú funkciu, obsluha minotaurov, a pridajte jej volanie do hlavnej slučky programu, za obsluhu klávesnice. Najskôr budeme animovať pohyb. Pripravte si premennú fázy pohybu minotaurov. Ďalej potrebujeme konštantu rýchlosť animácie Minotaura, jej hodnotu nastavte v inicializácii na 6. V obsluhu minotaurov zvýšime čítač fázy pohybu minotaurov a to opäť s využitím počítadla uplynulého času a konštanty rýchlosti animácie Minotaura. Ak premenná fáza pretečie cez maximálnu hodnotu, čo je vnašom prípade 8 (animácie má 8 fáz), odpočítame 8 a tým posunieme čítač opäť na začiatok. Mohli by sme čítač vynulovať, ale tým by sme mohli dosiahnuť nerovnomernú dĺžku prvej fázy animácie. Podľa celočíselné časti fázy pohybu si pripravíme príslušnú textúru. Uchováme si ju do premennej textúra Minotaura, ktorú sme si pre ten účel pripravili v miestnych premenných funkcie. Mohli by sme pre každého Minotaura použiť iný ukazovateľ fázy, aby sa nepohybovali rovnako, ale máme ich v scéne málo a je pomerne nízka pravdepodobnosť výskytu viac minotaurov viditeľne blízko seba.
Po príprave textúry nastavíme textúru všetkým minotaurům.
Program vyskúšajte. Mali by ste vidieť Minótaura, ktorí sa pohybujú ako pri chôdzi. Samozrejme stále ešte stojí na mieste.
Do rovnakej slučky, kde nastavujeme textúru Minotaura, začneme dopĺňať pohyb Minotaura. Nebude oplývať žiadnu zvláštnu inteligenciou. Koniec koncov, čo by ste čakali od príšery. Takže sa bude len snažiť ísť pomaly čo najkratšou cestou k hráčovi. To zaistíme nasledujúce metódou. Z rozdielov súradníc kamery a Minotaura vypočítame vektor smeru k hráčovi. Ten normalizujú (tj. Vydelíme jeho dĺžkou) a vynásobíme rýchlosťou pohybu Minotaura korigovanú uplynulým časom. Konštantu rýchlosť pohybu Minotaura si pre ten účel pripravíme v spoločných premenných a nastavíme jej hodnotu 0.1. Pripočítaním násobku k aktuálnej pozícii získame novú pozíciu Minotaura. Výsledok si uložíme do prechodných lokálnych premenných nová súradnice X a Zminotaura.
S novou súradnicou budeme zaobchádzať podobne ako pri pohybe hráča. Najskôr otestujeme, či je nová súradnice priechodná. Ak áno, uložíme ju a aktualizujeme súradnicu Minotaura.
Ak nie je nová pozícia priechodná, pokúsime sa o pohyb sklouzáváním po stene. Na rozdiel od obsluhy hráča chceme, aby sa v prípade skĺzavaniu Minotaurus pohyboval plnou rýchlosťou. Preto vypočítame nedříve novú súradnicu Z pre pohyb iba v smere Z. Nasleduje test, či je nová súradnice priechodná s tým, že súradnicu X použijeme starú. Ak je pozícia priechodná, uložíme novú súradnicu Z ako platnú. Ak nie je priechodná, pokúsime sa podobne skĺzavať v smere X.
Vyskúšajte program, či sa Minotaur skutočne pohybujú smerom k vám a nezostávajú niekde nelogicky visieť. Ak by sme otočili vektor smeru, Minotaur by naopak pred nami utekali. To sa využíva v prípade, keď sa nepriateľ lúči so životom a prechádza z útoku na útek.
Prechádzame k poslednej záležitosti dnešnej lekcie - kolízie s aktérmi. Vráťte sa späť do funkcie test kolízie s aktérmi. Potrebujeme pre ten účel konštantu minimálna vzdialenosť medzi aktérmi, ktorú v inicializácii nastavíme na 0.8. Pri vzájomných kolíziách aktérov je nutné používať rovnakú vzdialenosť pre obe strany, inak by pozostávalo napr. Že po priblížení príšery hráč skamenie a nebude schopný sa pohnúť.
Najskôr budeme testovať, či testovaná pozície koliduje s hráčom. Súradnice je v poriadku v prípade, že anketárom je hráč (s ID = 1) alebo vzdialenosť je dostatočne veľká.
Podobne budeme testovať kolízii s Minótaura. Prejdeme zoznam všetkých minotaurov a overíme, či je anketárom dotyčný Minotaurus alebo či je vzdialenosť dostatočne veľká. Pozor však na to, že funkcia je volaná z funkcií, ktoré prechádzajú zoznam minotaurov. To znamená, že po návrate z funkcie musí index v zozname minotaurov ukazovať na rovnakú pozíciu. Preto sa index v zozname nenastavuje na predvolenú hodnotu a zoznam sa prechádza úplne celý (celý sa raz prejde), aj keby bol výsledok testu už jasný. Tým sa zaistí neporušenosť indexu. Radšej by sme si mali k funkcii do poznámky pripísať na to upozornení.
To by malo byť všetko. Spustite program a dôkladne všetko vyskúšajte. Minotaur by sa mali pomaly pohybovať k vám, nemali by na seba šliapať, mali by sa o vás zaraziť a tiež vy sa máte zaraziť o ne. Mimochodom, trochu nám kulhají, ale kto je dokonalý.
.... pokračovanie nabudúce
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 247x (961.23 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Petr Lite (sú obsiahnuté v EXE súbore, ktorý možno v programe priamo otvoriť)