Jdeme na to s Urwigem - 7. Události
V předchozích dílech seriálu jsme si popsali, z jakých nejdůležitějších částí se skládá wherigo hra. Něco tomu ale přece jenom chybělo. Chyběla tomu akce! Dnes si řekneme, jak tuhle otázku řeší wherigo.
Událostmi řízené programování
Na začátek ale ještě trochu teorie.
Je více způsobů, jak naprogramovat interakci programu s uživatelem. Pro wherigo byl zvolen v současné době velmi rozšířený princip událostmi řízeného programování. Ten spočívá v tom, že systém je většinu svého času v klidu a čeká na podněty z vnějšku - tzv. události. Jakmile k události dojde, je vyvolán kód, který na ni požadovaným způsobem zareaguje. Tomuto kódu se říká obsluha události.
Každý systém nabízí různé události, z nichž si autor programu vybírá ty, které potřebuje, a k nim vytvoří příslušnou obsluhu. Událostí může být např. start programu, klepnutí na tlačítko, výběr položky z menu, pohyb myši, stisknutí klávesy na klávesnici apod. Celý program je tedy napsán jako sada obsluh určitých událostí a je jenom na uživateli, v jakém pořadí k nim dojde, protože on se bude rozhodovat, kdy a na jaké tlačítko klepne, jakou položku z menu vybere, jakou klávesu stiskne, kam pohne myší.
Události a wherigo
Ve wherigu je tento princip uplatněn tak, že každý objekt má k dispozici několik událostí, ke kterým autor může přiřadit obslužný kód. Když pak hráč svojí činností konkrétní událost vyvolá, přiřazený kód se provede. Celé tajemství programování wherigo cartridgí tedy spočívá v tom k těm správným událostem napsat správný kód.
Události jednotlivých objektů
Při popisu vlastností jednotlivých typů objektů jsme doposud jejich události přehlíželi. Je na čase to napravit.
Cartridge
I cartridge jako objekt obsahuje několik událostí, na které může reagovat. Jsou to:
- Při spuštění - událost je vyvolána po spuštění nové wherigo hry. Je možné ji použít k počátečnímu nastavení situace a k zobrazení úvodních instrukcí pro hráče. Tato událost se však nevyvolá, když je cartridge obnovena ze zálohy.
- Při ukončení - událost je vyvolána v okamžiku ukončení hry.
- Při obnovení - událost je vyvolána ve chvíli, kdy je cartridge obnovena ze zálohy.
- Při uložení - událost je vyvolána v okamžiku uložení hry. Většinou se používá pro zobrazení informace, že byla hra uložena.
Zóny
U každé zóny jsou k dispozici tyto události:
- Při vstupu - událost je vyvolána, pokud hráč vstoupí dovnitř zóny. Toto je jedna z nejčastěji používaných událostí ve wherigu.
- Při opuštění - událost je vyvolána ve chvíli, kdy hráč opustí zónu. Při používání této události je potřeba být opatrný. Musíme si uvědomit, že pokud hráč vstoupí do zóny pouze na malý kousek, což je většinou, tak vlivem nestálosti signálu ji může zase opustit, aniž by se vůbec pohnul.
Ne úplně vhodným řešením je při vstupu do zóny zobrazit nějakou informaci a při opuštění zóny si někde poznamenat, že už si hráč informaci přečetl. Pokud by došlo k výše uvedené situaci a hráč by si informaci nestačil přečíst, pak by se mu již při dalším vstupu nezobrazila, protože by někde bylo poznamenáno, že ji už přečetl. Hráč by tak informaci neznal a zároveň by nebyl způsob, jak by ji mohl znovu získat. Bohužel na tuhle chybu občas narazíme. Pokud je to zároveň spojeno s automatickým uložením, je hráč chycen do pasti, ze které není úniku a musí začít hrát od začátku. Stane-li se to ke konci hry, dá se předpokládat, jak bude na takového autora reagovat. - Při dosahu, Při blízkosti - událost je vyvolána, jakmile se hráč dostane do dosahu nebo blízkosti zóny. Vysvětlení těchto pojmů najdete v jednom z předchozích příspěvků.
- Při změně aktivity - událost je vyvolána ve chvíli, kdy se z neaktivní zóny stává aktivní nebo naopak. Tuto událost je možné využít k různým přípravným nebo úklidovým pracím souvisejícím se změnou aktivity zóny.
I tady je však nutné být opatrný, protože se velice jednoduše můžeme dostat do nekonečné smyčky: Představte si, že máme zóny A a B. V této události u zóny A napíšeme: pokud aktivujeme A, aktivuj B, pokud deaktivujeme A, deaktivuj B. U zóny B napíšeme: pokud aktivujeme B, deaktivuj A, pokud deaktivujeme B, aktivuj A. Co se pak stane, když aktivujeme zónu A? Vyvolá se její událost změna aktivity a v ní je příkaz k aktivaci zóny B. Jakmile se to provede, vyvolá se událost změna aktivity zóny B. V ní je pro tuto situaci příkaz pro deaktivaci A. To opět vyvolá tuto událost v zóně A. Protože je deaktivována, provede se deaktivace zóny B. To zase vyvolá událost v zóně B a následnou aktivaci A. A tím jsme se zacyklili. Každá změna aktivity u jedné ze zón vede ke změně aktivity u druhé zóny a to zase vyvolá změnu aktivity u první zóny. Tento cyklus skončí po nějaké době chybou na nedostatek paměti, aniž by s tím hráč mohl něco udělat. Proto je nutné používat tuto událost s rozmyslem a pokud možno na jejím základě neprovádět změnu aktivity jiných zón.
Postavy, Předměty
U postav i předmětů je situace stejná. K dispozici je pouze jedna událost:
- Při kliknutí - k vyvolání události by mělo dojít ve chvíli, kdy si hráč v přehrávači zobrazí detail postavy nebo předmětu. Zdůrazňuji „by mělo“, protože tato událost není podporována na všech zařízeních. Spolehlivě ji ignorují Garminy. Není tedy vhodné ji používat pro klíčové herní situace. A nejlepší je nepoužívat ji vůbec.
Příkazy u postav a předmětů
Každý příkaz definovaný u postav nebo předmětů nabízí jednu událost:
- Volání příkazu - událost je vyvolána, jakmile hráč zvolí příslušný příkaz ze seznamu dostupných příkazů. Toto je další z nejčastěji používaných událostí.
Úlohy
I úlohy mohou reagovat na události:
- Při změně aktivity - podobně jako u zóny je tato událost vyvolána, jakmile dojde ke změně úlohy z neaktivní na aktivní nebo naopak. I zde platí apel na obezřetnost, aby nedošlo k zacyklení.
- Při změně kompletnosti - událost se vyvolá v okamžiku, kdy bude úloha označena jako kompletní, anebo v okamžiku, kdy bude úloha označena jako nekompletní.
- Při změně správnosti - protože nastavení správnosti způsobuje pád cartridge, tak ani tuto událost není vhodné vůbec používat.
- Při kliknutí - zde je situace stejná jako u postav nebo předmětů. Událost by měla být vyvolána ve chvíli, kdy si hráč zobrazí detail úlohy. Protože však nefunguje na všech zařízeních, je lepší se jí vyhnout.
Výše uvedený výčet není kompletní. Existují ještě další objekty, které mají také svoje události, jako např. vstupy nebo časovače. O těch si ale povíme někdy příště.
Události v Urwigu
Ještě si ukážeme, jak se s událostmi pracuje v Urwigu. Události se normálně zobrazují na záložce nebo v panelu vlastností jako ostatní parametry objektu. Vedle jejich názvu však najdete modrý podtržený text, který může nabývat dvou hodnot: ošetřeno nebo neošetřeno. Neošetřeno znamená, že k této události není připojen žádný obslužný kód a pokud k ní dojde, nestane se nic. Ošetřeno naopak znamená, že k této události obslužný kód připojen je a pokud nastane, bude proveden.
Oba texty fungují jako klikací odkaz. Pokud na ně autor klepne myší, otevře se mu samostatná záložka s diagramem, ve kterém může nadefinovat požadovaný kód obsluhy této události.
Shrnutí
Možná se vám dnešní povídání zdálo více komplikované než ta předcházející. Zkusíme si to trochu shrnout:
Objekty ve wherigu dávají k dispozici události, které se vyvolají vždy, když dojde k určité situaci (např. obnova uložené hry, vstup do zóny, výběr příkazu apod.). Podstata programování cartridge pak spočívá v určení, ke kterým událostem napíšeme jaký obslužný kód.
Pokračování: Jdeme na to s Urwigem - 8. Diagramy kódů