# Vytvorenie hry pomocou udalostí
Premýšľali ste niekedy nad tým, ako webové stránky vedia, že ste klikli na tlačidlo alebo napísali do textového poľa? To je kúzlo programovania riadeného udalosťami! Aký lepší spôsob, ako sa naučiť túto základnú zručnosť, než vytvoriť niečo užitočné - hru na meranie rýchlosti písania, ktorá reaguje na každý váš stisk klávesy.
Na vlastné oči uvidíte, ako webové prehliadače "komunikujú" s vaším JavaScriptovým kódom. Zakaždým, keď kliknete, napíšete alebo pohnete myšou, prehliadač posiela malé správy (nazývame ich udalosti) vášmu kódu a vy rozhodujete, ako na ne reagovať!
Keď skončíme, budete mať vytvorenú skutočnú hru na písanie, ktorá sleduje vašu rýchlosť a presnosť. Čo je však dôležitejšie, pochopíte základné koncepty, ktoré poháňajú každú interaktívnu webovú stránku, ktorú ste kedy použili. Poďme na to!
## Kvíz pred prednáškou
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programovanie riadené udalosťami
Premýšľajte o svojej obľúbenej aplikácii alebo webovej stránke - čo ju robí živou a interaktívnou? Všetko závisí od toho, ako reaguje na vaše akcie! Každé ťuknutie, kliknutie, posunutie alebo stisk klávesy vytvára to, čo nazývame "udalosť", a práve tam sa odohráva skutočná mágia webového vývoja.
Tu je to, čo robí programovanie pre web tak zaujímavým: nikdy nevieme, kedy niekto klikne na tlačidlo alebo začne písať do textového poľa. Môže kliknúť okamžite, počkať päť minút alebo možno nikdy neklikne! Táto nepredvídateľnosť znamená, že musíme premýšľať inak o tom, ako píšeme náš kód.
Namiesto písania kódu, ktorý beží odhora nadol ako recept, píšeme kód, ktorý trpezlivo čaká, kým sa niečo stane. Je to podobné ako telegrafisti v 19. storočí, ktorí sedeli pri svojich strojoch, pripravení reagovať v momente, keď cez drôt prišla správa.
Takže čo 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ť náš kód tak, aby počúval a reagoval. Vytvárame špeciálne funkcie nazývané **event listeners** (poslucháče udalostí), ktoré trpezlivo čakajú na konkrétne veci, ktoré sa majú stať, a potom sa aktivujú, keď sa to stane.
Predstavte si poslucháče udalostí ako zvonček pre váš kód. Nastavíte zvonček (`addEventListener()`), poviete mu, na aký zvuk má počúvať (napríklad 'click' alebo 'keypress') a potom určíte, čo sa má stať, keď niekto zazvoní (vaša vlastná funkcia).
**Ako fungujú poslucháče udalostí:**
- **Počúvajú** konkrétne akcie používateľa, ako kliknutia, stisky kláves alebo pohyby myšou
- **Vykonávajú** váš vlastný kód, keď nastane špecifikovaná udalosť
- **Reagujú** okamžite na interakcie používateľa, čím vytvárajú plynulý zážitok
- **Spracovávajú** viacero udalostí na rovnakom prvku pomocou rôznych poslucháčov
> **NOTE:** Stojí za zmienku, že existuje mnoho spôsobov, ako vytvoriť poslucháče udalostí. Môžete použiť anonymné funkcie alebo vytvoriť pomenované. Môžete použiť rôzne skratky, ako nastavenie vlastnosti `click` alebo použitie `addEventListener()`. V našom cvičení sa zameriame na `addEventListener()` a anonymné funkcie, pretože je to pravdepodobne najbežnejšia technika, ktorú weboví vývojári používajú. Je tiež najflexibilnejšia, pretože `addEventListener()` funguje pre všetky udalosti a názov udalosti môže byť poskytnutý ako parameter.
### Bežné udalosti
Hoci webové prehliadače ponúkajú desiatky rôznych udalostí, ktoré môžete počúvať, väčšina interaktívnych aplikácií sa spolieha len na niekoľko základných udalostí. Pochopenie týchto základných udalostí vám poskytne základ na vytváranie sofistikovaných interakcií s používateľmi.
Existuje [desiatky udalostí](https://developer.mozilla.org/docs/Web/Events), ktoré môžete počúvať pri vytváraní aplikácie. V podstate čokoľvek, čo používateľ urobí na stránke, vyvolá udalosť, čo vám dáva veľkú moc zabezpečiť, že dostane požadovaný zážitok. Našťastie budete zvyčajne potrebovať len malú časť týchto 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žitie |
|---------|-------|----------------|
| `click` | Používateľ klikol na niečo | Tlačidlá, odkazy, interaktívne prvky |
| `contextmenu` | Používateľ klikol pravým tlačidlom myši | Vlastné kontextové menu |
| `select` | Používateľ označil nejaký text | Úprava textu, operácie kopírovania |
| `input` | Používateľ zadal nejaký text | Validácia formulára, vyhľadávanie v reálnom čase |
**Pochopenie týchto typov udalostí:**
- **Spúšťajú sa**, keď používatelia interagujú s konkrétnymi prvkami na vašej stránke
- **Poskytujú** podrobné informácie o akcii používateľa prostredníctvom objektov udalostí
- **Umožňujú** vytvárať responzívne, interaktívne webové aplikácie
- **Fungujú** konzistentne na rôznych prehliadačoch a zariadeniach
## Vytvorenie hry
Teraz, keď rozumiete, ako udalosti fungujú, poďme tieto vedomosti použiť v praxi a vytvoriť niečo užitočné. Vytvoríme hru na meranie rýchlosti písania, ktorá demonštruje spracovanie udalostí a zároveň vám pomôže rozvíjať dôležitú zručnosť vývojára.
Vytvoríme hru, aby sme preskúmali, ako udalosti fungujú v JavaScripte. Naša hra otestuje schopnosť hráča písať, čo je jedna z najviac podceňovaných zručností, ktorú by mal mať každý vývojár. Zaujímavý fakt: rozloženie klávesnice QWERTY, ktoré dnes používame, bolo navrhnuté v 70. rokoch 19. storočia pre písacie stroje - a dobré zručnosti v písaní sú stále rovnako cenné pre programátorov aj dnes! Všeobecný priebeh hry bude vyzerať takto:
```mermaid
flowchart TD
A[Player clicks Start] --> B[Random quote displays]
B --> C[Player types in textbox]
C --> D{Word complete?}
D -->|Yes| E[Highlight next word]
D -->|No| F{Correct so far?}
F -->|Yes| G[Keep normal styling]
F -->|No| H[Show error styling]
E --> I{Quote complete?}
I -->|No| C
I -->|Yes| J[Show success message with time]
G --> C
H --> C
```
**Ako bude naša hra fungovať:**
- **Začne**, keď hráč klikne na tlačidlo štart a zobrazí náhodný citát
- **Sleduje** pokrok hráča v písaní slovo po slove v reálnom čase
- **Zvýrazní** aktuálne slovo, aby usmernil pozornosť hráča
- **Poskytne** okamžitú vizuálnu spätnú väzbu na chyby v písaní
- **Vypočíta** a zobrazí celkový čas po dokončení citátu
Poďme vytvoriť našu hru a naučiť sa o udalostiach!
### Štruktúra súborov
Predtým, než začneme kódovať, poďme sa zorganizovať! Mať čistú štruktúru súborov od začiatku vám ušetrí bolesti hlavy neskôr a urobí váš projekt profesionálnejším. 😊
Budeme to držať jednoduché s iba tromi súbormi: `index.html` pre štruktúru našej stránky, `script.js` pre všetku logiku hry a `style.css`, aby všetko vyzeralo skvele. Toto je klasická trojica, ktorá poháňa väčšinu webu!
**Vytvorte nový priečinok pre svoju prácu otvorením konzoly alebo terminálového okna a zadaním nasledujúceho príkazu:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Čo tieto príkazy robia:**
- **Vytvoria** nový adresár s názvom `typing-game` pre vaše projektové súbory
- **Presunú** vás automaticky do novo vytvoreného adresára
- **Nastavia** čisté pracovné prostredie pre vývoj vašej 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 nástrojom na vývoj, ktoré budete potrebovať
**Pridajte tri súbory do priečinka vo Visual Studio Code s nasledujúcimi názvami:**
- `index.html` - Obsahuje štruktúru a obsah vašej hry
- `script.js` - Spracováva všetku logiku hry a poslucháče udalostí
- `style.css` - Definuje vizuálny vzhľad a štýl
## Vytvorenie užívateľského rozhrania
Teraz poďme vytvoriť scénu, kde sa bude odohrávať všetka akcia našej hry! Myslite na to ako na navrhovanie ovládacieho panelu pre vesmírnu loď - musíme sa uistiť, že všetko, čo naši hráči potrebujú, je presne tam, kde to očakávajú.
Poďme zistiť, čo naša hra skutočne potrebuje. Ak by ste hrali hru na písanie, čo by ste chceli vidieť na obrazovke? Tu je to, čo budeme potrebovať:
| Prvok UI | Účel | HTML prvok |
|----------|------|------------|
| Zobrazenie citátu | Zobrazuje text na písanie | `
` s `id="quote"` |
| Oblasť správ | Zobrazuje stavové a úspešné správy | `
` s `id="message"` |
| Textové pole | Miesto, kde hráči píšu citát | `` s `id="typed-value"` |
| Tlačidlo štart | Spustí hru | `