Dnešní povídání zakončíme problematikou časovačů. O těch jsme si ještě nic neříkali, takže to musíme vzít od začátku.
Časovač nám umožňuje spustit nějakou akci po uplynutí určitého času. Ve wherigu se časovače používají například pro situace, kdy chceme, aby se hráči „náhodně“ něco zobrazilo - postava, věc apod. Populárním bývá také použití časovačů pro realizaci různých časově omezených úkolů typu „do stanoveného času dojdi / doběhni do určité zóny“, „do stanoveného času vyřeš úkol“ apod.
Podobně jako ostatní objekty, musíme i časovač nejprve definovat. Pomocí nabídky z menu Zobrazit > Časovače dostaneme seznam již definovaných časovačů a zde stiskneme tlačítko Nová položka. V pravém panelu pak musíme vyplnit tyto údaje:
• Název, Popis - základní charakteristika časovače. Název se zobrazuje v diagramech, popis slouží autorům k podrobnější informaci o funkci časovače.
• Časovač - klíčové nastavení časovače se nachází v této části. Zde musíme výběrem z rozbalovací nabídky vybrat typ časovače. K dispozici jsou dvě možnosti: Odpočet (časovač bude běžet jednorázově po dobu stanovenou v položce Trvání a poté skončí) a Interval (časovač bude běžet opakovaně v cyklech trvajících dobu stanovenou v položce Trvání).
K čemu by nám časovače byly, kdyby nedokázaly provádět žádné akce? Správně, k ničemu. Proto musíme ještě definovat, jaké akce se mají provést v určitých okamžicích běhu časovače. To provedeme v sekci Události:
• Při spuštění - kód v tomto diagramu se provede jednorázově v okamžiku spuštění časovače. Sem je vhodné (ale nikoliv nutné) umístit takové akce, které provedou úvodní nastavení nějaké situace - např. vynulují proměnné, které se budou používat jako čítače, aktivují / deaktivují příslušné zóny, předměty či postavy apod.
• Při zastavení - jedná se o „opak“ předchozí události: kód v tomto diagramu se provede jednorázově v okamžiku zastavení časovače. Je vhodný pro provedení „úklidových“ prací po proběhlém časovači. Pozor, důležité upozornění: Je potřeba mít na paměti, že tato událost se vyvolá pouze v okamžiku, kdy byl časovač zastaven příslušnou diagramovou akcí. NEVYVOLÁ se při uplynutí nastavené doby trvání. K tomu slouží až třetí událost.
• Při uplynutí - nejdůležitější událost časovače. Pokud je typ časovače Odpočet, vyvolá se jednorázově po uplynutí nastavené doby trvání. Pokud je typ časovače Interval, vyvolá se opakovaně v časových intervalech stanovených dobou trvání.
Aby nám časovač dobře sloužil, musíme ho ve vhodném okamžiku spustit. To uděláme v diagramu pomocí akce Spustit časovač, do které následně přesuneme z panelu objektů a vlastností konkrétní časovač, který chceme pustit. Jakmile hra narazí na tuto akci, zvolený časovač bude okamžitě nastartován a ihned se vykonají akce, které jsou případně uvedené v jeho události Při spuštění.
Pokud chceme časovač zastavit, musíme použít diagramovou akci Zastavit časovač, ve které zase musíme určit konkrétní časovač k zastavení. Jakmile hra narazí na tuto akci, zvolený časovač bude okamžitě zastaven a ihned se vykonají akce, které jsou případně uvedeny v jeho události Při zastavení.
Jakmile uplyne definovaná doba trvání od spuštění časovače, automaticky se provedou akce v události Při uplynutí. Další postup závisí na typu časovače. Je-li to Odpočet, běh časovače automaticky skončí (pozor, už se nevolá událost Při zastavení). Je-li to Interval, začne se čas odpočítávat znovu od začátku a po dalším uplynutí doby trvání je opět spuštěna události Při uplynutí. A tak pořád dokola.
Uvědomte si: Časovač typu Interval nikdy neskončí sám od sebe. Bude probíhat neustále dokola tak dlouho, dokud jej nezastavíme pomocí akce Zastavit časovač, nebo dokud hráč hru neuzavře. Pokud již nepotřebujeme služby časovače využívat, měli bychom ho zastavit. Někdy je na nutnosti zastavit časovač dokonce postavena celá logika hry.
Na závěr si ukážeme některé typické příklady použití časovačů ve wherigu.
Tento typ se dá ve hře použít k různým účelům. Například chceme, aby se hráči v určitém okamžiku jakoby náhodou objevila nějaká věc nebo postava, aniž by hráč musel dojít do konkrétní zóny. Nebo chceme hráči udělit časovou penalizaci za špatně splněný předchozí úkol („Počkej si chvíli a pak to zkus znovu“). Určitě vás napadnou i jiné možnosti.
Jak tedy provedeme správné nastavení takového časovače? Určitě to bude typ Odpočet, protože nám stačí, aby se událost stala pouze jednou, nikoliv opakovaně. Trvání nastavíme podle potřeby, ale neměli bychom to zbytečně přehánět. Pár vteřin postačí. Do diagramu události Při uplynutí pak uvedeme požadovaný kód - např. zobrazení zprávy, věci nebo postavy, odblokování zablokované části hry (po penalizaci) apod. Na příslušném místě v diagramu pak použijeme akci Spustit časovač. A to je celé, nic víc k tomu nepotřebujeme.
Tento typ použití je oblíbený pro realizaci různých běhacích úkolů, ale dá se použít i „mírumilovněji“, např. pro stanovení času na vyřešení úkolu (hádanky, logické úlohy apod.). Ve všech těchto případech však bude nastavení časovače podobné.
Protože se opět jedná o jednorázovou akci, použijeme typ Odpočet, u něhož Trvání nastavíme na požadovanou dobu. Tady je zase spíše lepší použít delší časy, zvlášť u běhání, ale záleží koneckonců na uvážení autora. A teď: Do diagramu události Při uplynutí uvedeme akce, které se mají vykonat v případě, že hráč ve stanoveném čase úkol nesplní (nedostaví se do zóny, nevyřeší úlohu). Většinou to bude nějaká zpráva a následné úkony. Pak musíme napsat kód pro úspěšné splnění úkolu. Kam ho ale umístit? To bude záležet na tom, co to bylo za úkol. Pokud šlo o doběhnutí (příp. dojití) do konkrétní zóny, pak kód bude ideálně umístěn v události Při příchodu. Pokud šlo např. o logickou úlohu, nejlepší místo bude asi vložit kód do zpracování správné odpovědi vstupu. Tady jsou možnosti samozřejmě poplatné tomu, co měl hráč za úkol. Vždycky ale musí jít definovat okamžik, kdy byl úkol správně splněn. Tam pak vložíme požadovaný kód, např. zprávu o úspěšném splnění úkolu a další úkony. Ale pozor! Jako první akci, ještě než zobrazíme jakoukoliv zprávu, umístíme diagramovou akci Zastavit časovač. To je velmi důležité, jinak by se mohlo stát, že si hráč bude s potěšením číst blahopřání k úspěšnému splnění úkolu, mezitím doběhne časovač a najednou bude blahopřání nahrazeno zprávou, že úkol nesplnil.
Jak tedy bude fungovat logika hry? Na startu úkolu spustíme časovač. Pokud hráč úkol splní dřív, než časovač doběhne, zastavíme jej a hráče informujeme o jeho úspěchu. Pokud to hráč nestihne a časovač doběhne až do konce, vyvolá se jeho událost Při uplynutí a my hráči napíšeme zprávu o neúspěchu.
Možností použít tento typ je opět mnoho, většina z nich ale funguje na principu počítání času, i když to někdy nemusí být na první pohled zřejmé. Vezměme si tento příklad: Čaroděj sesílá kouzlo, to má tři fáze, každá mu trvá jednu minutu. Hráč musí do té doby splnit nějaký úkol, jinak bude kouzlem postižen. Co to znamená? Po uplynutí každé minuty se čaroděj posune o jednu fázi kouzla dál. Naším úkolem je postupně odpočítávat čas jedné minuty a na konci intervalu zvýšit čítač fáze kouzla o 1. Jakmile je čítač fáze roven 3, kouzlo bylo sesláno.
Jak to provedeme? Tentokrát použijeme časovač Interval a položku Trvání nastavíme na 60 (sekund). V události Při spuštění vynulujeme proměnnou „Fáze“ (Nastav Fáze = 0). V události Při uplynutí zvýšíme hodnotu proměnné „Fáze“ o 1 (Přičti/Odečti Fáze +1) a pomocí Když/jinak otestujeme novou hodnotu. Bude-li menší než 3, vypíšeme hráči zprávu, že kouzelník se sesláním kouzla pokročil do další fáze, bude-li rovna 3, vypíšeme hráči zprávu, že kouzlo bylo sesláno, a v sekci Při odkliknutí zprávy nebo dialogu zastavíme časovač (pozor, ne dřív, jinak by se nám časovač nezastavil).
Zkusme jiný příklad použití časovače: Hráč se musí dostat v určitém místě přes zeď (buď ven nebo dovnitř, to není důležité). Kolem zdi obchází hlídač, který hráče nesmí chytit. Jedna obchůzka mu trvá jednu minutu.
Budeme mít zónu „Před zdí“. Úkolem hráče bude splnit nějaký úkol (třeba hlavolam, který mu otevře bránu), který však může plnit pouze, nachází-li se v této zóně. Hlídače realizujeme časovačem typu Interval s trváním 60 (sekund). V události Při uplynutí vždy otestujeme, jestli se hráč nachází v zóně „Před zdí“. Pokud ano, hráč byl chycen, zastavíme časovač a provedeme příslušné akce. Pokud ne, nic se neděje a hlídač pokračuje v obchůzce (nemusíme počítat, kolikrát zeď obešel, takže nepotřebujeme ani žádnou proměnnou). Hráč může při plnění úkolu včas zónu „Před zdí“ opustit, počkat, až hlídač přejde (tj. až proběhne událost Při uplynutí), pak se do zóny vrátit a v plnění úkolu pokračovat. Jakmile se mu podaří úkol splnit, zastavíme časovač a provedeme příslušné akce.
Jak vidíte, s časovači můžeme různě kouzlit. Musíme si být však vědomi určitých nepříjemných efektů, které se mohou vyskytnout. Hlavním problémem je jejich nespolehlivost. Nikde jsem sice nenarazil na žádné stoprocentní potvrzení, vždy to bylo v rovině, že na nějakém přístroji konkrétní řešení zafungovalo „nějak divně“, rozhodně to však není vhodné podceňovat.
Dobrý pozor je potřeba si dát na časovače typu Interval o hodnotě 1 sekundy. V žádném případě ho nepoužívejte k počítání času. Před určitou dobou existovalo wherigo, kdy úkolem hráče bylo setrvat na konkrétním místě po nějakou dobu (myslím že 4 hodiny). První verze byla řešena formou jednosekundového intervalu, v události Při uplynutí se pak zvětšila hodnota proměnné o 1. Tím se počítal čas potřebný ke splnění úkolu. Při vlastním hraní se pak ukázalo několik problémů: na každém přístroji byly intervaly různě dlouhé, takže výsledný čas byl u každého jiný. Navíc se stalo, že hráči po cca 3 hodinách hra nenávratně spadla, což bylo způsobeno tím, že se do logu zapisovalo každé uplynutí intervalu a velikost tohoto logu překročila vyhrazenou mez. Pokud potřebujeme zabezpečit počítání času, je lepší využít funkce pro aktuální čas - buď pomocí jazyka Lua nebo výrazu Datum/Čas. Podrobněji si to ukážeme někdy v tipech pro pokročilé.
Také není vhodné mít v jeden okamžik aktivních více časovačů. Nikdy nemůžeme vědět, co se přesně stane. Kritickým může být situace, kdy více časovačů uplyne v jeden okamžik a mělo by dojít k současnému vyvolání více událostí Při uplynutí. Tady si opravdu nikdo nemůže být jistý, v jakém pořadí se události vyvolají, a jestli náhodou hra nespadne.
Přes tyto problémy jsou časovače zajímavou funkcí, která může do hry přinést zajímavé efekty. Nesmíme je však používat bezhlavě. I pro časovač platí rčení, že je dobrý sluha, ale zlý pán.