# Ustvarjanje igre z dogodki
Ste se kdaj spraševali, kako spletna mesta vedo, kdaj kliknete gumb ali vtipkate nekaj v besedilno polje? To je čar programiranja, ki temelji na dogodkih! Kaj bi bilo boljše, kot se naučiti tega bistvenega znanja z izdelavo nečesa uporabnega - igre za merjenje hitrosti tipkanja, ki reagira na vsak vaš pritisk tipke.
Na lastne oči boste videli, kako spletni brskalniki "komunicirajo" z vašo JavaScript kodo. Vsakič, ko kliknete, tipkate ali premaknete miško, brskalnik pošlje majhna sporočila (imenovana dogodki) vaši kodi, vi pa odločate, kako boste nanje reagirali!
Do konca tega poglavja boste ustvarili pravo igro tipkanja, ki spremlja vašo hitrost in natančnost. Še pomembneje, razumeli boste osnovne koncepte, ki poganjajo vsako interaktivno spletno stran, ki ste jo kdaj uporabili. Gremo!
## Predpredavalni kviz
[Predpredavalni kviz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programiranje, ki temelji na dogodkih
Pomislite na vašo najljubšo aplikacijo ali spletno stran - kaj ji daje občutek živosti in odzivnosti? Vse je odvisno od tega, kako reagira na vaše dejanja! Vsak dotik, klik, poteg ali pritisk tipke ustvarja t.i. "dogodek" in tu se zgodi prava čarovnija spletnega razvoja.
Zanimivo pri programiranju za splet je, da nikoli ne vemo, kdaj bo nekdo kliknil gumb ali začel tipkati v besedilno polje. Lahko kliknejo takoj, počakajo pet minut ali pa morda sploh nikoli! Ta nepredvidljivost pomeni, da moramo drugače razmišljati o pisanju kode.
Namesto da pišemo kodo, ki teče od vrha do dna, kot recept, pišemo kodo, ki potrpežljivo čaka, da se nekaj zgodi. Podobno kot telegrafisti v 1800-ih, ki so sedeli ob svojih napravah in bili pripravljeni odgovoriti takoj, ko je prišlo sporočilo po žici.
Kaj torej je "dogodek"? Preprosto povedano, je nekaj, kar se zgodi! Ko kliknete gumb - to je dogodek. Ko vtipkate črko - to je dogodek. Ko premaknete miško - to je še en dogodek.
Programiranje, ki temelji na dogodkih, nam omogoča, da nastavite kodo tako, da posluša in reagira. Ustvarimo posebne funkcije, imenovane **poslušalci dogodkov**, ki potrpežljivo čakajo, da se zgodijo določene stvari, nato pa ukrepajo.
Pomislite na poslušalce dogodkov kot na zvonec za vašo kodo. Nastavite zvonec (`addEventListener()`), določite, na kateri zvok naj se odzove (kot je 'click' ali 'keypress'), in nato določite, kaj se naj zgodi, ko nekdo zvoni (vaša prilagojena funkcija).
**Tako delujejo poslušalci dogodkov:**
- **Poslušajo** določena uporabniška dejanja, kot so kliki, pritiski tipk ali premiki miške
- **Izvedejo** vašo prilagojeno kodo, ko se zgodi določen dogodek
- **Neposredno** reagirajo na uporabniške interakcije, ustvarjajo brezhibno izkušnjo
- **Obravnavajo** več dogodkov na istem elementu z različnimi poslušalci
> **OPOMBA:** Vredno je poudariti, da obstaja več načinov ustvarjanja poslušalcev dogodkov. Uporabite lahko anonimne funkcije ali poimenujete funkcije. Lahko uporabljate različne bližnjice, kot nastavitev lastnosti `click` ali uporabo `addEventListener()`. V naši vaji se bomo osredotočili na `addEventListener()` in anonimne funkcije, saj je to verjetno najpogostejša tehnika med spletnimi razvijalci. Je tudi najbolj prilagodljiva, saj `addEventListener()` deluje za vse dogodke, ime dogodka pa lahko posredujete kot parameter.
### Pogosti dogodki
Čeprav spletni brskalniki ponujajo na desetine različnih dogodkov, ki jih lahko poslušate, se večina interaktivnih aplikacij opira na le nekaj bistvenih dogodkov. Razumevanje teh osnovnih dogodkov vam bo dalo temelje za izdelavo zahtevnih uporabniških interakcij.
Na voljo je [na desetine dogodkov](https://developer.mozilla.org/docs/Web/Events), ki jih lahko poslušate pri ustvarjanju aplikacije. Pravzaprav skoraj vse, kar uporabnik naredi na strani, sproži dogodek, kar vam daje veliko moči za zagotavljanje želenih izkušenj. Na srečo boste običajno potrebovali le nekaj osnovnih 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 kliknil nekaj | Gumbi, povezave, interaktivni elementi |
| `contextmenu` | Uporabnik je kliknil z desnim gumbom miške | Prilagojeni meniji za desni klik |
| `select` | Uporabnik je označil nekaj besedila | Urejanje besedila, kopiranje |
| `input` | Uporabnik je vnesel besedilo | Preverjanje obrazcev, iskanje v realnem času |
**Razumevanje teh vrst dogodkov:**
- **Sproži** se, ko uporabniki delujejo z določenimi elementi na vaši strani
- **Nudi** podrobne informacije o dejanju uporabnika prek objektov dogodkov
- **Omogoča** ustvarjanje odzivnih, interaktivnih spletnih aplikacij
- **Deluje** dosledno na različnih brskalnikih in napravah
## Ustvarjanje igre
Zdaj, ko razumete, kako dogodki delujejo, preizkusimo to znanje v praksi z izdelavo nečesa uporabnega. Ustvarili bomo igro hitrega tipkanja, ki prikazuje obdelavo dogodkov in hkrati pomaga razviti pomembno veščino razvijalca.
Naredili bomo igro za raziskovanje delovanja dogodkov v JavaScriptu. Naša igra bo testirala igralčevo spretnost tipkanja, kar je ena najbolj podcenjenih veščin, ki bi jih moral imeti vsak razvijalec. Zabavna dejstva: postavitev tipkovnice QWERTY, ki jo danes uporabljamo, je bila dejansko zasnovana v 1870-ih za pisalne stroje - in dobre veščine tipkanja so še vedno zelo dragocene za programerje danes! Splošna potek igre bo izgledala takole:
```mermaid
flowchart TD
A[Igralec klikne Začni] --> B[Prikaže se naključen citat]
B --> C[Igralec vtipka v polje za besedilo]
C --> D{Beseda dokončana?}
D -->|Da| E[Označi naslednjo besedo]
D -->|Ne| F{Doslej pravilno?}
F -->|Da| G[Ohrani običajno oblikovanje]
F -->|Ne| H[Prikaži obliko napake]
E --> I{Citat dokončan?}
I -->|Ne| C
I -->|Da| J[Prikaži sporočilo o uspehu s časom]
G --> C
H --> C
```
**Tako bo delovala naša igra:**
- **Začne** se, ko igralec klikne gumb za začetek in prikaže naključen citat
- **Spremlja** napredek tipkanja igralca besedo za besedo v realnem času
- **Označi** trenutno besedo, da usmeri fokus igralca
- **Nudi** takojšnje vizualno povratno informacijo za napake pri tipkanju
- **Izračuna** in prikaže skupni čas ob zaključku citata
Ustvarimo igro in se naučimo o dogodkih!
### Struktura datotek
Preden začnemo s kodiranjem, naj se uredimo! Imamo čisto strukturo datotek že od začetka, s čimer si kasneje prihranimo preglavice in naredimo projekt bolj profesionalen. 😊
Ohranili bomo stvari preproste z le tremi datotekami: `index.html` za strukturo strani, `script.js` za vso logiko igre in `style.css` za lep videz. 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 ali macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Tukaj je, kaj ti ukazi naredijo:**
- **Ustvarijo** novo mapo imenovano `typing-game` za vaše projektne datoteke
- **Samodejno** preidejo v pravkar ustvarjeno mapo
- **Pripravijo** č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či** dostop do vseh razvojnih orodij, 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 videz in oblikovanje
## Ustvarite uporabniški vmesnik
Zgradimo oder, na katerem se bo odvijala vsebina naše igre! Pomislite nanj kot na nadzorno ploščo vesoljske ladje - poskrbeti moramo, da je vse, kar igralci potrebujejo, točno tam, kjer to pričakujejo.
Ugotovimo, kaj naša igra pravzaprav potrebuje. Če bi igrali igro tipkanja, kaj bi želeli videti na zaslonu? Tukaj je, kaj bomo potrebovali:
| Element UI | Namen | HTML element |
|------------|-------|--------------|
| Prikaz citata | Prikaže besedilo za tipkanje | `
` z `id="quote"` |
| Področje za sporočila | Prikazuje stanje in sporočila o uspehu | `
` z `id="message"` |
| Besedilno polje | Kjer igralci tipkajo citat | `` z `id="typed-value"` |
| Gumb za začetek | Začne igro | `