# Ustvarjanje igre z dogodki
Ste se kdaj spraševali, kako spletne strani vedo, kdaj kliknete gumb ali vnesete besedilo v polje? To je čar programiranja, ki temelji na dogodkih! Kaj je boljši način za učenje te ključne veščine kot ustvarjanje nečesa uporabnega - igre za merjenje hitrosti tipkanja, ki se odziva na vsak vaš pritisk tipke.
Videli boste iz prve roke, kako spletni brskalniki "komunicirajo" z vašo kodo JavaScript. Vsakič, ko kliknete, tipkate ali premaknete miško, brskalnik pošlje majhna sporočila (imenujemo jih dogodki) vaši kodi, vi pa se odločite, kako se nanje odzvati!
Ko bomo končali, boste ustvarili pravo igro tipkanja, ki bo spremljala vašo hitrost in natančnost. Še pomembneje pa je, da boste razumeli temeljne koncepte, ki poganjajo vsako interaktivno spletno stran, ki ste jo kdaj uporabili. Začnimo!
## Predhodni kviz
[Predhodni kviz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programiranje, ki temelji na dogodkih
Pomislite na svojo najljubšo aplikacijo ali spletno stran - kaj jo naredi živo in odzivno? Vse je odvisno od tega, kako se odziva na vaše dejanje! Vsak dotik, klik, poteg ali pritisk tipke ustvari tisto, kar imenujemo "dogodek", in tukaj se začne prava čarovnija spletnega razvoja.
Tukaj je tisto, kar programiranje za splet naredi tako zanimivo: nikoli ne vemo, kdaj bo nekdo kliknil tisti gumb ali začel tipkati v besedilno polje. Morda bo kliknil takoj, čakal pet minut ali pa sploh ne bo kliknil! Ta nepredvidljivost pomeni, da moramo razmišljati drugače o tem, kako pišemo kodo.
Namesto da pišemo kodo, ki se izvaja od zgoraj navzdol kot recept, pišemo kodo, ki potrpežljivo čaka, da se nekaj zgodi. To je podobno kot telegrafisti v 19. stoletju, ki so sedeli ob svojih napravah, pripravljeni odgovoriti v trenutku, ko je sporočilo prispelo po žici.
Kaj točno je "dogodek"? Preprosto povedano, to je nekaj, kar se zgodi! Ko kliknete gumb - to je dogodek. Ko vnesete črko - to je dogodek. Ko premaknete miško - to je še en dogodek.
Programiranje, ki temelji na dogodkih, nam omogoča, da nastavimo kodo, da posluša in se odziva. Ustvarimo posebne funkcije, imenovane **poslušalci dogodkov**, ki potrpežljivo čakajo na določene dogodke, nato pa se aktivirajo, ko se ti zgodijo.
Pomislite na poslušalce dogodkov kot na zvonec za vašo kodo. Nastavite zvonec (`addEventListener()`), poveste, na kakšen zvok naj posluša (na primer 'klik' ali 'pritisk tipke'), nato pa določite, kaj naj se zgodi, ko nekdo pozvoni (vaša prilagojena funkcija).
**Kako delujejo poslušalci dogodkov:**
- **Poslušajo** določena dejanja uporabnika, kot so kliki, pritiski tipk ali premiki miške
- **Izvedejo** vašo prilagojeno kodo, ko se zgodi določen dogodek
- **Odzivajo** se takoj na interakcije uporabnika, kar ustvarja brezhibno izkušnjo
- **Obravnavajo** več dogodkov na istem elementu z različnimi poslušalci
> **NOTE:** Pomembno je poudariti, da obstaja veliko načinov za ustvarjanje poslušalcev dogodkov. Uporabite lahko anonimne funkcije ali ustvarite poimenovane. Uporabite lahko različne bližnjice, kot je nastavitev lastnosti `click`, ali pa uporabite `addEventListener()`. V naši vaji se bomo osredotočili na `addEventListener()` in anonimne funkcije, saj je to verjetno najpogostejša tehnika, ki jo uporabljajo spletni razvijalci. Prav tako je najbolj prilagodljiva, saj `addEventListener()` deluje za vse dogodke, ime dogodka pa je mogoče podati kot parameter.
### Pogosti dogodki
Medtem ko spletni brskalniki ponujajo na desetine različnih dogodkov, ki jih lahko poslušate, večina interaktivnih aplikacij temelji le na peščici ključnih dogodkov. Razumevanje teh osnovnih dogodkov vam bo dalo temelje za gradnjo sofisticiranih uporabniških interakcij.
Obstaja [na desetine dogodkov](https://developer.mozilla.org/docs/Web/Events), ki jih lahko poslušate pri ustvarjanju aplikacije. V bistvu vse, kar uporabnik naredi na strani, sproži dogodek, kar vam daje veliko moči, da zagotovite želeno izkušnjo. Na srečo boste običajno potrebovali le majhno število dogodkov. Tukaj je nekaj pogostih (vključno z dvema, ki ju bomo uporabili pri ustvarjanju naše igre):
| Dogodek | Opis | Pogoste uporabe |
|---------|------|-----------------|
| `click` | Uporabnik je nekaj kliknil | Gumbi, povezave, interaktivni elementi |
| `contextmenu` | Uporabnik je kliknil z desnim gumbom miške | Prilagojeni meniji z desnim klikom |
| `select` | Uporabnik je označil nekaj besedila | Urejanje besedila, operacije kopiranja |
| `input` | Uporabnik je vnesel nekaj besedila | Validacija obrazcev, iskanje v realnem času |
**Razumevanje teh vrst dogodkov:**
- **Sprožijo** se, ko uporabniki interagirajo z določenimi elementi na vaši strani
- **Ponujajo** podrobne informacije o uporabnikovem dejanju prek objektov dogodkov
- **Omogočajo** ustvarjanje odzivnih, interaktivnih spletnih aplikacij
- **Delujejo** dosledno v različnih brskalnikih in napravah
## Ustvarjanje igre
Zdaj, ko razumete, kako delujejo dogodki, uporabimo to znanje v praksi in ustvarimo nekaj uporabnega. Ustvarili bomo igro za merjenje hitrosti tipkanja, ki prikazuje obdelavo dogodkov in hkrati pomaga razviti pomembno veščino razvijalca.
Ustvarili bomo igro, da raziščemo, kako dogodki delujejo v JavaScriptu. Naša igra bo preizkusila tipkarsko spretnost igralca, kar je ena najbolj podcenjenih veščin, ki bi jo moral imeti vsak razvijalec. Zanimivost: postavitev tipkovnice QWERTY, ki jo uporabljamo danes, je bila dejansko zasnovana v 1870-ih za pisalne stroje - in dobre tipkarske veščine so še danes enako dragocene za programerje! Splošen potek igre bo videti takole:
```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
```
**Kako bo naša igra delovala:**
- **Začne se**, ko igralec klikne gumb za začetek in prikaže naključen citat
- **Sledi** napredku tipkanja igralca besedo za besedo v realnem času
- **Označi** trenutno besedo, da usmeri igralčevo pozornost
- **Nudi** takojšnje vizualne povratne informacije o napakah pri tipkanju
- **Izračuna** in prikaže skupni čas, ko je citat dokončan
Zgradimo našo igro in se naučimo o dogodkih!
### Struktura datotek
Preden začnemo s kodiranjem, se organizirajmo! Čista struktura datotek od začetka vam bo prihranila glavobole kasneje in naredila vaš projekt bolj profesionalen. 😊
Ohranili bomo preprostost s samo tremi datotekami: `index.html` za strukturo naše strani, `script.js` za vso logiko igre in `style.css`, da bo vse videti odlično. To je klasična trojica, ki poganja večino spleta!
**Ustvarite novo mapo za svoje delo tako, da odprete konzolo ali terminal in vnesete naslednji ukaz:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Kaj ti ukazi naredijo:**
- **Ustvarijo** novo mapo z imenom `typing-game` za vaše projektne datoteke
- **Samodejno preklopijo** v novo ustvarjeno mapo
- **Nastavijo** čisto delovno okolje za razvoj vaše igre
**Odprite Visual Studio Code:**
```bash
code .
```
**Ta ukaz:**
- **Zažene** Visual Studio Code v trenutni mapi
- **Odpre** vašo projektno mapo v urejevalniku
- **Omogoča** dostop do vseh orodij za razvoj, ki jih potrebujete
**Dodajte tri datoteke v mapo v Visual Studio Code z naslednjimi imeni:**
- `index.html` - Vsebuje strukturo in vsebino vaše igre
- `script.js` - Upravlja vso logiko igre in poslušalce dogodkov
- `style.css` - Določa vizualni videz in oblikovanje
## Ustvarite uporabniški vmesnik
Zdaj zgradimo oder, na katerem se bo odvijala vsa akcija naše igre! Pomislite na to kot na oblikovanje nadzorne plošče za vesoljsko ladjo - poskrbeti moramo, da je vse, kar naši igralci potrebujejo, tam, kjer to pričakujejo.
Razmislimo, kaj naša igra dejansko potrebuje. Če bi igrali igro tipkanja, kaj bi želeli videti na zaslonu? Tukaj je, kaj bomo potrebovali:
| UI Element | Namen | HTML Element |
|------------|-------|-------------|
| Prikaz citata | Prikazuje besedilo za tipkanje | `
` z `id="quote"` |
| Območje sporočil | Prikazuje status in sporočila o uspehu | `
` z `id="message"` |
| Vnos besedila | Kjer igralci vnašajo citat | `` z `id="typed-value"` |
| Gumb za začetek | Začne igro | `