Lovíme minotaury (4. část, střelba)

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

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

Přichází akce. Dáme hráči zbraň. Zvolíme fázer, protože ho můžeme doprovodit zajímavými efekty.

Připravíme si funkci vytvoření zbraně. Zavolejte ji během inicializace. Hráč nevidí zbraň celou, stačí vytvořit hlaveň. Složíme ji z jádra fázeru, jakéhosi reaktoru, což bude zeleně zářící trubka. Kolem jádra bude plášť. Obojí spojené do skupiny, abychom mohli se zbraní snadno manipulovat.

Jádro vytvoříme jako válec bez podstav. Složitost stačí poměrně nízká, 3. Výšku Y ponecháme 1, velikost nastavíme až u celé sestavy. Válec sklopíme kolem osy X dolů a tím ho položíme ve směru od sebe. Texturu použijeme podle následujícího obrázku (naleznete ji na konci kapitoly). Osvětlení objektu vypneme, je to zářící objekt a nechceme tedy aby byl stínovaný.

Plášť fázeru je také otexturovaný válec bez podstav. Nastavíme mu kovový odlesk a obrysy, tím zprůhledníme otvory v plášti, aby bylo viditelné jádro.

Jádro i plášť fázeru spojíme do skupiny a celek připojíme ke kameře, aby hráč zbraň viděl stále před sebou. Nastavíme velikost fázeru, nakloníme ho trochu nahoru a posuneme mírně dolů pod oči hráče. Zobrazení zbraně je ve skutečnosti velmi nereálné. Kdybychom se podívali na hráče ze strany, byla by to malá trubička těsně před jeho očima. Ale to je ve 3D grafice častý případ, že se věci šidí aby nějak vypadaly a často vypadají líp než kdyby se zobrazily realisticky. K nereálnému měřítku jsme sáhli proto, že hráče pouštíme blízko zdi a delší zbraň by pronikala zdí.

Program spusťe. Měli byste vidět hlaveň fázeru. Zkuste se otáčet, vidíte jak se měni její kovový lesk. Zbraň by nikde neměla vniknout do zdi.

Pro zvýšení efektu budeme zbraň animovat. Založte funkci animace zbraně a volejte ji z hlavní smyčky programu. V obsluze funkce budeme náhodně rotovat jádro fázeru. Tím docílíme efekt blikání povrchu. Fázer budeme posouvat do stran, vesměru X, a to podle aktuálních souřadnic hráče. Dosáhneme tím efektu jako když hráč svou zbraní houpe přichůzi. A ještě ji budeme lehce naklánět do stran.

Vyzkoušejte funkčnost. Projděte se a sledujte jak se zbraň pohybuje s chůzí. Je to poměrně zjednodušená metoda, rychlost houpání je závislá na směru chůze a při jednom diagonálním směru se zbraň nehýbe vůbec. Ale hráči to pro dojem stačí, stejně diagonální chodby v naší hře nemáme. Dokonce tato nedokonalost přidává trochu realistické proměnlivosti. (Žeby byl hráč směrem na severozápad unavenější?)

Přejdeme k obsluze střel. Vytvořte si seznam střel. Maximálni počet střel stačí 10. Seznam bude obsahovat číselné proměnné ID střely, směr letu střely Y a čítač doletu střely. Později ještě budeme potřebovat ID výbuchu a čítač doby výbuchu, můžete si je tam připravit už předem.

Střely vytvoříme předem a budeme je recyklovat. Vytvářet je budeme ve funkci vytvoření střel a výbuchů, jejíž volání přidejte do inicializace. Ve funkci vytvoříme všechny střely jako 2D objekty s texturou zobrazenou níže. Možná jste čekali průhledný válec. Je to zas trochu ošizení, abychom si práci zjednodušili. Průhledná textura zajistí rozmazané hrany střely. Při rychlosti střely hráč nezpozoruje nesoulad, střelu nevidí nikdy ze strany. Střele nastavte výšku Y podle konstanty výška střely nad zemí, kterou v inicializaci nastavte na 0.4. Viditelnost vypněte, střely budou viditelné jen když poletí.

Chcete-li se podívat jak střela vypadá a doladit vzhled, přesuňte na chvíli skupinu pro vytvoření střely mimo cyklus, odstavte tlačítkem Vypnout vypnutí viditelnosti střely a přidejte nastavení souřadnic X a Z někam blízko hráče, např. 2 a 0.5. Program spusťe a podívejte se na střelu vedle vás. Až ji doladíte, nezapomeňte vše vrátit zpět.

Do skupiny ovládání hráče v hlavní smyčce doplníme obsluhu zahájení střelby. Potřebujeme k tomu proměnnou čítač času do dalšího výstřelu (při startu programu musí mít hodnotu 0, protoji raději inicializujte), konstantu doba mezi střelami, kterou inicializujte na hodnotu 0.25 (což znamená výstřely za sekundu) a funkci výstřel. Obsluha odečítá uběhlý čas od posledního výstřelu a pokud dosáhl nuly a je stisknuta střílecí klávesa (zvolili jsme mezerník a obě klávesy Ctrl), tak odstartuje nové čítání času a zavolá funkci generující novou střelu.

Do obsluhy funkce výstřel nejdříve zkusmo přidejte jen příkaz pro přehrátí zvuku výstřelu a vyzkoušejte, zda program reaguje správně na střílecí klávesy opakovanými zvuky výstřelu.

Při zahájení výstřelu budeme procházet postupně všechny střely seznamu a budeme hledat, která střela je volná, to znamená která má vypnutou viditelnost. Seznam neprohledáváme od začátku, ale odproměnné index minulé střely, ve které máme uchovaný index minule vygenerované střely. Je to z toho důvodu, že ke každé střele patří i výbuch. Při krátké střelbě do blízké zdi by se mohlo stát, že recyklujeme střelu jejíž výbuch ještě probíhá a mohla by ho novým výbuchem předčasně ukončit. Dalším důvodem je zvuk výstřelu, mohl by se předčasně ukončit probíhající zvuk předešlé střely.

Není-li střela viditelná, je možné ji recyklovat. ID střely si uchováme doproměnné ID střely se září, použijeme ji později při obsluze záře od střely. Přehrajeme zvuk výstřelu. Aby se při opakování výstřelu nespouštěl a nepřerušoval stále stejný zvuk, použijeme rozlišovací kód zvuku podle indexu střely. Zapneme viditelnost střely a nastavíme ji na souřadnici kamery. Z kamery si uchováme aktuální směr otočení Y, to bude směr letu střely. Čítač doletu střely nastavíme na hodnotu podle konstanty vzdálenost doletu střely, kterou v inicializaci nastavte na hodnotu 5 (tj. dolet střely je 5 políček).

Pokud teď program vyzkoušíte, můžete vidět, že při couvání a současné střelbě trousíte za sebou střely, až do počtu 10.

Dále se budeme zabývat funkcí obsluha střel a výbuchů. Její volání doplňte do hlavní smyčky programu.

Přidejte do programu konstantu rychlost letu střely, kterou nastavte v inicializaci na hodnotu 5 (tj. 5 políček za sekundu). Ve funkci si připravte místní proměnné stará souřadnice X střely, stará souřadnice Z střely, nová souřadnice X střely a nová souřadnice Z střely. Důvod jejich použití bude zřejmý za chvíli.

Obsluhu střel provádíme postupně v cyklu pro všechny střely. Není třeba inicializovat ukazatel v seznamu, po překročení konce se převine automaticky nazačátek.

Narazíme-li na viditelnou (to znamená letící) střelu, obsloužíme ji. Uchováme si staré souřadnice střely na později a vypočteme a nastavíme nové souřadnice podle směru letu střely. Odečteme urazenou vzdálenost od čítače doletu střely a pokud je hodnota čítače rovna nebo menší 0, vypneme viditelnost střely a tím let střely ukončíme.

Program vyzkoušejte. Měli byste být schopni střílet střelami, střely v určité vzdálenosti samy mizí. Vidíme při tom, že jsme zvolili příliš vysokou rychlost otáčení, špatně se s ní zaměřuje. Snížíme ji proto na 3.

Přidáme ke střele další doprovodný efekt, záři. Záře střely osvítí okolní prostředí. Použijeme k tomu objekt světlo. Světel máme ve 3D prostředí jen omezený počet. Zpravidla 8, v závislosti na grafické kartě. Proto si vystačíme pouze s jednou září, kterou použijeme vždy jen pro nejbližší střelu. Omezení není příliš nápadné - při opakované střelbě je nejvýraznější osvětlení místa blízko hráče a při ukončení střelby je patrné plynutí záře s poslední střelou.

Vytvoření záře přidáme na konec funkce vytvoření střel a výbuchů. Do proměnné ID střely se září si uchováme naposledy použitou ID střely (je jedno která střela to je). To proto, že záři obsluhujeme podle střel a tak aby se záře vypnula hned při spuštění programu. Záři vytvoříme jako objekt světla. Barvu záře jsme zvolili zelenou, aby byla dobře kontrastní s okolním prostředím. Typ světla bodové - střela bude osvětlovat vše kolem sebe. Nastavením kvadratického zeslabení na 0.5 dosáhneme toho, že záře bude dosahovat jen do určité vzdálenosti, jen aby osvítila blízké stěny.

Obsluhu záře přidáme nakonec funkce obsluhastřel a výbuchů. Do místních proměnných funkce si připravte logickou proměnnou záře viditelná. Jak si asi vzpomínáte, při aktivaci nové střely jsme si uchovali ID nejnovější střely do proměnné ID střely se září. V obsluze záře si uchováme příznak viditelnosti střely a její souřadnice X a Z, to vše pak nastavíme do parametrů záře. Tím jsme zajistili, že záře bude střelu sledovat a případně se vypne, nebude-li mít o ni žádná střela už zájem.

Program spusťe a záři vyzkoušejte. Měla by sledovat naposledy vystřelenou střelu. Ale - přiznejme si to - výsledek je dost nevalný. Záře osvětluje pouze strop a jednu stranu stěn. Podlaha a stěny na opačné straně zůstávají beze změny. Je to z toho důvodu, že po součtu hlavního osvětlení a rozptýleného světla se na těchto stěnách dosáhlo maximálního osvitu. Proto se na nich přídavné světlo už nijak neprojeví.

Abychom efektu záře docílili, jsme nuceni snížit celkový jas scény. To je také jeden z důvodů, proč je většina her tmavě laděná - aby byla rezerva pro vytváření světelných efektů. Louč hořící poblíž jasně bílé stěny by jistě vypadala nezajímavě.

Ke snížení jasu prostředí si už předem připravíme novou funkci, aktualizace osvětlení, kterou využijeme později. Pomocí osvětlení budeme indikovat zranění hráče. Bude-li hráč zraněn, začne vidět červeně.

Připravte číselnou proměnnou život hráče (0 až 1), kterou v inicializaci nastavte na 1 (tedy maximální život hráče). Přidejte volání funkce aktualizace osvětlení do hlavní smyčky. V obsluze funkce vybereme jako aktivní objekt hlavní světlo scény, které má ID = 2. Barvu světla nastavíme tak, že červená složka bude neustále na maximální hodnotě 0.5, zatímco zelená a modrá složka bude klesat spolu s klesajícím zdravím hráče. Podobně nastavíme i rozptýlené světlo, jen intenzitu nastavíme nižší, na 0.3. V inicializaci programu můžete zrušit příkaz pro nastavení rozptýleného světla, který jsme tam dříve dali.

Teď již vypadají světelné efekty zajímavěji. Tmavší vzhled scény nemusí být problém. Scéna se zdá být tmavá jenom v oknovém režimu, kdy je okno obklopeno světlou plochou Windows. V celoobrazovkovém režimu vypadá hra podstatně lépe.

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


 

Stáhnout

Staženo 184x (931.69 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 (5. část, zásah)

 

 

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