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
 Texty ve hře Úterý 16. 01. 2007
<-- Zhasínáme světla Vlastní modifikace -->

Jak jsem minule slíbil, dneska se podíváme na další velmi zajímavou možnost jak do naší mapy (nebo do celé modifikace) dodat trochu té atmosféry a možná i realističnosti. Dneska si ukážeme jak do hry vložit text a ten následně nechat vypsat na obrazovku.

Na úvod:
Vypsání textu na obrazovku je velmi jednoduchá záležitost a dá se docílit hned několika způsoby. A my si pochopitelně ukážeme všechny. První je trochu krkolomný, ale také nejjednodušší. K jeho vypsání nám stačí pouze entita trigger_once popřípadě trigger_multiple. Druhý způsob je již velmi flexibilní a hodí se zejména do vlastních modifikací nebo single-playerových map. K němu budeme kromě entity env_message potřebovat upravit i soubor titles.txt.

A poslední možností je použít entitu game_text. Ta se hodí především do multi-playeru, ale požití je všeobecné. Na závěr se také podíváme na další možnosti vkládání textu do hry, jako je zobrazení samotného loga Half-Life jako na začátku hry, nebo názvu aktuální kapitoly.

Obyčejný text:
Na začátek tedy něco jednoduchého. Vytvořte mapu a umístěte do ní světlo a entitu info_player_start. Nyní někam do mapy umístěte brush (nejlépe s texturou AAATRIGER) a převeďte ho na entitu trigger_once, nebo trigger_multiple. Nyní otevřete jeho nastavení (Alt + Enter) a všimněte si, že jeden parametr se jmenuje Message. Pokud do této kolonky cokoliv napíšeme, po projití entitou ve hře se text zobrazí na obrazovku.

Jak jednoduché. Bohužel má tato metoda několik záporů. Text nejde žádným způsobem formátovat. Takže se vždy zobrazuje na stejném místě, stejným způsobem, stejnou barvou (světle šedá) a na obrazovce zůstane stejný čas. Jediné možné formátování je pomocí tzv. escape sekvencí, které jsou dobře známi z vyšších programovacích jazyků, jako třeba C, C++ nebo PHP. Mě osobně fungovalo pouze \n pro odřádkování.

Dejte si také pozor na vypisování znaků s českou diakritikou (třeba ě, š, č, ř, ž, ý, á, í, é a další), které se jednoduše nezobrazí. A také si dejte pozor na některé speciální znaky jako apostrofy nebo uvozovky, které jsou zakázány a mapa se prostě nezkompiluje.

Entita env_message:
Nyní už něco praktičtějšího. Nejčastější způsob jak vypsat text v mapě je použití entity env_message a nějakého spouštěče. Opět tedy vytvořte místnost a umístěte vše potřebné, nebo modifikujte tu stávající.

Do mapy vložte entitu env_message a nějaký spouštěč (tedy tlačítko, jeden z triggerů, nebo třeba i dveře - to skutečně závisí na situaci). Pro náš případ použiji entitu trigger_multiple. Nyní se podíváme na nastavení env_message.

env_message - záložka Class_info:
Name: jméno entity, pomocí kterého se na ni odvoláme
Target: po zobrazení textu může dojít ke spuštění další události
Message Name: název věty, která se má vypsat na obrazovku (viz níže)
Sound Effect: cesta ke zvukovému souboru jež se má přehrát
Volume 0-10: hlasitost přehrávaného zvuku
Sound radius: poloměr okolo entity, kde bude zvuk slyšet

env_message - záložka Flags:
Play Once: text se vypíše pouze jednou i vícenásobném spuštění
All Clients: text se zobrazí všem hráčům (při multiplayeru)

Entita tedy nemá nikterak komplikované nastavení. Jak jste si jistě všimli je tu i jedna novinka. Tedy parametr Sound Effect. Pokud do něho zadáme cestu k nějakému zvukovému souboru, bude po aktivaci entity soubor přehráván. Bohužel donekonečna. Cesta ke zvukovému souboru (který by měl být ve formátu .WAV) je ve formátu ambience/siren.wav. Tedy kořenovou složkou je složka sound v souboru pak0.pak.

Soubor titles.txt
To abychom docílili vypsání textu na obrazovku nestačí. Pokud jste četli pozorně víte, že do parametru Message Name se nezadává přímo text, který bude vypsán (jako tomu bylo u minulého příkladu), ale pouze jméno věty, která daný text obsahuje. Pokud si pamatujete na tutoriály zabývající se zvuky (Zvuky - I. část a Zvuky - II. část), víte, že jsme v nich také tvořili věty. Ty pak následně říkaly postavy.

Zde je postup podobný. Budeme k němu potřebovat soubor titles.txt, který se nachází ve složce Half-Life\valve. Otevřete si ho (třeba pomocí notepadu). Na první pohled to vypadá, že to nebude nic složitého. Pojďme si tedy vysvětlit jednotlivé parametry a vytvořit vlastní větu.

Jak je z textu patrné, používají se podobné symboly jako v ostatních programovacích jazycích. Takže naříkal // značí komentář a symbol dolaru $ označuje příkaz. Samotný text se pak vkládá do složených závorek, před nimiž figuruje jméno věty: TEXT {Vlastní text…}.

Pojďme si to tedy popsat ještě jednou. Lépe, podrobněji a přehledněji:

titles.txt - možnosti nastavení:

$position x y - pozice na obrazovce, kam bude text vypsán, kde x udává horizontální osu a y osu vertikální; hodnoty, kterých mohou nabývat jsou od 0 - 1, kde 0 je levý okraj obrazovky a 1 pravý okraj; pro vycentrování textu se používá -1 (příklad: $position -1 0.65)
$effect <cislo> - pro vypsání textu je možné použít jeden ze tří efektů, kde 0 je pro efekt fade in/out, tedy postupné objevení a zmizení textu, 1 je pro efekt flickery credits, kde zobrazený text problikává (jedna barva se mění za druhou) a konečně 2 je pro efekt write out, kdy se text zobrazuje po jednotlivých písmenech (psaní na stroji)
$color <R G B> - barva písma ve formátu RGB, je možné definovat dvě barvy pomocí čísla hned za příkazem color (příklad: $color2 255 0 0)
$fadein <time> - doba, po kterou se bude text (nebo jednotlivé znaky) tisknout na obrazovku (příklad: $fadein 0.05)
$fadeout <time> - to samé jako předchozí případ, s tím rozdílem, že to platí pro mizení textu, text se bude plynule ztrácet
$fxtime <time> - doba, po kterou se bude plynule měnit barva (pokud jsou nastaveny barvy dvě)
$holdtime <time> - a konečně příkaz, který určuje jak dlouho bude text na obrazovce zobrazen; je opět v sekundách (příklad: $holdtime 4.00)
// - komentář, vše co je za dvěmi lomítky se nebere jako příkazy nebo jejich parametry

Pokud tedy víme, co znamenají jednotlivé příkazy a jejich parametry, může přejít k vytvoření naší vlastní věty. Otevřeme si tedy soubor titles.txt (pokud jsme tak již neučinili) a na začátek vložíme následující text:

titles.txt - ukázka nastavení:

// HL-ZONE TUTORIALS - komentář, název souboru vět
// pozici nastavíme na střed monitoru
$position -1 -1
// efekt nastavíme na 2 - write out
$effect 2
// konečnou barvu textu nastavíme na zelenou
$color 0 255 0
// sekundární barva - barva právě tištěného písmena bude červená
$color2 255 0 0
// čas pro plynulé zobrazování písmena
$fadein 0.2
// čas pro plynulé zmizení textu
$fadeout 1.5
// čas pro tisk jedno znaku
$fxtime 1.0
// čas po který text zůstane vytištěn na obrazovce
$holdtime 3.5

// název naší věty
TEXT
{ // začátek bloku textu
Toto je text ze souboru "titles.txt"
K zobrazeni byla pouzita entita "env_message"
} // konec bloku textu

Tím jsme si vytvořili větu Toto je text ze souboru "titles.txt" K zobrazeni byla pouzita entita "env_message", která bude vypsána na střed obrazovky zeleným písmem. Každé písmeno se bude vypisovat půl sekundy červenou barvou. Po vypsání celé věty bude text na obrazovce 3,5 vteřiny a následně bude 1,5 vteřiny plynule mizet.

A to celé dohromady:
Myslím, že minulá kapitola není nic složitého, takže přejdeme k tomu nejpodstatnějšímu. Máme místnost s entitou env_message a trigger_multiple a také vytvořenou větu se jménem TEXT v souboru titles.txt. Nyní zbývá vše nastavit tak, aby se věta skutečně vypsala. Hurá na to:

env_message:
Name: msg_text
Message Name: TEXT

trigger_multiple:
Target: msg_text

Jak jednoduché a praktické. Nyní mapu zkompilujte a projděte přes trigger_multiple. Na obrazovce by se vám měl vypsat text ve formátu, jaký jsme popsal výše. Ještě jedno upozornění. Znaky s českou diakritikou jsou opět přeskočeny. Oproti tomu uvozovky a apostrofy fungují. Escape sekvence však ne. Text se formátuje přímo v souboru. Takže více mezer se zobrazí jako více mezer, nový řádek (enter) se zobrazí na nový řádek. Pouze tabelátor nefungoval.

A jaké že jsou nevýhody této metody? Napadá mě pouze jedna. A to, že věty jsou uloženy v externí souboru, takže pokud chcete mapu šířit je nutné, aby byl modifikovaný (nebo vlastní) soubor titles.txt poskytován s ní, jinak se texty zobrazovat nebudou. Což u single-playerových modifikací či map není tak velký problém. Nicméně u multi-playerových map (třeba do CS) je to nežádoucí. Přesto vřele doporučuji se naučit "programovat" v souboru titles.txt a ovládat entitu env_message, jelikož je to velmi silný nástroj pro vkládání textů do vašich map.

Text pomocí game_text:
Existuje však ještě jedna metoda, která je velmi pohodlná. Dalo by se říci, že se jedná o spojení entity env_message a souboru titles.txt. Text do mapy lze vložit i pomocí entity game_text. Utvořte tedy místnost, vložte do ní vše potřebné, včetně této entity a také nějakého spouštěče. Opět jsem zvolil trigger_multiple. Nyní si probereme její nastavení:

game_text - záložka Class_info:
Name: jméno entity, pomocí kterého se na ni odvoláme
Target: po vypsání textu může být spuštěna další událost
Message Text: text, který bude vypsán na obrazovku
X: pozice na horizontální ose (0 = úplně vlevo, 1 = úplně vpravo, -1 = na střed)
Y: pozice na vertikální ose (0 = úplně vlevo, 1 = úplně vpravo, -1 = na střed)
Text effect: efekt při zobrazování textu, na výběr jsou tři možnosti (Fade in/out, Credits a Scan out), které fungují naprosto stejně, jako jsem si uvedli výše
Color1: finální barva textu (standardně 100 100 100)
Color2: zvýraznění textu (standardně 240 110 0)
Fade in Time: čas po který se bude text plynule zobrazovat
Fade out Time: čas po který bude text plynule mizet
Hold Time: čas po který bude text vypsán na obrazovce
Scan Time: čas po který se budou zobrazovat jednotlivá písmena (pouze u třetího efektu)
Text Channel: můžeme vybrat mezi 4 kanály, které mohou běžet odděleně nebo naráz, texty na stejném kanálu spuštěny ve stejný se mohou přepsat nebo nezobrazit

game_text - záložka Flags:
All Players: text se zobrazí všem hráčům (multi-playerové) hry

Jak je vidět nastavení je velmi podobné, jako jsme si popsali výše. Takže pokud bychom chtěli použít stejné nastavení textu jako v případě entity env_message, nastavíme si entitu následovně:

game_text:
Name: gmt_text
Message Text: Toto je text ze souboru titles.txt\nK zobrazeni byla pouzita entita env_message
X: -1
Y: -1
Color1: 0 255 0
Color2: 255 0 0
Fade in Time: 0.5
Fade out Time: 1.5
Hold Time: 3.5
Scan Time: 0.25
Text Channel: Channel 1

Tak a je to. Zbývá nastavit u entity trigger_multiple položku Target: gmt_text, mapu zkompilovat a zkontrolovat, zda se text skutečně vypíše stejně jako v předchozím příkladě. Měl by.

A opět uvádím, že znaky s českou diakritikou se nezobrazují, escape sekvence v tomto případě funguje, ale uvozovky a apostrofy povoleny nejsou. Výhodou této metody je bezesporu to, že není potřebná žádná modifikace externího souboru, tudíž odpadá jeho přenášení spolu s mapou. Nicméně je trochu zdlouhavější entitu nastavit, i když se to na první pohled může jen jevit (entitu může kopírovat i s jejím nastavením a po vložení změnit jen to potřebné).

Nicméně je tato entita určena především do multi-playerových map. Pokud do položky Name zadáte jedno z níže uvedených klíčových slov (jmen), dojde k vypsání textu při nastání určité události.

game_playerdie: text se vypíše, když hráč zemře
game_playerjoin: text se vypíše, když se hráč do hry připojí
game_playerkill: text se vypíše, když hráč někoho zabije
game_playerleave: text se vypíše, když hráč hru opustí
game_playerspawn: text se vypíše, když se hráč znovu narodí ("respawne")

Tyto jména se dají využít pouze v multi-playerových mapách, do kterých se však hodí na 100%. Například pokud se hráč do vaší mapy připojí, můžete ho pozdravit a sdělit, že jste to právě vy, kdo tuto mapu vyrobil. Nebo když hráč hru opustí, můžete ostatní hráče o tom informovat. To už je ale o entitě game_text opravdu všechno.

Logo a názvy kapitol:
Na závěr se podíváme, jak zobrazit logo hry, známe z úvodu Half-Life a názvy jednotlivých kapitol. Zobrazení loga je velmi jednoduché. V Map -> Map properties… zvolíme u parametru Display game title vybereme z roletky možnost Yes. To nám zobrazí veliký nápis HALF-LIFE, který, jak již bylo řečeno, byl viděn v úvodu hry. Pokud chtěli docílit i efektu odtemnění obrazovky (tedy efektu Fade in, zvolíme Yes i u parametru Level Fade In.

Problém nastane, pokud bychom chtěli zobrazit naše vlastní logo (třeba logo naší modifikace). Řešení je naštěstí velmi jednoduché a spočívá v úpravě několika souborů s příponou .spr, tedy spritů. Nicméně, to už není předmětem dnešního povídání, takže jen prozradím, že se k tomu vrátím v jednom z příštích tutoriálů. Nyní se musíme spokojit s logem Half-Life.

Na úplný závěr ještě uvedu jak zobrazit název kapitoly, jako v klasickém Half-Life. Vzpomeňme na texty, typu "ANOMALOUS MATERIALS" nebo "BLAST PIT", které se zobrazovaly při načtení nové mapy (a nové kapitoly). Postupy jsou tři. První, který byl použit i v Half-Life, je použití entity env_message a název kapitoly si nadefinovat v titles.txt. Druhý je použít entitu game_text. Výhoda těchto postupů je možnost nastavení formátování textu.

Ale abych se dostal k tomu podstatnému. Jméno kapitoly jde nastavit i pomocí Map -> Map properties…, kde u parametru Chapter Title Message uvedeme text, který chceme zobrazit ve známém formátu z Half-Life na standardní místo. Vámi definovaný text se pak zobrazí ihned po načtení mapy. Metoda nejjednodušší, ale málo flexibilní. Proto ji uvádím jako možnost na závěr. Rozhodněte se sami.

Závěr:
Konečně jsme se prokousali až k závěru. Dneska jsme si ukázali jak můžeme zobrazovat texty na obrazovce. Tento um se vám jistě bude při tvorbě map nebo modifikací hodit. Vezměme v úvahu pár příkladů. Můžeme třeba vytvořit list papíru, který se bude válet na podlaze, z něho udělat tlačítko, při jehož aktivaci ze vypíše text napsaný na papíře. Tím krásně můžeme dokreslovat atmosféru (deník mrtvého vědce, který leží vedle dopisu), nebo dokonce líčit příběh. Také můžeme do mapy vložit titulky při rozhovorech postav nebo Credits v závěru modifikace. V multi-playerových hrách si uděláme vizitku o nás, jako o tvůrcích mapy, nebo můžeme hráče informovat o aktuálním dění.

Je toho zkrátka dost a dost a každý z vás si jistě najde vlastní případ použití. Jen doporučuji, abyste si prohlédli příkladovou mapu (jelikož se zde neobjevil ani jeden obrázek - ty jsou zde zbytečné). No, myslím, že většinu základních témat a entit máme probraných a mohli bychom se příště podívat na něco opravdu zajímavého a užitečného. Mohli bychom si vytvořit vlastní spustitelnou modifikaci se vším co k tomu patří. Takže se do příště těšte a prozatím ZDAR!!!

 

SOUBORY

 

KOMENTÁŘE

 


hAssassin (email: voker@email.cz)

Zdravím, oba tutoriály se na hl-ZONE pochopitelně objeví, ale momentálně mám rozpracovány tutoriály jiné, takže si budeš muset počkat.

Odpovědět


Butter (email: butter1@centrum.cz)

Chtěl bych poprosit o tutorál na mimozemský trampolíny a vláček, který se dá ovládat.
Předem dík :)

Odpovědět


 

 

<-- Zhasínáme světla Vlastní modifikace -->

NAHORU ...

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