Lovíme minotaury (5. část, zásah)

Ostatní jazyky Petr Lite 3D grafika Lovíme minotaury (5. část, zásah)

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

Střelbu již máme, teď ještě zásahy. Střela by se měla zarazit o zeď. Při nárazu na zeď přidáme efekt výbuchu střely a na zdi ponecháme spálený flíček. Obsluhu nárazu do zdi budeme doplňovat do funkce obsluha střel a výbuchů, před podmínku dolet střely. Je-li na nové pozici střely detekováno neprůchodné políčko, je střela vypnuta.

Vyzkoušejte. Střely by se měly zarážet o zeď. Poznáte to podle doprovodné záře na stěnách, která zmizí po nárazu do zdi.

Doplníme zvuk nárazu do zdi. Podle vzdálenosti místa dopadu střely nastavíme hlasitost zvuku. Použijeme jako rozlišovací kód zvuku index střely a tím zajistíme, že zvuky od různých střel budou na sobě nezávislé.

Opět vyzkoušejte. Zvuky při nárazu do zdi by měly se vzdáleností dopadu slábnout.

Nyní k výbuchům. Výbuchy střel budeme recyklovat podobně jako střely. Výbuchy budeme vytvářet ve funkci vytvoření střel a výbuchů, hned za skupinou vytvoření střely. Bude to opět 2D objekt s texturou kterou vidíte níže. Výbuch bude mít průhlednost typu 11, tedy typ "oheň". To znamená, že barva bodů se bude přičítat k barvě podkladu. 2D objekt volíme proto, aby byl výbuch vždy vidět jako kruh a ne elipsa v případě, že bychom se dívali na zeď šikmo. Aby se nám výbuch nezobrazil uříznutý zdí, vypneme u něj hloubkový test. To znamená, že grafické body budou ukládány vždy, i kdyby ležel objekt za zdí. Hloubkový test se nastavuje pro celou renderovací skupinu, proto objekt zařadíme do jiné skupiny než je implicitní 10 pro průhledné objekty.

Pozn.: Renderování (vykreslování) 3D objektů v systému Petr se provádí postupně po renderovacích skupinách. Tím lze dosáhnout speciálních efektů, kdy je třeba určovat vzájemné pořadí renderování objektů. Skupin je 16 a každý objekt může patřit ke kterékoliv ze skupin.

Zpět k obsluze střel a výbuchů. Za příkaz pro přehrátí zvuku zásahu přidejte skupinu zahájení výbuchu. Zde nastavíme souřadnice výbuchu shodně se souřadnicemi střely, vynulujeme čítač doby výbuchu a zapneme viditelnost výbuchu.

Pokud byste teď program spustili, viděli byste po každém zásahu zdi velkou placku výbuchu. Ne že byto mělo takto vypadat, ale funguje to jak má. Jsme teprve ve vývoji.

Animaci výbuchu obsloužíme ve stejné funkci, hned za obsluhou střel. Budeme k tomu potřebovat konstantu doba výbuchu, nastavte ji na 0.2. Je-li obsluhovaný výbuch aktivní (tj. je viditelný), zvýší se čítač doby výbuchu. Použitím převrácené hodnoty doby výbuchu zajistíme, že čítač dosáhne za čas doby výbuchu hodnotu 1. (Pozn.: Uvedeme-li znak dělení s jedním operandem, znamená to převácenou hodnotu, jako bychom uvedli ještě operand 1.) Rotaci podle osy Z nastavíme na náhodný úhel - tím zajistíme animaci výbuchu, aby nevypadal jako statický objekt. Změnou měřítek X a Y zajistíme zvětšování výbuchu s časem.

Barvu výbuchu budeme s časem měnit tak, že ji budeme ztmavovat až k úplné černé. Vzhledem k tomu, že výbuch se vykresluje operací 11 (tedy sčítání barev), projeví se ztmavování tak, že výbuch bude s časem slábout a mizet. Dosáhne-li čítač doby výbuchu hodnotu 1 (což je po uplynutí zvoleného času), vypnutím viditelnosti ukončíme animaci výbuchu.

Vyzkoušíte-li program, měly by výbuchy nyní už mizet.

Další efekt, kterého bychom chtěli docílit, jsou spáleniny na zdech od střel. Dosáhneme jich tak, že na zdi budeme lepit obrázky spálenin. Ale jen po určitou dobu, protože jich nemáme neomezeně. Budeme jim v programu pracovně říkat zásahy.

Ze všeho nejdříve potřebujeme seznam zásahů. Maximální počet zásahů si zvolíme 50. V seznamu budeme mít proměnné ID zásahu a čítač doby zásahu.

Zásahy vytvoříme ve funkci vytvoření zásahů, kterou spustíme během inicializace programu. Obsahem funkce je cyklus, který zajistí vytvoření všech objektů zásahů.

Zásahy budeme vytvářet jako čtvercové průhledné objekty s texturou viditelnou níže. Vzhledem k tomu, že potřebujeme, aby objekt původní podklad ztmavoval a přitom aby se s časem ztmavování dalo zeslabovat, nemůžeme použít jednoduchou operaci ztmavení 20 (typu sklo). Použijeme průhlednost 30, která dělá to, že cílovou barvu moduluje (násobí) doplňkem zdrojové barvy. Díky tomu můžeme ztmavováním barvy zásahu zajistit to, že účinek ztmavení postupně slábne. Z toho důvodu musíme použít texturu zásahu inverzní.

Vyskytne-li se více zásahů na jednom místě, můžeme pozorovat to, že překryv zásahů je nestabilní. Je to z toho důvodu, že vykreslování průhledných objektů se provádí s hloubkovým tříděním objektů. Při těsném překryvu objektů je již rozlišení pořadí vykreslování nejisté a rozlišení hloubkového bufferu nestačí. Proto budeme zásahy renderovat bez ukládání hloubkové informace. To bude mít za následek, že další zásahy se vykreslí vždy, bez ohledu na to, zda na daném místě nějaký zásah už je vykreslený nebo není. Zásahy se budou chovat tak, jakoby v daném místě vůbec nebyly. Podobně jako při vytváření výbuchů musíme pro toto nastavení hloubkového bufferu použít samostatnou renderovací skupinu.

Aktivací zásahu zajistíme ve funkci obsluha střel a výbuchů a to hned za skupinou zahájení výbuchu. Připravte si konstantu odsazení zásahu od stěny, kterou v inicializaci nastavte na 0.01.

Na začátku zahájení zásahu musíme vyhledat volný zásah, tj. zásah s vypnutou viditelností. Není-li nalezen žádný volný zásah (střelba je příliš rychlá nebo nemáme obslouženo mizení zásahů), použije se nejstarší z nich. Využívá se přitom toho, že seznam prochází jenom funkce pro obsluhu zásahů a ta ponechává index zásahu beze změny. Zásah umístíme na stejnou souřadnici jako střela, otočíme ho podle cílové stěny, inicializujeme čítač doby zásahu na 1 a zapneme viditelnost zásahu.

Obsluha rotace zásahu je poněkud komplikovaná, možná až krkolomná. Využíváme v ní toho, že průchodem střely stěnou se změnila celočíselná část některé její souřadnice.

Pokud se zvýšila celočíselná část souřadnice Z, střela prolétla zdí směrem nahoru (při pohledu na mapu bludiště shora). Proto zásah otočíme směrem dolů, tj. rotace Y bude 0. Současně opravíme souřadnici Z tak, aby zásah ležel kousek před zdí.

Jestliže se celočíselná část souřadnice Z zmenšila, prolétla střela zdí směrem dolů, tedy opačně než předešlý případ. Při testu nové souřadnice počítáme s tím, že může mít zápornou hodnotu a proto provádíme korekci přičtením a odečtením 1.

Jestliže se celočíselná část souřadnice Z nezměnila, bude se jednat o levou nebo pravou stěnu, proto ji podobně rozlišíme testem souřadnice X. Opět kromě otočení dokorigujeme i přesnou souřadnici X.

Vyzkoušením programu ověřte, zda se po zásahu stěny objevují spáleniny a to na stěnách ve všech 4 směrech. Zatím spáleniny nemizí samy, ale měly by mizet jestliže překročíte jejich maximální počet 50.

Nakonec obsloužíme mizení zásahu. Připravte si číselnou konstantu doba mizení zásahu. Nastavením na hodnotu 15 určíme, že zásah zmizí za 15 sekund. Obsluhu zajistíme funkcí obsluha zásahů. Vložte její volání do hlavní smyčky programu.

V obsluze zásahů budeme procházet seznam všech zásahů a hledat zásahy, které jsou aktivní (tj. viditelné). Index zásahu nenastavujeme na výchozí hodnotu, aby po skončení funkce jeho hodnota zůstala stejná jak před vstupem do funkce.

Nalezneme-li aktivní (viditelný) záznam, snížíme čítač doby zásahu o uběhlý čas. Použitím převrácené hodnoty doby mizení zásahu zajistíme, že čítač přejde z hodnotu 1 na 0 za zvolenou dobu. Podle hodnoty čítače nastavíme barvu zásahu. Protože čítač klesá od 1 k 0, bude i jas objektu klesat od bílé k černé. Vzhledem k použitému typu průhlednosti bude obraz zásahu postupně mizet. Dosáhne-li čítač nuly, zásah vypneme.

Střelbu do zdi opět vyzkoušejte. Zásahy by tentokrát měly po nějaké době samy mizet.

.... dokončení příště


 

Stáhnout

Staženo 186x (1005.49 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 (6. část, lov)

 

 

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í!