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
 Zhasínáme světla Pondělí 15. 01. 2007
<-- Propojení dvou map Texty ve hře -->

Tak a je tady první tutoriál letošního roku. Tentokrát jsem si pro vás připravil na první pohled triviální záležitost: zhasnout a následně rozsvítit světlo. Ano, je to skutečně jednoduché, ale my si to opět trochu rozšíříme a zkomplikujeme. Pojďme se tedy na to podívat… Budiž tma!

Na úvod:
Možná si říkáte, proč se takovou jednoduchou záležitostí, jako je zhasnutí světel vůbec zabývám a obtěžuji se o tom ještě ke všemu psát tutoriál. Hned pochopíte. Dnešní tutoriál jsem rozdělil do tří částí. První je velmi jednoduchá. Klasické světlo pomocí entity light a jedno tlačítko, kterým světlo zhasneme a následně opět rozsvítíme.

V druhé části si nejprve ukážeme, jak vytvořit trochu reálnější světlo, které kromě toho, že svítí, vytváří i iluzi záře. Ta se tvoří entitou env_glow a jistě jste ji v Half-Life mnohokrát viděli, aniž byste si uvědomili jak vlastně funguje. A když už budeme mít takové světlo vytvořeno, měli bychom ho umět zhasnout. To je však již poněkud náročnější. Proto si představíme další entitu env_render, která bude efekt záře vypínat a následně zapínat.

A konečně ve třetí a poslední části si to ještě trochu zkomplikujeme. Jak? V druhé části budeme mít dvě tlačítka. Jedno pro zhasnutí světla a druhé pro jeho rozsvícení. Sice vám to může připadat zbytečné, ale mohou nastat situace, kdy se to může hodit. Ve třetí části si však vystačíme pouze s jedním vypínačem. Pro správný chod budeme muset do mapy vložit poslední novou entitu a tou je trigger_changetarget.

To byl krátký úvod toho co nás čeká. Pokud někdo nepochopil, nevadí. V dalším textu vše popíši ještě jednou a podrobněji. A ještě malá poznámka. Přiznávám, že na třetí část dnešního tutoriálu jsem částečně čerpal ze serveru The Lambda.

Normální světlo:
Nejprve si ukážeme jak zhasnout a následně rozsvítit obyčejné světlo, které je tvořeno entitou light. O vypínání se pochopitelně bude starat tlačítko, tedy Brush entita func_button. Vytvořte tedy nějakou místnost. Do ní umístěte info_player_start, dále nějaký brush, který bude představovat fyzické světlo (zářivku) a pod něj umístěte entitu light. Dále někde na zdi vytvořte tlačítko a převeďte ho na func_button. Všem entitám jsme se již mnohokrát věnovali v předchozích tutoriálech, takže popis jednotlivých parametrů přeskočím a hned přejdu k jejich nastavení.

light - část 1.:
Name: light_1
Brightness: nastavte si podle libosti

func_button - část 1.:
Target: light_1
Delay before reset: 1

Další nastavení jako jas, barevnost světla nebo zvuk a pohyb tlačítka nechám na vás. Pokud nyní mapu zkompilujete a tlačítko aktivujete (stisknete), světlo se zhasne. Při další aktivaci by se mělo opět rozsvítit. Tak a první část je za námi. Nutno dodat, že to byla ta nejjednodušší.

Světlo s iluzí záře:
Konečně se dostáváme k tomu těžšímu a důležitějšímu. Nyní si ukážeme, jak vytvořit světlo, které bude vytvářet i iluzi záře. Opět si tedy vytvoříme místnost se vším co do ní patří (tedy entita info_player_start), do které umístíme fyzické světlo (brush s texturou nějaké zářivky, třeba +0~LIGHT4A. Pod něj vložíme entitu light a pojmenujeme ji light_2 (jména entit volím stejná jako v příkladové mapě, což možná bude trochu matoucí a složité, proto doporučuji, abyste si mapu prohlídli).

Tip01:
Když už jsem u toho, pokud si pozorně prohlídnete texturu, kterou jsem použil (+0~LIGHT4A), zjistíte, že existuje další textura s velmi podobným jménem (+A~LIGHT4A). Ta také představuje světlo, ale takové, které je vypnuté. V Half-Life pochopitelně jde docílit částečné animace textur, takže bychom si náš příklad mohli ještě poněkud zkomplikovat tím, že bychom chtěli měnit i textury světla, podle toho jestli je rozsvícené nebo ne. Více o animacích textur naleznete na konci tohoto tutoriálu.

Na stejné místo jako jsme umístili entitu light umístíme i entitu env_glow. Jak tato entita funguje? Na uvedené místo vloží sprite, který si nadefinujeme. Také mu můžeme přiřadit barvu, styl rederování a měřítko. Více nám však nastavení entity neumožňuje. Možná si říkáte proč to neudělat rovnou přes entitu env_sprite. Nevím. Asi by to šlo, ale pro záři světel se prostě používá tato entita. Pojďme se tedy podívat na její parametry:

env_glow - záložka Class_info:
Name: jméno entity, pomocí kterého se na ni odvoláme
Render Mode: způsob renderování entity, podobně jako u jiných, ale zde se výhradně nastavuje volba Glow
FX Amount: viditelnost entity v mapě (255 - viditelná, 0 - neviditelná)
FX Color (R G B): sprite můžeme zabarvit jak je nám libo (ta by měla být stejná jako u parametru Brightness u entity light
Sprite name: cesta a jméno spritu, který chceme zobrazovat
Scale: měřítko spritu

Umístíme tedy env_glow na své místo (tam, kde je naše světlo) a nastavíme ji následovně:

env_glow - část 2.:
Name: glow_2
Render Mode: glow
FX Amount: 255
FX Color: 255 255 128
Sprite name: sprites/glow01.spr
Scale: 1

Nyní by se nám sprite, který jsme použili měl objevit i ve VHE v okně camera. Pokud se tak nestalo, nevadí. Chyba to není. Mapu můžeme zkompilovat a nyní by se měla pod světlem (okolo entity light) zobrazit jeho záře. To je ale pouze část toho co, jsem chtěl popsat. Nyní potřebujeme světlo vypnout.

To už však nepůjde tak hladce jako v předchozím případě. Nyní máme entity dvě - light a env_glow, takže budeme muset použít multi_manager. To ale stále není vše. Pro správné vypnutí záře (tedy env_glow) musíme použít další entitu env_render. Jak tato entita funguje? Při jejím volání aplikuje svůj Render Mode a FX Amount na požadovanou entitu. Takže pokud budeme chtít vypnout záři u světla, musíme na entitu env_glow aplikovat nový FX Amount, který bude nula. Při jejím zapnutí opět aplikujeme nový FX Amount. Ten bude v tomto případě 255. Pojďme si tedy popsat jednotlivé parametry entity env_render a její nastavení pro náš konkrétní případ.

env_render - záložka Class_info:
Name: jméno entity, pomocí kterého se na ni odvoláme
Target: jméno entity, na kterou chceme aplikovat nové nastavení
Render FX: nastavení vizualizace (například blikání, …)
Render Mode: nastavení módu rederu
FX Amount: viditelnost a průhlednost (podle módu), 0 - neviditelný, 255 - viditelný
FX Color (R B G): nastavení barevnosti entity

env_render - záložka Flags:
No Renderfx: zakáže přerenderování podle Render FX
No Renderamt: zakáže přerenderování podle FX Amount
No Rendermode: zakáže přerenderování podle Render Mode
No Rendercolor: zakáže přerenderování podle FX Color

Tak. Toto je popis parametrů entity env_render. Ještě upozorním, že parametry v záložce Flags jsem nikdy nepoužil a ani nejsou nikterak důležité. Nyní je nutné si uvědomit, že pro zhasnutí světla (tedy vypnutí env_glow) budeme potřebovat jeden env_render a pro rozsvícení budeme potřebovat další env_render. Tedy celkem dva. Pojďme se podívat na jejich nastavení:

env_render 1 - část 2.:
Name: glow_2_off
Target: glow_2
Render Mode: glow
FX Amount: 0

env_render 2 - část 2.:
Name: glow_2_on
Target: glow_2
Render Mode: glow
FX Amount: 255

Nyní máme obě entity nastaveny. Teď musíme do mapy vložit dvě entity multi_manager. Ty si nastavíme následovně:

multi_manager 1 - část 2.:
Name: mm_glow_2_off
light_2: 0
glow_2_off: 0

multi_manager 2 - část 2.:
Name: mm_glow_2_on
light_2: 0
glow_2_on: 0

Na závěr nám zbývá dodělat tlačítka. Ano, čtete správně. Pro tento případ budeme potřebovat tlačítka dvě. Jedno na vypnutí a druhé na zapnutí světla. Což je možná trochu zbytečné a dá se to použít jen v několika případech, ale já už jsem se s takovouto situací setkal. Na jednom konci mapy jste vyhodili pojistky, čímž světla zhasla a druhém konci mapy jste pojistky zase nahodili a světla rozsvítili. Tedy dvě různá tlačítka. A hlavně jsme si ukázali tvorbu záře a nastavení entit env_glow a env_render.

Takže si vytvořte dvě tlačítka a umístěte do mapy. Převeďte na func_button a nastavte je následovně:

func_button 1 - část 2.:
Target: mm_glow_2_on
Delay before reset: -1

func_button 2 - část 2.:
Target: mm_glow_2_off
Delay before reset: -1

Jak jste si jistě všimli, tlačítka půjde aktivovat pouze jednou, což je trochu omezující. A také je důležité je aktivovat ve správném pořadí, jinak to nebude fungovat (v příkladové mapě se první aktivuje levé tlačítko, které světlo zháší a následné tlačítko pravé, které ho rozsvěcí; pokud je zapnete v obráceném pořadí, dojde k nepěkným efektům). Ono celé se to hodí pouze na pár případů, ale jak jsem řekl, alespoň jsme si zde ukázali jak fungují zmiňované entity. Takže si pojďme celou situaci trochu vylepšit a bohužel i ztížit.

Zhášíme jedním tlačítkem:
Začneme opět stejně. Vytvoříme si místnost. Do ní vložíme entitu info_player_start. Dále si vytvoříme fyzické světlo (texturu bych volil stejnou jako v předchozím případě). Pod něj vložíme entitu light, kterou pojmenujeme light_3 a entitu env_glow. Tu si nastavíme následovně:

env_glow - část 3.:
Name: glow_3
Render Mode: glow
FX Amount: 255
FX Color: 255 255 128
Sprite name: sprites/glow01.spr
Scale: 1

Než se pustíme dál, vytvoříme si tlačítko a převedeme ho na func_button. Nastavení bude velmi podobné tomu z předchozí části:

func_button - část 3.:
Name: button_glow_3
Target: mm_glow_3_off
Delay before reset: 0.1

Je důležité si tlačítko pojmenovat (proč uvedu později) a dále je nutné, aby ho bylo možné aktivovat vícekrát (proto Delay before reset je různý od -1). Následně budeme opět potřebovat dvě entity env_render (jednu pro zhasnutí a druhou pro rozsvícení záře) a také dvě entity multi_manager. A opět si je nastavíme takto:

env_render 1 - část 3.:
Name: glow_3_off
Target: glow_3
Render Mode: glow
FX Amount: 0

env_render 2 - část 3.:
Name: glow_3_on
Target: glow_3
Render Mode: glow
FX Amount: 255

multi_manager 1 - část 3.:
Name: mm_glow_3_off
light_3: 0
glow_3_off: 0
cht_on_off: 0

multi_manager 2 - část 3.:
Name: mm_glow_3_on
light_3: 0
glow_3_on: 0
cht_off_on: 0

Nastavení je velmi podobné jako u předchozího případu, ale u entit multi_manager nám přibyl jeden klíč. To je jméno entity trigger_changetarget. Ty také budeme potřebovat dvě. A jak tato entita funguje? Při jejím volání se změní parametr Target na jiný u námi definované entity. A to je to co potřebujeme. Celý mechanismus popíši v závěru. Nyní parametry, které nás u trigger_changetarget čekají:

trigger_changetarget - záložka Class_info:
Target: jméno entity, u které chceme změnit parametr Target
Delay before trigger: prodleva v sekundách před změnou parametru Target
Kill Target: jméno entity, která má být z mapy vymazána
Name: jméno entity, pomocí kterého se na ni odvoláme
New Target: hodnota nového cíle pro danou entitu

To by bylo k parametrům a teď k samotnému nastavení obou entit:

trigger_changetarget 1 - část 3.:
Target: button_glow_3 (jméno tlačítka)
Delay before trigger: 0
Name: cht_on_off
New Target: mm_glow_3_on

trigger_changetarget 2 - část 3.:
Target: button_glow_3 (jméno tlačítka)
Delay before trigger: 0
Name: cht_off_on
New Target: mm_glow_3_off

A jak to celé funguje? Přijdeme k tlačítku, které má cíl (target) na mm_glow_3_off. Tedy na první multi_manager. Stiskneme tlačítko, to spustí první multi_manager. Ten má v klíčích nadefinováno, aby vypnul světlo (light_3), dále aby spustil env_render se jménem glow_3_off. Ten aplikuje své nastavení na entitu env_glow (záře zmizí). multi_manager nakonec spustí i entitu trigger_changetarget. Ta tlačítku (jeho jméno je definováno v položce Target) aplikuje nový Target, který ukazuje na druhý multi_manager. Pokud tedy tlačítko stiskneme znovu, spustí multi_manager se jménem mm_glow_3_on a celý proces se otočí. To se opakuje vždy když stiskneme tlačítko.

Pokud následující popis mechanismu někdo nechápe, ať si ho přečte znovu a znovu a znovu. Je to trochu složité na pochopení a hlavně na zorientování se ve jménech a cílech všech entit, ale ve skutečnosti to je velmi jednoduché. A ješte radši obrázek.


Obr. 1
Rozložení a popis entit

A ještě si neopustím poznámku o entitě env_render. Její použití, které je popsáno výše je pouze názorným příkladem na její použití. Ale tato entita se dá úspěšně využívat v nejrůznějších situacích a dají se s ní měnit skutečně všechny entity, které mají definovány způsoby renderování. Někde se to hodí více, jinde méně. Nutno však poznamenat, že použití výše je asi nejčastějším případem aplikace nového renderování na jiné entity.

Animace textury světla:
Dlouho jsem se rozmýšlel, jestli se mám o tom vůbec zmiňovat, jelikož se to do tohoto tutoriálu moc nehodí, ale když už jsem to nakousl v Tip01, měl bych svou myšlenku dokončit. Takže se podíváme jak změnit texturu nějakého objektu v závislosti na volané události.

Z reálného světa je jasné, že pokud zhasneme například zářivku její bezprostřední okolí, včetně jejího plechového obalu, ztmavne. A to je i náš případ. Máme brush představující fyzické světlo, na kterém je textura +0~LIGHT4A. Samotný brush je pak veliký 16x16x4 jednotky. Pokud se v prohlížeči textur (Texture Browser) podíváme pozorně, zjistíme, že hned vedle této textury je další velmi podobná textura se jménem +A~LIGHT4A, která je jen tmavá. My tedy budeme chtít docílit toho, že pokud stiskneme tlačítko, proběhne cyklus, který jsme si popsali výše (tedy, zhasne světlo, zmizí záře a přehodí se cíl). Dále pak chceme, aby textura +0~LIGHT4A zmizela a byla nahrazena jinou. V našem případě již zmiňovanou +A~LIGHT4A. Postup je velmi jednoduchý.

Naše fyzické světlo převedeme na entitu func_wall_toggle a zkopírujeme. U jednoho ponecháme stávající texturu a druhého ji změníme na +A~LIGHT4A. A nyní nastavení:

func_wall_toggle 1 - textura +0~LIGHT4A:
Name: phys_light_3_on
Start Invisible: nezaškrtáváme, aby se nám entita zobrazila po načtení mapy

func_wall_toggle 2 - textura +A~LIGHT4A:
Name: phys_light_3_off
Start Invisible: zaškrtneme, což způsobí, že entita nebude po načtení mapy vidět

Nyní, když máme obě entity nastaveny, přesuneme je přes sebe nad entity light a env_glow. Nyní je ještě potřeba přidat klíče k multi_managerům, abychom entity spustili. Klíče budou pro oba multi_managery stejné:

multi_manager 1, 2:
phys_light_3_on: 0
phys_light_3_off: 0

A jak entita func_wall_toggle vlastně funguje? V podstatě funguje jako obyčejný func_wall s tím rozdílem, že ji je možné v mapě zviditelňovat a posléze zase nechat zmizet. Využití této entity však sahá mnohem dál než je "animování textur" (nemůžu si pomoc a musím to uvádět v uvozovkách - ono zase tak o animaci v pravém slova smyslu nejde). Jako další příklady využití func_wall_toggle si můžeme představit například turbínu, která po výbuchu přijde o list vrtule - něco podobného jsme viděli v Blue Shiftu. Tato entita však bude určitě předmětem nějakého (a ne jednoho) z dalších tutoriálů, kde se budeme věnovat jiným situacím a také si ji podrobně popíšeme.

Závěr:
A jsme v samotném závěru našeho snažení. Dnes jsme si ukázali jak velmi jednoduše vypnout světlo pomocí tlačítka a také jak vytvořit světlu záři, kterou taktéž můžeme vypínat. I když už ne tak pohodlně. Na závěr jsme si také ukázali, jak lze jednoduše textury animovat. Přestože se tento tutoriál na začátku jevil jako velmi jednoduchý a zbytečný, myslím, že ukázal mnoho nového a zajímavého a zase tak úplně jednoduchý nebyl. Pokud někdo něco nepochopil, ať napíše do komentářů. Jinak všem vřele doporučuji, aby si stáhli příkladovou mapu.


Obr. 2
Světlo se září

Obr. 7
Zhasnuté světlo a zméněná textura

A to je již opravdu vše. Příště si ukážeme, jak docílit zobrazování textu na obrazovce. Takže do příště ZDAR!!!

 

SOUBORY

 

KOMENTÁŘE

 

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

 

<-- Propojení dvou map Texty ve hře -->

NAHORU ...

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