Lovíme minotaury (3. část, minotauři)

Ostatní jazyky Petr Lite 3D grafika Lovíme minotaury (3. část, minotauři)

... pokračování z minulé lekce

V každém správném labyrintu má být alespoň jeden minotaurus. A protože jsme teprve začátečníci, nebudeme si život komplikovat složitými animovanými 3D modely, ale použijeme jednoduše nějaký obrázek minotaura, který si rozpohybujeme v grafickém editoru a pak obrázky nalepíme na 2D objekt. 2D objekt je zvláštní případ objektu. Je to jednoduchá rovná plocha, která se neustále natáčí směrem ke kameře. Pokud ji opatříme např. obrázkem stromu, tak stále vidíme strom, ať jdeme kam chceme.

Budete-li si připravovat textury minotaura, použijte velikost 256 x 256 bodů a okolí minotaura vyplňte průhlednou barvou. Nebo můžete použít textury, které naleznete na konci lekce. Kromě minotaura si připravíme ještě i texturu stínu pod minotaurem, což je bílá plocha s šedým flíčkem uprostřed.

Připravte si funkci vytvoření minotaurů a zavolejte ji během inicializace programu. Zatím jen jako první pokus vytvoříme jednoho minotaura na nějaké pozici blízko nás. ID objektu uložíme teď jen do prozatimní proměnné. Nastavením prvku obrysy na hodnotu 0.8 zajistíme, že místa s průhlednou barvou budou průhledná. U minotaura můžeme vypnout osvětlení objektu, protože obrázek je už nastínován a po ztmavení by působil nepřirozeně.

Funkce obrysy se liší od funkce průhlednost, kterou jsme používali dříve. Při průhlednosti se kombinují grafické body objektu s grafickými body pozadí. U obrysů se testuje průhlednost vykreslovaného bodu a buď se bod vykreslí nebo ne. Zatímco při průhlednosti se ukládá hloubková informace o bodu i v případě plné průhlednosti, u obrysů se nevykreslený bod chová jako by tam vůbec nebyl. Obrysy neumožňují hladké obrysy objektu, ale nevznikají komplikace při vícenásobném překryvu průhledných objektů.

Po spuštění byste měli spatřit přímo před sebou minotaura. Když kolem něj procházíte, natáčí se stále na vás.

Po vytvoření minotaura vytvoříme ještě jeho stín. Bude to šedá ploška vznášející se nepatrně nad zemí. Opět zatím jen provizorně. Nastavíme průhlednost typu 20, která působí ztmavení podkladu.

Po spuštění by měl být pod minotaurem patrný stín.

Teď si minotaury rozmnožíme. Připravtesi seznam minotaurů. Počet minotaurůbude stačit 10, budeme je neustále recyklovat. V seznamu budeme potřebovat proměnné ID minotaura, ID stín minotaura, souřadnice X minotaura a souřadnice Z minotaura.

Zpět k funci vytvoření minotaurů. Minotaury budeme vytvářet v cyklu pro všechny prvky seznamu. Nejdříve vytvoříme minotaura, stejně jako jsme to udělali zkušebně před chvílí, jen vypustíme příkazy pro nastavení souřadnice X a Z. Dále vytvoříme stín, opět stejně a opět bez nastavení souřadnic X a Z. Posledním příkazem ve smyčce bude zavolání funkce umístění minotaura, která vygeneruje novou náhodnou pozici minotaura. Zatím funkci nemáme, proto ji založte.

V obsluze funkce umístění minotaura budeme v nekonečné smyčce hledat náhodnou volnou pozici pro vybraného minotaura. Nejdříve vygenerujeme náhodnou souřadnici. Bude to náhodné číslo odvozené z rozměrů plochy, s hodnotami 0.5, 1.5, 2.5 atd.

Po vygenerování náhodných souřadnic otestujeme novou pozici, zda je volná. To znamená, musí tam být prázdné políčko a nesmí tam být žádný jiný aktér (test aktérů budeme mít až později). Funkci pro test průchodnosti předáváme ID minotaura (kvůli testu kolize aktérů) a odstup od zdi minotaura. Odstup od zdi minotaura je konstanta, kterou si připravte ve společných proměnných, její hodnotu nastavte v inicializaci na 0.4. Další testovanou podmínkou bude, že nová pozice musí mít určitou minimální vzdálenost od kamery. Toje z toho důvodu, aby se po zastřelení příšery neobjevila nová hned u hráče, to by jistě nevypadalo moc dobře. Jsou-li všechny podmínky splněny, aktualizuje se nová souřadnice minotaura zavoláním funkce aktualizace souřadnice minotaura. Tu zatím nemáme, připravte si prázdnou. Poté se smyčka přeruší. Nejsou-li podmínky splněny, pokračuje se v hledání na nové náhodné pozici.

Ve funkci aktualizace souřadnic minotaura jen jednoduše nastavíme minotaura i jeho stín na aktuální souřadnice minotaura.

Program spusťte a projděte se pobludišti. Měli byste nacházet roztroušené minotaury. Je jich sice jen jako šafránu, ale až vás budou kousat bude jich až moc. Chcete-li si udělat přehled, změňte na chvíli v inicializaci výšku kamery Y na hodnotu např. 3 a přidejte rotaci X s hodnotou 0.5. Uvidíte bludiště s minotaury z nadhledu.

Minotaury rozhýbeme. Založte novou funkci, obsluha minotaurů, a přidejte její volání do hlavní smyčky programu, za obsluhu klávesnice. Nejdříve budeme animovat pohyb. Připravte si proměnnou fáze pohybu minotaurů. Dále potřebujeme konstantu rychlost animace minotaura, její hodnotu nastavte v inicializaci na 6. V obsluze minotaurů zvýšíme čítač fáze pohybu minotaurů a to opět s využitím čítače uběhlého času a konstanty rychlosti animace minotaura. Pokud proměnná fáze přeteče přes maximální hodnotu, což je vnašem případě 8 (animace má 8 fází), odečteme 8 a tím posuneme čítač opět na začátek. Mohli bychom čítač vynulovat, ale tím bychom mohli dosáhnout nerovnoměrnou délku první fáze animace. Podle celočíselné části fáze pohybu si připravíme příslušnou texturu. Uchováme si ji do proměnné textura minotaura, kterou jsme si pro ten účel připravili v místních proměnných funkce. Mohli bychom pro každého minotaura použít jiný ukazatel fáze, aby se nepohybovali stejně, ale máme jich ve scéně málo a je poměrně nízká pravděpodobnost výskytu více minotaurů viditelně blízko sebe.

Po přípravě textury nastavíme texturu všem minotaurům.

Program vyzkoušejte. Měli byste vidět minotaury, kteří se pohybují jako při chůzi. Samozřejmě stále ještě stojí na místě.

Do stejné smyčky, kde nastavujeme texturu minotaura, začneme doplňovat pohyb minotaura. Nebude oplývat žádnou zvláštní inteligencí. Koneckonců, co byste čekali od příšery. Takže se bude jen snažit jít pomalu co nejkratší cestou k hráči. To zajistíme následující metodou. Z rozdílů souřadnic kamery a minotaura vypočteme vektor směru k hráči. Ten normalizujeme (tj. vydělíme jeho délkou) a vynásobíme rychlostí pohybu minotaura korigovanou uplynulým časem. Konstantu rychlost pohybu minotaura si pro ten účel připravíme ve společných proměnných a nastavíme jí hodnotu 0.1. Přičtením násobku k aktuální pozici získáme novou pozici minotaura. Výsledek si uložíme do přechodných lokálních proměnných nová souřadnice X a Zminotaura.

S novou souřadnicí budeme zacházet podobně jako při pohybu hráče. Nejdříve otestujeme, zda je nová souřadnice průchozí. Pokud ano, uložíme ji a aktualizujeme souřadnici minotaura.

Není-li nová pozice průchozí, pokusíme se o pohyb sklouzáváním po stěně. Na rozdíl od obsluhy hráče chceme, aby se v případě sklouzávání minotaurus pohyboval plnou rychlostí. Proto vypočteme nedříve novou souřadnici Z pro pohyb pouze ve směru Z. Následuje test, zda je nová souřadnice průchozí s tím, že souřadnici použijeme starou. Je-li pozice průchozí, uložíme novou souřadnici Z jako platnou. Není-li průchozí, pokusíme se podobně sklouzávat ve směru X.

Vyzkoušejte program, zda se minotauři skutečně pohybují směrem k vám a nezůstávají někde nelogicky viset. Pokud bychom otočili vektor směru, minotauři by naopak před námi utíkali. To se využívá v případě, kdy se nepřítel loučí se životem a přechází z útoku na útěk.

Přecházíme k poslední záležitosti dnešní lekce - kolize s aktéry. Vraťte se zpět do funkce test kolize s aktéry. Potřebujeme pro ten účel konstantu minimální vzdálenost mezi aktéry, kterou v inicializaci nastavíme na 0.8. Při vzájemných kolizích aktérů je nutné používat stejnou vzdálenost pro obě strany, jinak by sestávalo např. že po přiblížení příšery hráč zkamení a nebude schopen se pohnout.

Nejdříve budeme testovat, zda testovaná pozice koliduje s hráčem. Souřadnice je v pořádku v případě, že tazatelem je hráč (s ID = 1) nebo vzdálenost je dostatečně velká.

Podobně budeme testovat kolizi s minotaury. Projdeme seznam všech minotaurů a ověříme, zda je tazatelem dotyčný minotaurus nebo zda je vzdálenost dostatečně velká. Pozor však na to, že funkce je volána z funkcí, které procházejí seznam minotaurů. To znamená, že po návratu z funkce musí index v seznamu minotaurů ukazovat na stejnou pozici. Proto se index v seznamu nenastavuje na výchozí hodnotu a seznam se prochází úplně celý (celý se jednou projede), i kdyby byl výsledek testu už jasný. Tím se zajistí neporušenost indexu. Raději bychom si měli k funkci do poznámky připsat na to upozornění.

To by mělo být vše. Spusťe program a důkladně vše vyzkoušejte. Minotauři by se měli pomalu pohybovat k vám, neměli by na sebe šlapat, měli by se o vás zarazit a také vy se máte zarazit o ně. Mimochodem, trochu nám kulhají, ale kdo je dokonalý.

.... pokračování příště


 

Stáhnout

Staženo 235x (961.23 kB)
Aplikace je včetně zdrojových kódů v jazyce Petr Lite (jsou obsaženy v EXE souboru, který lze v programu přímo otevřít)

 

  Aktivity (1)

Článek pro vás napsal Panda38
Avatar
Programátor C++, WinAPI, ASM.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
3D grafika
Miniatura
Následující článek
Lovíme minotaury (4. část, střelba)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!