# Kreiranje igre pomoću događaja
Jeste li se ikada pitali kako web stranice znaju kada kliknete na gumb ili upišete tekst u okvir? To je čarolija programiranja vođenog događajima! Koji je bolji način za učenje ove ključne vještine nego izradom nečeg korisnog - igre brzog tipkanja koja reagira na svaki vaš pritisak tipke.
Vidjet ćete iz prve ruke kako web preglednici "komuniciraju" s vašim JavaScript kodom. Svaki put kad kliknete, tipkate ili pomičete miš, preglednik šalje male poruke (zovemo ih događaji) vašem kodu, a vi odlučujete kako ćete reagirati!
Do kraja ovog vodiča, izradit ćete pravu igru tipkanja koja prati vašu brzinu i točnost. Još važnije, razumjet ćete osnovne koncepte koji pokreću svaku interaktivnu web stranicu koju ste ikada koristili. Krenimo!
## Kviz prije predavanja
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Programiranje vođeno događajima
Razmislite o svojoj omiljenoj aplikaciji ili web stranici - što je čini živom i responzivnom? Sve se svodi na to kako reagira na vaše radnje! Svaki dodir, klik, povlačenje ili pritisak tipke stvara ono što zovemo "događaj", i tu se događa prava čarolija web razvoja.
Evo što programiranje za web čini tako zanimljivim: nikada ne znamo kada će netko kliknuti taj gumb ili početi tipkati u tekstualni okvir. Možda će kliknuti odmah, čekati pet minuta ili možda nikada neće kliknuti! Ova nepredvidivost znači da moramo razmišljati drugačije o tome kako pišemo svoj kod.
Umjesto da pišemo kod koji se izvršava od vrha do dna poput recepta, pišemo kod koji strpljivo čeka da se nešto dogodi. To je slično kao što su telegrafisti u 1800-ima sjedili uz svoje strojeve, spremni odgovoriti čim poruka stigne putem žice.
Dakle, što je točno "događaj"? Jednostavno rečeno, to je nešto što se događa! Kada kliknete na gumb - to je događaj. Kada upišete slovo - to je događaj. Kada pomaknete miš - to je još jedan događaj.
Programiranje vođeno događajima omogućuje nam da postavimo naš kod da sluša i reagira. Kreiramo posebne funkcije koje se zovu **slušači događaja** i koje strpljivo čekaju da se dogodi nešto specifično, a zatim se aktiviraju kada se to dogodi.
Zamislite slušatelje događaja kao zvono na vratima za vaš kod. Postavite zvono na vratima (`addEventListener()`), kažete mu koji zvuk treba slušati (poput 'klik' ili 'pritisak tipke'), a zatim odredite što bi se trebalo dogoditi kada netko zazvoni (vaša prilagođena funkcija).
**Kako funkcioniraju slušatelji događaja:**
- **Slušaju** specifične radnje korisnika poput klikova, pritisaka tipki ili pomicanja miša
- **Izvršavaju** vaš prilagođeni kod kada se dogodi određeni događaj
- **Reagiraju** odmah na interakcije korisnika, stvarajući besprijekorno iskustvo
- **Rukovode** višestrukim događajima na istom elementu koristeći različite slušatelje
> **NOTE:** Vrijedi istaknuti da postoji mnogo načina za kreiranje slušatelja događaja. Možete koristiti anonimne funkcije ili kreirati imenovane. Možete koristiti razne prečace, poput postavljanja svojstva `click`, ili korištenja `addEventListener()`. U našem zadatku fokusirat ćemo se na `addEventListener()` i anonimne funkcije, jer je to vjerojatno najčešća tehnika koju web programeri koriste. Također je najfleksibilnija, jer `addEventListener()` radi za sve događaje, a ime događaja može se pružiti kao parametar.
### Uobičajeni događaji
Iako web preglednici nude desetke različitih događaja koje možete slušati, većina interaktivnih aplikacija oslanja se na samo nekoliko osnovnih događaja. Razumijevanje ovih ključnih događaja pružit će vam temelj za izgradnju sofisticiranih korisničkih interakcija.
Postoji [desetak događaja](https://developer.mozilla.org/docs/Web/Events) koje možete slušati prilikom kreiranja aplikacije. U osnovi, sve što korisnik radi na stranici pokreće događaj, što vam daje puno moći da osigurate da dobiju željeno iskustvo. Srećom, obično će vam trebati samo nekoliko osnovnih događaja. Evo nekoliko uobičajenih (uključujući dva koja ćemo koristiti pri kreiranju naše igre):
| Događaj | Opis | Uobičajeni slučajevi upotrebe |
|---------|------|-----------------------------|
| `click` | Korisnik je kliknuo na nešto | Gumbi, poveznice, interaktivni elementi |
| `contextmenu` | Korisnik je kliknuo desnom tipkom miša | Prilagođeni izbornici desnog klika |
| `select` | Korisnik je označio neki tekst | Uređivanje teksta, operacije kopiranja |
| `input` | Korisnik je unio neki tekst | Validacija obrazaca, pretraživanje u stvarnom vremenu |
**Razumijevanje ovih vrsta događaja:**
- **Pokreću** se kada korisnici interagiraju s određenim elementima na vašoj stranici
- **Pružaju** detaljne informacije o radnji korisnika putem objekata događaja
- **Omogućuju** stvaranje responzivnih, interaktivnih web aplikacija
- **Funkcioniraju** dosljedno na različitim preglednicima i uređajima
## Kreiranje igre
Sada kada razumijete kako događaji funkcioniraju, primijenimo to znanje u praksi izradom nečeg korisnog. Kreirat ćemo igru brzog tipkanja koja demonstrira rukovanje događajima dok vam pomaže razviti važnu vještinu programiranja.
Izradit ćemo igru kako bismo istražili kako događaji funkcioniraju u JavaScriptu. Naša igra testirat će vještinu tipkanja igrača, što je jedna od najpodcjenjenijih vještina koju bi svi programeri trebali imati. Zanimljivost: raspored tipkovnice QWERTY koji danas koristimo zapravo je dizajniran 1870-ih za pisaće strojeve - a dobre vještine tipkanja i dalje su jednako vrijedne za programere danas! Opći tijek igre izgledat će ovako:
```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 će naša igra funkcionirati:**
- **Počinje** kada igrač klikne gumb za početak i prikazuje nasumični citat
- **Prati** napredak igrača u tipkanju riječ po riječ u stvarnom vremenu
- **Ističe** trenutnu riječ kako bi usmjerio fokus igrača
- **Pruža** trenutnu vizualnu povratnu informaciju za greške u tipkanju
- **Izračunava** i prikazuje ukupno vrijeme kada je citat dovršen
Krenimo s izradom naše igre i učenjem o događajima!
### Struktura datoteka
Prije nego što počnemo kodirati, organizirajmo se! Imati čistu strukturu datoteka od početka uštedjet će vam glavobolje kasnije i učiniti vaš projekt profesionalnijim. 😊
Zadržat ćemo stvari jednostavnima s samo tri datoteke: `index.html` za strukturu stranice, `script.js` za svu logiku igre i `style.css` kako bi sve izgledalo sjajno. Ovo je klasična trojka koja pokreće većinu weba!
**Kreirajte novu mapu za svoj rad otvaranjem konzole ili terminala i izdavanjem sljedeće naredbe:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Što ove naredbe rade:**
- **Kreiraju** novi direktorij nazvan `typing-game` za vaše projektne datoteke
- **Navigiraju** automatski u novokreirani direktorij
- **Postavljaju** čisto radno okruženje za razvoj vaše igre
**Otvorite Visual Studio Code:**
```bash
code .
```
**Ova naredba:**
- **Pokreće** Visual Studio Code u trenutnom direktoriju
- **Otvara** vašu projektnu mapu u uređivaču
- **Omogućuje** pristup svim alatima za razvoj koji su vam potrebni
**Dodajte tri datoteke u mapu u Visual Studio Code s sljedećim nazivima:**
- `index.html` - Sadrži strukturu i sadržaj vaše igre
- `script.js` - Rukuje svom logikom igre i slušateljima događaja
- `style.css` - Definira vizualni izgled i stilizaciju
## Kreiranje korisničkog sučelja
Sada izgradimo pozornicu na kojoj će se odvijati sva akcija naše igre! Zamislite ovo kao dizajniranje kontrolne ploče za svemirski brod - moramo osigurati da je sve što naši igrači trebaju točno tamo gdje to očekuju.
Razmislimo što naša igra zapravo treba. Da igrate igru tipkanja, što biste željeli vidjeti na ekranu? Evo što ćemo trebati:
| Element sučelja | Svrha | HTML element |
|------------------|-------|--------------|
| Prikaz citata | Prikazuje tekst za tipkanje | `
` s `id="quote"` |
| Područje poruka | Prikazuje status i poruke o uspjehu | `
` s `id="message"` |
| Tekstualni unos | Mjesto gdje igrači upisuju citat | `` s `id="typed-value"` |
| Gumb za početak | Započinje igru | `