# Vytváranie hry pomocou udalostí
Niekedy ste sa zamýšľali, ako webové stránky vedia, kedy kliknete na tlačidlo alebo napíšete do textového poľa? To je kúzlo programovania riadeného udalosťami! Čo by mohlo byť lepším spôsobom, ako sa naučiť túto základnú zručnosť, než vytvoriť niečo užitočné – hru na rýchlosť písania, ktorá reaguje na každý stlačený kláves.
Uvidíte, ako webové prehliadače „komunikujú“ s vaším JavaScript kódom. Kedykoľvek kliknete, napíšete alebo pohnete myšou, prehliadač posiela malinké správy (nazývame ich udalosti) vášmu kódu a vy rozhodnete, ako na ne zareagujete!
Keď tu skončíme, vytvoríte skutočnú písaciu hru, ktorá sleduje vašu rýchlosť a presnosť. Dôležitejšie je, že pochopíte základné koncepty, ktoré poháňajú každú interaktívnu webovú stránku, ktorú ste kedy použili. Poďme na to!
## Prednáškový kvíz
[Prednáškový kvíz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programovanie riadené udalosťami
Premyslite si svoju obľúbenú aplikáciu alebo webovú stránku – čo ju robí živou a reagujúcou? Je to všetko o tom, ako reaguje na to, čo robíte! Každý ťuk, klik, potiahnutie prstom alebo stlačenie klávesu vytvára to, čomu hovoríme „udalosti“, a tam sa deje skutočné kúzlo webového vývoja.
Čo robí programovanie pre web také zaujímavé: nikdy neviete, kedy niekto klikne na tlačidlo alebo začne písať do textového poľa. Môžu kliknúť hneď, počkať päť minút alebo možno kliknúť nikdy! Táto nepredvídateľnosť znamená, že musíme premýšľať inak, ako píšeme náš kód.
Namiesto písania kódu, ktorý beží od začiatku do konca ako recept, píšeme kód, ktorý trpezlivo čaká, kým sa niečo stane. Je to podobné ako telegrafisti v 1800-tych rokoch, ktorí sedeli pri svojich strojoch pripravení reagovať v momente, keď cez drôt prišla správa.
Čo teda presne je „udalosť“? Jednoducho povedané, je to niečo, čo sa stane! Keď kliknete na tlačidlo – to je udalosť. Keď napíšete písmeno – to je udalosť. Keď pohnete myšou – to je ďalšia udalosť.
Programovanie riadené udalosťami nám umožňuje nastaviť kód tak, aby počúval a reagoval. Vytvárame špeciálne funkcie nazývané **event listenery** (počúvatelia udalostí), ktoré trpezlivo čakajú, kým sa konkrétne veci stanú, a potom okamžite zasiahnu.
Myslite na event listenery ako na zvonček pre váš kód. Nastavíte zvonček (`addEventListener()`), určíte, aký zvuk má počúvať (napríklad 'click' alebo 'keypress') a potom špecifikujete, čo sa má stať, keď niekto zazvoní (vaša vlastná funkcia).
**Takto event listenery fungujú:**
- **Počúvajú** špecifické akcie používateľa ako kliky, stlačenia kláves alebo pohyby myši
- **Spúšťajú** váš vlastný kód, keď uvedená udalosť nastane
- **Reagujú** okamžite na užívateľské akcie, čím vytvárajú plynulý zážitok
- **Riešia** viacero udalostí na rovnakom prvku pomocou rôznych listenerov
> **POZNÁMKA:** Stojí za to zdôrazniť, že existuje mnoho spôsobov, ako vytvoriť event listenery. Môžete používať anonymné funkcie alebo vytvárať pomenované. Môžete využiť rôzne skratky, napríklad nastavenie vlastnosti `click` alebo použitie `addEventListener()`. V našej úlohe sa zameriame na `addEventListener()` a anonymné funkcie, pretože je to pravdepodobne najbežnejšia technika používaná webovými vývojármi. Je to tiež najflexibilnejšie, pretože `addEventListener()` funguje pre všetky udalosti a názov udalosti sa dá zadať ako parameter.
### Bežné udalosti
Aj keď webové prehliadače ponúkajú desiatky rôznych udalostí, na ktoré môžete počúvať, väčšina interaktívnych aplikácií sa spolieha len na malý počet základných udalostí. Pochopenie týchto jadrových udalostí vám poskytne základ na vytváranie sofistikovaných používateľských interakcií.
Existuje [koľko udalostí](https://developer.mozilla.org/docs/Web/Events), na ktoré môžete počúvať pri vytváraní aplikácie. V podstate čokoľvek, čo užívateľ na stránke urobí, vyvolá udalosť, čo vám dáva veľkú moc zabezpečiť, že dostanú požadovaný zážitok. Našťastie, zvyčajne budete potrebovať len malú sadu udalostí. Tu je niekoľko bežných (vrátane dvoch, ktoré použijeme pri vytváraní našej hry):
| Udalosť | Popis | Bežné použitia |
|---------|--------|----------------|
| `click` | Užívateľ klikol na niečo | Tlačidlá, odkazy, interaktívne prvky |
| `contextmenu` | Užívateľ klikol pravým tlačidlom myši | Vlastné kontextové menu pravého kliknutia |
| `select` | Užívateľ označil nejaký text | Úprava textu, kopírovanie |
| `input` | Užívateľ zadal text | Overovanie formulárov, vyhľadávanie v reálnom čase |
**Pochopenie týchto typov udalostí:**
- **Spúšťajú sa**, keď užívateľ interaguje s konkrétnymi prvkami na stránke
- **Poskytujú** podrobné informácie o užívateľskej akcii cez objekty udalostí
- **Umožňujú** vytvárať responzívne, interaktívne webové aplikácie
- **Fungujú** konzistentne naprieč rôznymi prehliadačmi a zariadeniami
## Vytvorenie hry
Teraz, keď rozumiete, ako udalosti fungujú, poďme túto vedomosť využiť v praxi a vytvoriť niečo užitočné. Vytvoríme hru na rýchlosť písania, ktorá ukáže, ako spracovávať udalosti, a zároveň vám pomôže rozvinúť dôležitú zručnosť vývojára.
Vytvoríme hru, aby sme preskúmali, ako udalosti fungujú v JavaScripte. Naša hra otestuje hráčove zručnosti pri písaní, čo je jedna z najpodceňovanejších zručností, ktoré by mal mať každý vývojár. Zábavný fakt: rozloženie klávesnice QWERTY, ktoré dnes používame, bolo vlastne navrhnuté v 1870-tych rokoch pre písacie stroje – a dobré zručnosti pri písaní sú stále rovnako cenné aj pre programátorov! Všeobecný priebeh hry bude vyzerať takto:
```mermaid
flowchart TD
A[Hráč klikne Štart] --> B[Náhodný citát sa zobrazí]
B --> C[Hráč píše do textového poľa]
C --> D{Slovo dokončené?}
D -->|Áno| E[Zvýrazni ďalšie slovo]
D -->|Nie| F{Zatiaľ správne?}
F -->|Áno| G[Zachovať normálny štýl]
F -->|Nie| H[Zobraziť chybový štýl]
E --> I{Citát dokončený?}
I -->|Nie| C
I -->|Áno| J[Zobraziť úspešnú správu s časom]
G --> C
H --> C
```
**Takto bude hra fungovať:**
- **Začína** keď hráč klikne na tlačidlo štart a zobrazí sa náhodná citácia
- **Sleduje** pokrok hráča pri písaní slovo po slove v reálnom čase
- **Zvýrazňuje** aktuálne slovo, aby pomohla hráčovi sústrediť sa
- **Poskytuje** okamžitú vizuálnu spätnú väzbu pri chybách v písaní
- **Počíta** a zobrazuje celkový čas po dokončení citácie
Postavme našu hru a naučme sa o udalostiach!
### Štruktúra súborov
Predtým, než začneme kódovať, zorganizujme si veci! Mať čistú štruktúru súborov od začiatku vám neskôr ušetrí bolesti hlavy a spraví váš projekt profesionálnejším. 😊
Ponecháme to jednoduché len s troma súbormi: `index.html` pre štruktúru stránky, `script.js` pre celú logiku hry a `style.css` aby všetko vyzeralo skvele. Toto je klasické trio, ktoré poháňa väčšinu webu!
**Vytvorte novú zložku pre svoju prácu otvorením konzoly alebo terminálu a zadaním nasledujúceho príkazu:**
```bash
# Linux alebo macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Toto príkazy robia:**
- **Vytvorí** nový priečinok s názvom `typing-game` pre súbory projektu
- **Automaticky** prejde do novo vytvoreného priečinka
- **Nastaví** čisté pracovné prostredie pre vývoj hry
**Otvorte Visual Studio Code:**
```bash
code .
```
**Tento príkaz:**
- **Spustí** Visual Studio Code v aktuálnom adresári
- **Otvára** váš projektový priečinok v editore
- **Poskytuje** prístup ku všetkým vývojárskym nástrojom, ktoré potrebujete
**Pridajte do zložky v Visual Studio Code tri súbory s týmito názvami:**
- `index.html` – Obsahuje štruktúru a obsah hry
- `script.js` – Rieši všetku hernú logiku a event listenery
- `style.css` – Definuje vizuálny vzhľad a štýly
## Vytvorenie používateľského rozhrania
Postavme teraz pódium, kde sa bude odohrávať celá naša herná akcia! Predstavte si to ako navrhovanie ovládacieho panela na vesmírnu loď – musíme zabezpečiť, že všetko, čo hráči potrebujú, bude tam, kde to očakávajú.
Zistime, čo hra vlastne potrebuje. Ak by ste hrali hru na písanie, čo by ste chceli vidieť na obrazovke? Toto budeme potrebovať:
| Prvok UI | Účel | HTML element |
|----------|-------|--------------|
| Zobrazenie citácie | Zobrazuje text na napísanie | `
` s `id="quote"` |
| Oblasť správ | Zobrazuje stavové a úspešné správy | `
` s `id="message"` |
| Textové pole | Kde hráči píšu citáciu | `` s `id="typed-value"` |
| Tlačidlo Štart | Začína hru | `