# Прављење игре уз помоћ догађаја
Да ли сте се икада запитали како веб-сајтови знају када кликнете на дугме или унесете текст у текстуално поље? То је магија програмирања заснованог на догађајима! Шта је бољи начин да научите ову суштинску вештину него креирањем нечега корисног - игре за брзо куцање која реагује на сваки ваш притисак тастера.
Имаћете прилику да из прве руке видите како веб-претраживачи "комуницирају" са вашим JavaScript кодом. Сваки пут када кликнете, куцате или померите миш, претраживач шаље мале поруке (које називамо догађајима) вашем коду, а ви одлучујете како да реагујете!
Када завршимо, направићете праву игру за куцање која прати вашу брзину и тачност. Још важније, разумећете основне концепте који покрећу сваки интерактивни веб-сајт који сте икада користили. Хајде да почнемо!
## Квиз пре предавања
[Квиз пре предавања](https://ff-quizzes.netlify.app/web/quiz/21)
## Програмирање засновано на догађајима
Размислите о вашој омиљеној апликацији или веб-сајту - шта их чини живим и одзивним? Све је у томе како реагују на оно што радите! Сваки додир, клик, превлачење или притисак тастера ствара оно што називамо "догађајем", и ту се дешава права магија веб-развоја.
Ево шта програмирање за веб чини тако занимљивим: никада не знамо када ће неко кликнути на то дугме или почети да куца у текстуално поље. Можда ће кликнути одмах, чекати пет минута или можда никада неће кликнути! Ова непредвидивост значи да морамо другачије размишљати о томе како пишемо наш код.
Уместо да пишемо код који се извршава одозго на доле као рецепт, пишемо код који стрпљиво чека да се нешто догоди. То је слично као што су оператери телеграфа у 19. веку седели поред својих машина, спремни да реагују чим стигне порука преко жице.
Па шта је тачно "догађај"? Једноставно речено, то је нешто што се догоди! Када кликнете на дугме - то је догађај. Када укуцате слово - то је догађај. Када померите миш - то је још један догађај.
Програмирање засновано на догађајима нам омогућава да подесимо наш код да слуша и реагује. Креирамо посебне функције које називамо **слушаоци догађаја** које стрпљиво чекају да се догоди нешто специфично, а затим реагују када се то догоди.
Замислите слушаоце догађаја као звона на вратима за ваш код. Поставите звоно (`addEventListener()`), кажете му који звук да слуша (као што је 'клик' или 'притисак тастера'), а затим одредите шта треба да се догоди када неко позвони (ваша прилагођена функција).
**Како функционишу слушаоци догађаја:**
- **Слушају** одређене корисничке акције као што су кликови, притисци тастера или покрети миша
- **Извршавају** ваш прилагођени код када се догоди одређени догађај
- **Реагују** одмах на интеракције корисника, стварајући беспрекорно искуство
- **Обрађују** више догађаја на истом елементу користећи различите слушаоце
> **NOTE:** Вреди нагласити да постоји много начина за креирање слушалаца догађаја. Можете користити анонимне функције или креирати именоване. Можете користити разне пречице, као што је постављање `click` својства, или коришћење `addEventListener()`. У нашем задатку ћемо се фокусирати на `addEventListener()` и анонимне функције, јер је то вероватно најчешћа техника коју веб-развојни програмери користе. Такође је најфлексибилнија, јер `addEventListener()` ради за све догађаје, а име догађаја може бити обезбеђено као параметар.
### Уобичајени догађаји
Иако веб-претраживачи нуде десетине различитих догађаја које можете слушати, већина интерактивних апликација се ослања на само неколико основних догађаја. Разумевање ових основних догађаја ће вам дати темељ за изградњу софистицираних корисничких интеракција.
Постоје [десетине догађаја](https://developer.mozilla.org/docs/Web/Events) које можете слушати приликом креирања апликације. У основи, све што корисник уради на страници изазива догађај, што вам даје много моћи да осигурате да добију искуство које желите. Срећом, обично ће вам бити потребно само неколико основних догађаја. Ево неколико уобичајених (укључујући два која ћемо користити приликом креирања наше игре):
| Догађај | Опис | Уобичајени случајеви употребе |
|---------|------|-----------------------------|
| `click` | Корисник је кликнуо на нешто | Дугмад, линкови, интерактивни елементи |
| `contextmenu` | Корисник је кликнуо десним тастером миша | Прилагођени менији десног клика |
| `select` | Корисник је означио део текста | Уређивање текста, операције копирања |
| `input` | Корисник је унео текст | Валидација формулара, претрага у реалном времену |
**Разумевање ових типова догађаја:**
- **Активирају се** када корисници интерагују са одређеним елементима на вашој страници
- **Пружају** детаљне информације о акцији корисника кроз објекте догађаја
- **Омогућавају** креирање одзивних, интерактивних веб-апликација
- **Раде** конзистентно на различитим претраживачима и уређајима
## Креирање игре
Сада када разумете како догађаји функционишу, хајде да то знање применимо у пракси креирањем нечега корисног. Направићемо игру за брзо куцање која демонстрира обраду догађаја, а истовремено вам помаже да развијете важну вештину програмера.
Креираћемо игру како бисмо истражили како догађаји функционишу у JavaScript-у. Наша игра ће тестирати вештину куцања играча, што је једна од најпотцењенијих вештина коју би сви програмери требало да имају. Занимљива чињеница: распоред тастатуре QWERTY који данас користимо заправо је дизајниран 1870-их за писаће машине - а добре вештине куцања су и данас једнако вредне за програмере! Општи ток игре изгледаће овако:
```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
```
**Како ће наша игра функционисати:**
- **Почиње** када играч кликне на дугме за почетак и приказује насумични цитат
- **Праћење** напретка куцања играча реч по реч у реалном времену
- **Истиче** тренутну реч како би усмерила пажњу играча
- **Пружа** тренутне визуелне повратне информације о грешкама у куцању
- **Рачуна** и приказује укупно време када се цитат заврши
Хајде да направимо нашу игру и научимо о догађајима!
### Структура фајлова
Пре него што почнемо са кодирањем, хајде да се организујемо! Имање чисте структуре фајлова од самог почетка ће вам уштедети главобоље касније и учинити ваш пројекат професионалнијим. 😊
Држаћемо ствари једноставним са само три фајла: `index.html` за структуру странице, `script.js` за сву логику игре и `style.css` да све изгледа лепо. Ово је класична тројка која покреће већину веба!
**Креирајте нови фолдер за ваш рад отварањем конзоле или терминала и унесите следећу команду:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Шта ове команде раде:**
- **Креирају** нови директоријум назван `typing-game` за ваше пројектне фајлове
- **Прелазе** у новокреирани директоријум аутоматски
- **Постављају** чисто радно окружење за развој ваше игре
**Отворите Visual Studio Code:**
```bash
code .
```
**Ова команда:**
- **Покреће** Visual Studio Code у тренутном директоријуму
- **Отвара** ваш пројектни фолдер у едитору
- **Пружа** приступ свим алатима за развој који су вам потребни
**Додајте три фајла у фолдер у Visual Studio Code са следећим именима:**
- `index.html` - Садржи структуру и садржај ваше игре
- `script.js` - Обрађује сву логику игре и слушаоце догађаја
- `style.css` - Дефинише визуелни изглед и стил
## Креирање корисничког интерфејса
Сада хајде да изградимо сцену на којој ће се одвијати сва акција наше игре! Замислите ово као дизајнирање контролне табле за свемирски брод - морамо осигурати да све што је потребно нашим играчима буде тамо где очекују.
Хајде да схватимо шта је заправо потребно нашој игри. Да сте играли игру за куцање, шта бисте желели да видите на екрану? Ево шта нам је потребно:
| Елемент интерфејса | Сврха | HTML Елемент |
|--------------------|-------|-------------|
| Приказ цитата | Приказује текст за куцање | `
` са `id="quote"` |
| Област порука | Приказује статус и поруке о успеху | `
` са `id="message"` |
| Унос текста | Место где играчи куцају цитат | `` са `id="typed-value"` |
| Дугме за почетак | Започиње игру | `