# Izrada igre pomoću događaja
Jeste li se ikada zapitali kako web stranice znaju kada kliknete na gumb ili upišete nešto u tekstni okvir? To je čarolija programiranja vođenog događajima! Koji je bolji način za naučiti ovu osnovnu vještinu nego izgraditi nešto korisno - igru brzine tipkanja koja reagira na svaki pritisak tipke.
Uvidjet ćete iz prve ruke kako web preglednici "komuniciraju" s vašim JavaScript kodom. Svaki put kada kliknete, tipkate ili pomaknete miša, preglednik šalje male poruke (zovemo ih događaji) vašem kodu i vi odlučujete kako na njih odgovoriti!
Do kraja ovog vodiča izgradit ćete pravu igru tipkanja koja prati vašu brzinu i točnost. Još važnije, razumjet ćete temeljne koncepte koji pokreću svaku interaktivnu web stranicu koju ste ikada koristili. Krenimo!
## Pred-predavanje kviz
[Pred-predavanje kviz](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 način na koji reagira na ono što radite! Svaki dodir, klik, klizanje prstom ili pritisak tipke stvara ono što zovemo "događaj", i tu se događa prava čarolija razvoja weba.
Ono što programiranje za web čini tako zanimljivim jest to što nikada ne znamo kada će netko kliknuti gumb ili početi tipkati u tekstni okvir. Mogu kliknuti odmah, pričekati pet minuta ili možda nikada ne kliknuti! Ova nepredvidivost znači da moramo drukčije razmišljati o pisanju koda.
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 kraj svojih uređaja, spremni odgovoriti u trenutku kada poruka stigne žicom.
Pa, što je zapravo "događaj"? Jednostavno rečeno, to je nešto što se dogodi! Kada kliknete gumb - to je događaj. Kad upišete slovo - to je događaj. Kada pomaknete miša - to je još jedan događaj.
Programiranje vođeno događajima omogućuje nam da postavimo naš kod da sluša i odgovara. Kreiramo posebne funkcije zvane **slušatelji događaja** koji strpljivo čekaju da se dogode određene stvari, a onda brzo reagiraju.
Slušatelje događaja možete zamisliti kao zvono na vratima za vaš kod. Postavite zvono (`addEventListener()`), kažete mu koji zvuk da sluša (kao 'click' ili 'keypress'), a zatim odredite što treba napraviti kada netko zvoni (vaša prilagođena funkcija).
**Evo kako slušatelji događaja funkcioniraju:**
- **Slušaju** određene korisničke radnje poput klikova, pritisaka tipki ili pokreta miša
- **Izvršavaju** vaš prilagođeni kod kada se dogodi navedeni događaj
- **Odgovaraju** odmah na korisničke interakcije, stvarajući besprijekorno iskustvo
- **Rukovode** s više događaja na istom elementu koristeći različite slušatelje
> **NAPOMENA:** 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šoj vježbi 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 proslijediti kao parametar.
### Uobičajeni događaji
Iako web preglednici nude desetke različitih događaja na koje možete reagirati, većina interaktivnih aplikacija oslanja se samo na nekoliko osnovnih događaja. Razumijevanje ovih osnovnih događaja pružit će vam temelj za izradu složenih korisničkih interakcija.
Postoji [desetke događaja](https://developer.mozilla.org/docs/Web/Events) na koje možete slušati prilikom izrade aplikacije. U osnovi, sve što korisnik učini na stranici izaziva događaj, što vam daje mnogo moći da osigurate željeno iskustvo. Srećom, obično vam treba samo mali broj događaja. Evo nekoliko uobičajenih (uključujući dva koja ćemo koristiti za izradu naše igre):
| Događaj | Opis | Uobičajeni slučajevi uporabe |
|---------|-------|------------------------------|
| `click` | Korisnik je kliknuo nešto | Gumbi, linkovi, interaktivni elementi |
| `contextmenu` | Korisnik je kliknuo desnom tipkom miša | Prilagođeni desni klik izbornici |
| `select` | Korisnik je označio neki tekst | Uređivanje teksta, kopiranje |
| `input` | Korisnik je unio neki tekst | Validacija formi, pretraživanje u stvarnom vremenu |
**Razumijevanje ovih tipova događaja:**
- **Pokreću se** kada se korisnici interakcijom odnose na određene elemente na vašoj stranici
- **Pružaju** detaljne informacije o korisničkoj radnji putem objekata događaja
- **Omogućuju** kreiranje responzivnih, interaktivnih web aplikacija
- **Rade** dosljedno preko različitih preglednika i uređaja
## Izrada igre
Sada kada razumijete kako događaji funkcioniraju, primijenimo to znanje kroz izradu nečeg korisnog. Kreirat ćemo igru brzine tipkanja koja demonstrira upravljanje događajima dok vam pomaže razviti važnu developersku vještinu.
Izradit ćemo igru kako bismo istražili kako događaji rade u JavaScriptu. Naša igra testirat će sposobnost tipkanja igrača, što je jedna od najpotcjenjenijih vještina koje svi developeri trebaju imati. Zanimljivost: raspored tipkovnice QWERTY kojeg danas koristimo zapravo je dizajniran 1870-ih za pisaće strojeve - a dobre vještine tipkanja još su uvijek jednako vrijedne za programere danas! Opći tijek igre bit će ovakav:
```mermaid
flowchart TD
A[Igrač klikne Start] --> B[Prikazuje se slučajna izreka]
B --> C[Igrač upisuje u tekstualno polje]
C --> D{Riječ završena?}
D -->|Da| E[Istakni sljedeću riječ]
D -->|Ne| F{Ispravno do sada?}
F -->|Da| G[Zadrži normalan stil]
F -->|Ne| H[Prikaži stil greške]
E --> I{Izreka završena?}
I -->|Ne| C
I -->|Da| J[Prikaži poruku uspjeha s vremenom]
G --> C
H --> C
```
**Evo kako će naša igra funkcionirati:**
- **Počinje** kada igrač klikne gumb za start i prikaže se nasumični citat
- **Prati** igračev napredak u tipkanju riječ po riječ u stvarnom vremenu
- **Ističe** trenutnu riječ kako bi usmjerila igračevu pažnju
- **Pruža** trenutne vizualne povratne informacije za pogreške u tipkanju
- **Izračunava** i prikazuje ukupno vrijeme po završetku citata
Izgradimo našu igru i naučimo o događajima!
### Struktura datoteka
Prije nego što započnemo s kodiranjem, organizirajmo se! Imati čist raspored datoteka od početka uštedjet će vam glavobolje kasnije i učiniti vaš projekt profesionalnijim. 😊
Držat ćemo se jednostavnog pristupa sa samo tri datoteke: `index.html` za strukturu stranice, `script.js` za svu logiku igre i `style.css` da sve izgleda lijepo. Ovo je klasični trio koji pokreće većinu weba!
**Stvorite novi direktorij za vaš rad otvaranjem konzole ili terminala i izvršavanjem sljedeće naredbe:**
```bash
# Linux ili macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Evo što ove naredbe rade:**
- **Stvara** novi direktorij nazvan `typing-game` za vaše projektne datoteke
- **Automatski** ulazi u novo kreirani direktorij
- **Postavlja** čist radni prostor za razvoj vaše igre
**Otvorite Visual Studio Code:**
```bash
code .
```
**Ova naredba:**
- **Pokreće** Visual Studio Code u trenutnoj mapi
- **Otvara** vašu projekt mapu u uređivaču
- **Pruža** pristup svim alatima za razvoj koji će vam trebati
**Dodajte tri datoteke u mapu u Visual Studio Code s ovim imenima:**
- `index.html` - Sadrži strukturu i sadržaj vaše igre
- `script.js` - Rukuje svojom logikom igre i slušateljima događaja
- `style.css` - Definira vizualni izgled i stilizaciju
## Kreirajte korisničko sučelje
Sad izgradimo pozornicu na kojoj će se odvijati cijela akcija igre! Zamislite to kao dizajniranje kontrolne ploče za svemirski brod - moramo osigurati da je sve što igračima treba upravo tamo gdje očekuju.
Razmotrimo što naša igra stvarno treba. Kada biste igrali igru tipkanja, što biste željeli vidjeti na ekranu? Evo što ćemo trebati:
| UI Element | Svrha | HTML Element |
|------------|--------|--------------|
| Prikaz citata | Prikazuje tekst koji treba upisati | `
` s `id="quote"` |
| Područje poruke | Prikazuje status i poruke uspjeha | `
` s `id="message"` |
| Tekstni unos | Gdje igrači tipkaju citat | `` s `id="typed-value"` |
| Gumb za start | Pokreće igru | `