# Vytváření hry pomocí událostí
Už jste se někdy divili, jak webové stránky poznají, kdy kliknete na tlačítko nebo píšete do textového pole? To je kouzlo programování řízeného událostmi! Co je lepšího způsobu, jak se naučit tuto základní dovednost, než vytvořit něco užitečného – hru na rychlost psaní, která reaguje na každý váš stisk klávesy.
Uvidíte na vlastní oči, jak webové prohlížeče „komunikují“ s vaším kódem JavaScriptu. Když kliknete, napíšete nebo pohněte myší, prohlížeč posílá malá „zprávy“ (říkáme jim události) vašemu kódu a vy rozhodnete, jak na ně reagovat!
Až tady skončíme, vytvoříte skutečnou hru na psaní, která sleduje vaši rychlost a přesnost. Ještě důležitější je, že pochopíte základní pojmy, které pohánějí každou interaktivní webovou stránku, kterou jste kdy použili. Pojďme na to!
## Kvíz před přednáškou
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programování řízené událostmi
Zamyslete se nad svou oblíbenou aplikací nebo webovou stránkou – co ji dělá živou a citlivou? Je to celé o tom, jak reaguje na to, co děláte! Každé klepnutí, kliknutí, přejetí nebo stisk klávesy vytváří to, čemu říkáme „událost“, a právě zde se odehrává opravdové kouzlo webového vývoje.
Co dělá programování pro web tak zajímavým: nikdy nevíme, kdy někdo klikne na tlačítko nebo začne psát do textového pole. Může kliknout hned, počkat pět minut nebo třeba vůbec! Tato nepředvídatelnost znamená, že musíme o psaní kódu přemýšlet jinak.
Místo psaní kódu, který se vykonává shora dolů jako recept, píšeme kód, který trpělivě čeká na to, až se něco stane. Je to podobné jako telegrafisté v 19. století, kteří seděli u svých strojů a byli připraveni zareagovat ve chvíli, kdy přišla zpráva přes drát.
Tak co přesně je „událost“? Jednoduše řečeno, je to něco, co se stane! Když kliknete na tlačítko – to je událost. Když napíšete písmeno – to je událost. Když pohněte myší – to je další událost.
Programování řízené událostmi nám umožňuje nastavit náš kód tak, aby poslouchal a reagoval. Vytváříme speciální funkce nazývané **event listenery** (posluchače událostí), které trpělivě čekají na konkrétní situace a pak okamžitě reagují, když nastanou.
Představte si posluchače událostí jako zvonek u dveří pro váš kód. Nastavíte zvonek (`addEventListener()`), řeknete mu, jaký zvuk má poslouchat (například „kliknutí“ nebo „stisk klávesy“) a pak určíme, co se má stát, když někdo zazvoní (vaše vlastní funkce).
**Takto posluchače událostí fungují:**
- **Poslouchají** specifické uživatelské akce jako kliknutí, stisky kláves či pohyby myši
- **Spustí** váš vlastní kód, když nastane daná událost
- **Okamžitě reagují** na uživatelské interakce a vytvářejí plynulý zážitek
- **Řeší** více událostí na stejném prvku pomocí různých posluchačů
> **POZNÁMKA:** Stojí za to zdůraznit, že existuje mnoho způsobů, jak vytvořit posluchače událostí. Můžete použít anonymní funkce nebo pojmenované funkce. Můžete využít různé zkratky, například nastavit vlastnost `click` nebo použít `addEventListener()`. V našem cvičení se zaměříme na `addEventListener()` a anonymní funkce, protože je to pravděpodobně nejběžnější technika používaná webovými vývojáři. Je také nejflexibilnější, protože `addEventListener()` funguje pro všechny události a název události lze předat jako parametr.
### Běžné události
I když webové prohlížeče nabízejí desítky různých událostí, na které můžete poslouchat, většina interaktivních aplikací spoléhá jen na hrstku základních událostí. Pochopení těchto základních událostí vám dá základy pro vytváření sofistikovaných uživatelských interakcí.
Existuje [desítky událostí](https://developer.mozilla.org/docs/Web/Events), na které můžete při vytváření aplikace reagovat. Prakticky cokoli, co uživatel na stránce udělá, vyvolá událost, což vám dává spoustu možností, abyste zajistili požadovaný uživatelský zážitek. Naštěstí budete obvykle potřebovat jen pár událostí. Zde je několik běžných (včetně dvou, které použijeme při tvorbě naší hry):
| Událost | Popis | Běžné použití |
|---------|-------|---------------|
| `click` | Uživatel kliknul na něco | Tlačítka, odkazy, interaktivní prvky |
| `contextmenu` | Uživatel kliknul pravým tlačítkem myši | Vlastní kontextové menu na pravý klik |
| `select` | Uživatel označil text | Úprava textu, kopírování |
| `input` | Uživatel zadal text | Ověření formuláře, vyhledávání v reálném čase |
**Pochopení těchto typů událostí:**
- **Spouští se** při interakci uživatelů s konkrétními prvky na stránce
- **Poskytují** podrobné informace o uživatelské akci prostřednictvím objektů událostí
- **Umožňují** vytvářet citlivé a interaktivní webové aplikace
- **Fungují** konzistentně napříč různými prohlížeči a zařízeními
## Vytvoření hry
Nyní, když rozumíte tomu, jak události fungují, pojďme tuto znalost využít v praxi vytvářením něčeho užitečného. Vytvoříme hru na rychlost psaní, která demonstruje práci s událostmi a zároveň vám pomůže rozvinout důležitou dovednost programátora.
Budeme vytvářet hru, abychom prozkoumali, jak události fungují v JavaScriptu. Naše hra otestuje hráčovu schopnost psaní, což je jedna z nejvíce podceňovaných dovedností, kterou by měl každý vývojář mít. Zajímavost: klávesnice QWERTY, kterou dnes používáme, byla ve skutečnosti navržena v 70. letech 19. století pro psací stroje – a dobré psací dovednosti jsou pro programátory stále stejně cenné! Obecný průběh hry bude vypadat takto:
```mermaid
flowchart TD
A[Hráč klikne na Start] --> B[Náhodný citát se zobrazí]
B --> C[Hráč píše do textového pole]
C --> D{Slovo je dokončeno?}
D -->|Ano| E[Zvýraznit další slovo]
D -->|Ne| F{Zatím správně?}
F -->|Ano| G[Udržet normální styl]
F -->|Ne| H[Zobrazit chybný styl]
E --> I{Citát dokončen?}
I -->|Ne| C
I -->|Ano| J[Zobrazit zprávu o úspěchu s časem]
G --> C
H --> C
```
**Takto bude naše hra fungovat:**
- **Začne** po kliknutí hráče na tlačítko start a zobrazí náhodný citát
- **Sleduje** postup psaní hráče slovo po slovu v reálném čase
- **Zvýrazňuje** aktuální slovo pro lepší soustředění hráče
- **Poskytuje** okamžitou vizuální zpětnou vazbu při chybách v psaní
- **Vypočítá** a zobrazí celkový čas po dokončení citátu
Pojďme postavit naši hru a naučit se o událostech!
### Struktura souborů
Než začneme kódovat, zorganizujme si vše! Mít od začátku čistou strukturu souborů ušetří později spoustu starostí a udělá z vašeho projektu profesionálnější práci. 😊
Budeme to mít jednoduché – tři soubory: `index.html` pro strukturu stránky, `script.js` pro veškerou logiku hry a `style.css`, abychom vše krásně naformátovali. To je klasické trio, které pohání většinu webu!
**Vytvořte novou složku pro svou práci otevřením konzole nebo terminálu a zadejte následující příkaz:**
```bash
# Linux nebo macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Co tyto příkazy dělají:**
- **Vytvoří** novou složku s názvem `typing-game` pro vaše projekty
- **Automaticky** přejde do nové složky
- **Založí** čisté pracovní prostředí pro vývoj hry
**Otevřete Visual Studio Code:**
```bash
code .
```
**Tento příkaz:**
- **Spustí** Visual Studio Code v aktuálním adresáři
- **Otevře** vaši projektovou složku v editoru
- **Umožní** přístup ke všem vývojovým nástrojům, které budete potřebovat
**Přidejte do složky ve Visual Studio Code tři soubory s těmito názvy:**
- `index.html` – obsahuje strukturu a obsah vaší hry
- `script.js` – řeší veškerou logiku hry a posluchače událostí
- `style.css` – definuje vizuální podobu a stylování
## Vytvoření uživatelského rozhraní
Teď postavme jeviště, kde se odehraje veškerá akce naší hry! Představte si to jako navrhování ovládacího panelu vesmírné lodi – musíme zajistit, aby vše, co hráči potřebují, bylo přesně tam, kde to čekají.
Pojďme zjistit, co naše hra skutečně potřebuje. Kdybyste hráli hru na psaní, co byste chtěli vidět na obrazovce? Tady je to, co budeme potřebovat:
| Prvek UI | Účel | HTML prvek |
|----------|-------|------------|
| Zobrazení citátu | Ukazuje text k opsání | `
` s `id="quote"` |
| Oblast zpráv | Zobrazuje stavové a úspěšné zprávy | `
` s `id="message"` |
| Textové pole | Místo, kde hráči píší citát | `` s `id="typed-value"` |
| Tlačítko start | Spustí hru | `