NEWS | ČLÁNKY | DOWNLOAD | GUESTBOOK | TUTORIALS ObnovitZavřít
 
hl - ZONE Half-Life Half-Life 2 Half-Life 3
 
Episode One Episode Two Opposing Force Blue Shift Counter-Strike 1.6
 INFO
Přidat do oblíbených
Nastavit jako Homepage

ICQ: 272-515-771 
Aktualizace:

 SYSTÉM
 TLAČÍTKA
hl-ZONE Button 1
 
hl-ZONE Button 2
 SPOLUPRACUJEME
 Voda a vodopády Pondělí 05. 02. 2007
<-- Vlastní modifikace Vlastní modifikace - II. část -->

Minule jsme se podívali na tvorbu vlastního módu a slíbil jsem, že se tomuto tématu brzy vrátíme. Dneska tomu tak ale nebude. Když jsem se minule zmiňoval, že jsme probrali to nejzákladnější, co při tvorbě map může potřebovat, uvědomil, že jsem na něco zapomněl.

Na úvod:
Ano, zapomněl jsem na jeden přírodní úkaz, který se v původním Half-Life také mnohokrát vyskytoval. Jak již název tutoriálu napovídá, je jím pochopitelně voda. Dneska si tedy ukážeme, jak takovou vodu vytvořit a jak ji ovládat. My ale půjdeme o trochu dál a vytvoříme si i stoku, kde voda proteče proudem, ten pochopitelně bude mít vliv i na hráče samotného, a malý vodopád.

A opět to nebude nic těžkého. Half-Life je přeci jen už poměrně stará (i když stále dobrá) hra a tak je voda obyčejná brush entita func_water s vhodnou texturou a nastavením, která má několik drobných specifikací.

Ještě než přejdu k samotné tvorbě vody, upřesním situaci, kterou se dnes pokusíme realizovat. Mějme nějakou chodbu, kde je koryto a v něm proudí voda do haly s bazénem. Když z bazénu vylezeme, zjistíme, že jediná cesta dál je dveřmi na ochozu. Jenže řebřík k němu je spadlý a my se na něj jinak nedostaneme. Nezbývá nám než pustit ventil a tím bazén napustit. On se nenapustí jen bazén, ale vodou se zaplní téměř celá hala. A pak budeme moci nerušeně vyplavat na ochoz a pokračovat do dveří.

Rozložení mapy:
Takže budeme potřebovat dvě místnosti. V jedné bude koryto, kde poteče voda a ve druhé bude bazén a ventil, kterým halu naplníme vodou skoro až po okraj. Tahle část je v celku na vás a na vaší situaci, ale přeci jen sem si dal tu práci a připravil jsem vám malou ukázku, jak by to mohlo v reále vypadat. Takže mrkněte na následující obrázky.


Obr. 1
Stoka

Obr. 2
Hala s bazénkem

Obr. 3
Ochoz v hale

Pokud jste tedy vytvořili něco podobného tomuto, můžeme popojít dál. A čím začneme? Jelikož jsem entitu info_player_start umístil ke korytu, začal bych asi zde. Takže si nejprve vytvoříme tekoucí vodu.

Tip01:
A ještě před tím než se vrhneme na tu podstatnou část tutoriálu, upozorním, že textury vody se nacházejí v balíku liquids.wad, takže si ho přidejte v nastavení VHE (Tools -> Options... - Textures -> Add WAD -> liquids.wad -> OK) a pro jistotu VHE restartujte.

Textury vody v Half-Life nejsou nikterak promakané a je jich docela dost málo, ale snad to bude stačit. Jinak, pro stojatou vodu se používají ty textury, které začínají !, jiné radši nepoužívejte. A pro vodu tekoucí se používají textury animované, tedy ty, které začínají +X, kde X je číslo snímku a většinou za ním následuje slovo SCROLL.

Tekoucí voda:
Koryto tedy máme vytvořeno. Umístíme do něho brush s texturou nějaké tekoucí vody. Textura by tedy měla být animovaná (začíná +X, kde X je číslo aktuálního snímku). Já zvolil texturu s názvem +0WATERFALL1. U výběru textury může opět nastat problém. Tato voda je tmavě zelená, což někdy není na místě. Bohužel textura čisté, hezké, modré tekoucí vody prostě není. Pokud ji budete potřebovat, budete si ji muset vytvořit.

Když tedy máme vytvořen brush vody, převedeme ho na entitu func_conveyor. Tato entita se využívá pro pohybující se předměty, nebo ještě lépe textury. V Half-Life takhle byli tvořeny jezdící pásy, se kterými jsme se mohli setkat v RESIDUE PROCESSING. Ale pro naše účely nám entita poslouží dobře. Pojďme se podívat na nastavení:

func_conveyor - záložka Class_info:
Render FX: styl renderování objektu (blikání, pulsování, …)
Render Mode: způsob renderu objektu
FX Amount: průhlednost vyrenderovaného objektu
FX Color: dobarvení objektu
Name: jméno entity, pomocí kterého se na ni odvoláme
Conveyor Speed: rychlost rolování objektu

func_conveyor - záložka Flags:
No Push: po zaškrtnutí na nás entita nebude vyvíjet tlak
Not Solid: entitou budeme moci procházet, nebude hmotná

Tak to by bylo a teď už k samotnému nastavení naší tekoucí vody. Nebude toho mnoho:

Render Mode: texture
FX Amount: 150 (čím menší, tím průhlednější)
Conveyor Speed: 250
Angle: 180

No Push: zaškrtneme, aby na nás nevyvíjela tlak, o to se postará jiná entita
Not Solid: zaškrtneme, abychom se mohli do vody ponořit

Pokud bychom chtěli proud ovládat, tedy zapínat nebo vypínat, je možné zadat entitě jméno a pomocí nějakého spouštěče se pak na ni odvolávat. A ještě se zmíním k parametru Angle. Ten určuje jakým směrem (resp. pod jakým úhlem) se bude textura na entitě pohybovat, nebo jakým směrem vás bude entita tlačit. Proto je hodnota 180 pouze ilustrativní a nemusí vám fungovat. Za to mě nekamenujte, chyba je u vás a vy si Angle musíte nastavit podle vaší situace. Když nyní mapu zkompilujeme a skočíme do vody, zjistíme, že stále stojíme na místě. A to je chyba. Jelikož není entita pevná, nevyvíjí na nás žádný tlak a tudíž nás nikam nesune.

Takže nyní přidáme vodě sílu, tedy proud. Není nic jednoduššího, než použít entitu trigger_push nejlépe s texturou AAATRIGGER. Tu umístěte přes tekoucí vodu a nastavte ji následovně:

Speed of push: 250
Angle: 180

A opět Angle si nastavte podle sebe. Ale měl by být stejný, jako tomu bylo u entity výše. Určuje totiž směr, kam vás bude entita sunout. A k čemu se vlastně tato entita používá? Jak je demonstrováno na tomto případě. Použijeme ji všude tam, kde na hráče chceme vyvinou nějakou sílu a někam ho posunout. A nemusí jít vždy o horizontální směr. Proto vězte, že touto entitou docílit efektu trampolíny (myslím tu ze Xenu, která byla v Half-Life) nebo legendárního větráku z BLAST PITU. Pomocí této entity můžeme posouvat i objekty (třeba krabice), které jsou převedeny na entitu func_pushables.

Nyní máme hotovu část s korytem a tekoucí vodou. Pokud do koryta skočíme, proud by nás měl strhnout a odnést jeho směrem, tedy k ústí koryta do našeho bazénku. Než však vytvoříme vodu v nádrži, pojďme si ještě udělat vodopád.

Vodopád:
Vodopád bude opět brush převedený na entitu func_conveyor, s jediným rozdílem. Angle nastavte na Down. Teď je to natuty. Voda padá přeci dolů:-) To jak se s vodopádem pohrajete je jen na vás. Tím chci říct, že si ho budete muset vymodelovat a správně zarovnat textury. Ale radši to s tím Vertex Toolem nepřehánějte, špatné plochy se vám nezobrazí, nebo se mapa vůbec nezkompiluje.

Zakulaťte tedy hrany a vytvořte zhruba takový vzhled, jako když padá voda. Nahoře úzký, dole široký. Nyní musíme myslet trochu dopředu. Pro realističnost přidáme i páru, která se pochopitelně u vodopádu vytváří (možná, že ten náš je na to moc malý, ale chci ukázat, že to jde). Tu vytvoříme pomocí env_sprite.

A proč jsem říkal, že musíme myslet dopředu? Pára se objevuje tam, kde voda naráží na hladinu a tu zatím nemáme, takže si ji musíme představit. To té úrovně vložíme několik env_sprite a nastavíme je následovně:

Name: smoke
Render Mode: Additive
FX Amount: 80-120 (záleží na vás)
FX Color: opar můžeme přibarvit
Framerate: 20.0 (alespoň, ale může být i míň)
Sprite Name: sprites/ballsmoke.spr
Scale: 1.2 (čím větší, tím větší sprite)

Start On: zaškrtneme, aby byl sprit zobrazen po načtení mapy

A abych nezapomněl na zvuk, který vodopád vydává. Takže ještě k našemu oparu přidáme entitu ambient_generic a nastavíme ji nějak takto:

Name: waterfall_sound
WAV Name: ambience/waterfall1.wav
Volume: 10

Small Radius: můžete zaškrtnou jakýkoliv radius


Obr. 4
Vodopád

Tím je náš vodopád hotov, zkompilujete a podívejte se na něj. Pokud jste postupovali jako já, můžete si říct, že jste odvedli celkem slušnou práci. Ale něco tomu stále chybí. Ano, voda v bazénku.

Voda, voděnka…:
Jak jistě víte, voda v Half-Life není po grafické stránce v dnešní době nic převratného. Je to brush s texturou, která se nepravidelně (vlastně pravidelně) pohybuje dokola a trochu se vlní. V podstatě to je zvláštní druh dveří. Ale k tomu se dostaneme. Vytvořte tedy brush s texturou třeba !WATER1 veliký jako je celá hala (délka a šířka bazénu nestačí) a převeďte ho na entitu func_water. A hned se podíváme na její parametry:

func_water - záložka Class_info:
Name: jméno entity, pomocí kterého se na ni odvoláme
Render FX: styl renderování objektu (blikání, pulsování, …)
Render Mode: způsob renderu objektu
FX Amount: průhlednost vyrenderovaného objektu
FX Color: dobarvení objektu
Global Entity Name: globální jméno přístupné i z jiné mapy (o tom jindy)
Kill target: po aktivaci zruší jinou entitu
Speed: rychlost napouštění vody
Delay before close: prodleva před vypuštěním
Lip: počet jednotek, o které se voda nenapustí
Target: po aktivaci vody se aktivuje další entita
Contents: obsah, na výběr je Water, Slime a Lava
Wave Height: výška vln

func_water - záložka Flags:
Starts Open: po načtení mapy bude voda napuštěná
Toggle: voda půjde aktivovat pouze přes jiný spouštěč

Jak jsem řekl, voda je něco podobného jako entita dveří, akorát má pár parametrů navíc. Důležité je také to, že voda jde napouštět a vypouštět stejně jako jdou dveře otvírat nebo zavírat. A poslední důležitý poznatek je ten, že se vykresluje pouze vrchní plocha. Spodek a body se nevykreslí. A ještě jedna maličkost. Pokud jste pod vodou, automaticky vidíte trochu rozostřeně a okolí je zakalené a po nějaké době vám začne ubývat zdraví, jelikož se začnete topit. To vám po vynoření opět přibude, ale to jistě znáte z Half-Life.

Ale zpět k našemu tutoriálu. Jelikož jsme si brush s vodou vytvořili od podlahy bazénku do výšky ochozu, budeme uvažovat, že je voda napuštěná (tedy otevřená) a od toho se bude odvíjet i její nastavení:

Name: water
Render Mode: Textured
FX Amount: 125
Speed: 75
Delay before close: -1
Lip: 64 (tolik jednotek zůstane po vypuštění vody v bazénku)
Contents: Water
Wave Height: 2.5 (stačí, ale klíďo přidejte)

Angle: Down (voda se bude jakoby vypouštět, protože po načtení mapy je napuštěná)

Starts Open: po načtení mapy bude voda vypuštěná
Toggle: zaškrtneme, protože ji napustíme pomocí ventilu

Po kompilaci, by se měla objevit voda i v bazénku a hladina by měla sahat do výšky jakou jsme si nastavili v Lip. Chybí nám však ještě spouštěč, kterým halu napustíme vodou a také vypneme zvuk vodopádu i opar, který se při styku proudící vody s hladinou tvořil.

Napouštění haly:
Takže si vytvořte tlačítko, nebo nějaký ventil (můžete použít i prefab) a umístěte ho někam ke stěně. Nastavení je na vás, ale do kolonky Target zadejte jméno multi_manageru, který si hnedka vytvoříme. Jeho jméno bude třeba mm_water. Takže umístěte do mapy i tuto entity a nastavte ji:

Name: mm_water
water: 0.5
smoke: 0.6
waterfall_sound: 0.9

Prodlevy jsou pochopitelně na vás. Tak a když zkompilujeme mapu nyní, voda by se měla po otočení ventilem napustit a my konečně můžeme pokračovat po ochozu ke dveřím a třeba i dál. Ale to už není náš případ. Ještě jsem zapomněl uvést, že je nutné vytvořit žebříky vedoucí z bazénu, jinak se k ventilu nedostaneme, ale to je snad jasné.

Tip02:
Ještě uvedu jedno doporučení, která souvisí jak s vodou stojatou, tak tekoucí. Pomocí entity func_conveyor sice vytvoříme iluzi tekoucí vody, ale pokud bude vody hluboká dost na to, abychom se ponořili, je zde problém. Tím myslím efekt, který je znám když se ponoříme do normální vody, tedy to rozmlžení a zakalení pohledu a charakteristické zvuky. To v tomto případě nebude.

Pokud by se to stalo, řešení je snadné. Přes entitu func_conveyor vytvořte ještě jeden brush třeba s texturou AAATRIGGER a převeďte ho na func_water a Render Mode nastavte na Texture a FX Amount na 0. To způsobí, že brush entita nebude ve hře vidět. Ale efekty zůstanou a to je to co jsme potřebovali.

Náledí:
A na závěr se ještě zmíním o jedné zajímavé entitě, která simuluje efekt náledí. Náledí je vlastně zmrzlá voda, takže to spolu trochu souvisí. Když zavzpomínáme na Half-Life, setkali jsme se s ledem párkrát v mrazáku a jednou ve WE'VE GOT HOSTILES, kde spíš šlo o mokrou a kluzkou podlahu.

Vytvořte nějaký brush, vysoký pár jednotek (nejlépe 1 - 2) a trochu ho upravte Vertex Toolem, aby to vypadalo jako zmrzlá nebo rozlitá voda na podlaze. Jako texturu můžete použít FROSTSLICK na led nebo BABTECH_BORDL52 (tyhle byly použity i v Half-Life) a celé to převeďte na entitu func_friction. A zde jsou její parametry:

func_friction - záložka Class_info:
Render FX: styl renderování objektu (blikání, pulsování, …)
Render Mode: způsob renderu objektu
FX Amount: průhlednost vyrenderovaného objektu
FX Color: dobarvení objektu
Percentage of standart: kluzkost povrchy o počet procent než normálně

Tato entita se tedy bude chovat jako kluzký povrch. A to jak moc bude kluzký udává jeho poslední parametr. Pokud se jedná o rozlitou vodu na podlaze je dobré nastavit i Render Mode a FX Amount zhruba stejně jako tomu bylo u normální vody. A to je asi k této entitě všechno. Její použití je snadné a nabízí se přímo samo. Jen je tu jedno omezení. Entita bohužel neobsahuje parametr Name, z čehož jasně vyplývá, že ji nebudeme moci ovládat, tedy vypínat nebo zapínat a náledí bude v mapě napořád.

Závěr:
A tím jsme se konečně prokousali až na úplný závěr. Dneska jsme si ukázali jak vytvořit proudící vodu, která hráče unáší určitým směrem a také normální vodu, kterou můžeme napouštět nebo vypouštět. No a na závěr jsme letmo vytvořili i náledí (to však v příkladové mapě nehledejte, jelikož tam není).

No a nezbývá mi než říct, že příště dokončím povídání o tvorbě vlastní modifikace. Tedy její grafické podoby. Takže do té doby ZDAR!!!

 

SOUBORY

 

KOMENTÁŘE

 

Žádné komentáře nejsou zatím k dispozici
 

 

<-- Vlastní modifikace Vlastní modifikace - II. část -->

NAHORU ...

 ČERSTVÉ NOVINKY
 POSLEDNÍ TUTORIÁLY
 ANKETA
Staré ankety
 REKLAMA