# Креирање игре помоћу догађаја
Да ли сте се икада запитали како веб сајтови знају када кликнете на дугме или укуцате нешто у текстуално поље? То је магија програмирања управљаног догађајима! Како боље научити ову важну вештину него тако што ћете изградити нешто корисно - игру брзог куцања која реагује на сваки ваш унос.
Почећете да видите из прве руке како веб прегледачи "комуницирају" са вашим JavaScript кодом. Свaki пут када кликнете, укуцате или померите миш, прегледач шаље мале поруке (које зовемо догађаји) вашем коду, а ви одлучујете како да одговорите!
До краја овог упутства направићете праву игру куцања која прати вашу брзину и прецизност. Још важније, разумећете основне концепте који покрећу сваки интерактивни веб сајт који сте икада користили. Хајде да почнемо!
## Квиз пре предавања
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/21)
## Програмирање управљано догађајима
Размислите о вашој омиљеној апликацији или веб сајту - шта га чини живим и одзивним? Све је у томе како реагује на оно што радите! Сваки додир, клик, превлачење прстом или унос карактера ствара оно што зовемо "догађај", и ту се дешава права магија веб развоја.
Ево шта програмирање за веб чини занимљивим: никада не знамо када ће неко кликнути на то дугме или почети да куца у текстуално поље. Можда ће кликнути одмах, сачекати пет минута, или можда никада неће ни кликнути! Ова непредвидивост значи да морамо другачије размишљати о томе како пишемо код.
Уместо да пишемо код који се извршава од врха до дна као рецепт, пишемо код који стрпљиво чека да се нешто деси. То је слично као што су телеграфски оператери у 1800-им годинама седели поред машина, спремни да одговоре чим порука стигне жицом.
Па шта је тачно "догађај"? Једноставно речено, то је нешто што се дешава! Када кликнете на дугме - то је догађај. Када укуцате слово - то је догађај. Када померите миш - то је други догађај.
Програмирање управљано догађајима нам омогућава да поставимо наш код да слуша и реагује. Креирамо посебне функције које зовемо **слушаоци догађаја** (event listeners) које стрпљиво чекају да се нешто конкретно деси, а затим стартују када се то догоди.
Замислите слушаоце догађаја као да имате звонац на вратима за ваш код. Поставите звонце (`addEventListener()`), кажете му који звук да слуша (као 'click' или 'keypress'), а затим дефинишете шта треба да се деси када неко звони (ваша прилагођена функција).
**Ево како слушаоци догађаја функционишу:**
- **Слушају** конкретне корисничке акције као што су кликови, уноси и покрети миша
- **Извршавају** ваш прилагођени код када се наведен догађај догоди
- **Одговарају одмах** на корисничке интеракције, стварајући беспрекорно искуство
- **Обрађују** више догађаја на истом елементу помоћу различитих слушалаца
> **NOTE:** Вредно је напоменути да постоји много начина за креирање слушалаца догађаја. Можете користити анонимне функције или направити именоване. Можете користити различите пречице, као што је постављање `click` својства, или коришћењем `addEventListener()`. У нашој вежби ћемо се фокусирати на `addEventListener()` и анонимне функције, јер је то вероватно најчешћа техника коју веб програмери користе. Такође је најфлексибилнија јер `addEventListener()` ради за све догађаје, а име догађаја може бити прослеђено као параметар.
### Чести догађаји
Иако веб прегледачи нуде десетине различитих догађаја које можете слушати, већина интерактивних апликација се ослања само на неколико основних догађаја. Разумевање ових кључних догађаја даће вам основу за прављење софистицираних корисничких интеракција.
Постоје [десетине догађаја](https://developer.mozilla.org/docs/Web/Events) које можете слушати када креирате апликацију. У основи, све што корисник уради на страници покреће догађај, што вам даје велику моћ да им омогућите желјено искуство. Срећом, обично ће вам требати само мали број догађаја. Ево неколико уобичајених (укључујући два која ћемо користити у креирању наше игре):
| Догађај | Опис | Уобичајени случајеви употребе |
|---------|-------|------------------------------|
| `click` | Корисник је кликнуо нешто | Дуџмићи, линкови, интерактивни елементи |
| `contextmenu` | Корисник је кликнуо десним тастером миша | Прилагођени менији за десни клик |
| `select` | Корисник је издвојио текст | Уређивање текста, операције копирања |
| `input` | Корисник је унео текст | Валидација форми, претрага у реалном времену |
**Разумевање ових типова догађаја:**
- **Активирају се** када корисници интрахују са специфичним елементима на вашој страници
- **Пружају** детаљне информације о корисничкој акцији преко догађајних објеката
- **Омогућавају** вам да креирате реагујуће, интерактивне веб апликације
- **Раде** доследно преко различитих прегледача и уређаја
## Креирање игре
Сада када разумете како догађаји функционишу, хајде да применимо то знање тако што ћемо направити нешто корисно. Направићемо игру брзог куцања која демонстрира обраду догађаја и помаже вам да развијете важну програмерску вештину.
Направићемо игру да истражимо како догађаји раде у ЈаваСкрипту. Наша игра ће тестирати вештину куцања играча, која је једна од најпотцењенијих вештина коју сваки програмер треба да има. Забавна чињеница: распореда тастатуре QWERTY који данас користимо уствари је дизајниран 1870-их година за пишуће машине - и добре вештине куцања су и даље драгоцене за програмере данас! Општи ток игре ће изгледати овако:
```mermaid
flowchart TD
A[Играчи кликне Старт] --> B[Приказује се случајан цитат]
B --> C[Играчи куцају у текст пољу]
C --> D{Реч је завршена?}
D -->|Да| E[Истакни следећу реч]
D -->|Не| F{Да ли је до сада тачно?}
F -->|Да| G[Задржи нормални стил]
F -->|Не| H[Прикажи стил грешке]
E --> I{Цитат је завршен?}
I -->|Не| C
I -->|Да| J[Прикажи поруку о успеху са временом]
G --> C
H --> C
```
**Ево како ће наша игра радити:**
- **Почиње** када играч кликне на дугме старт и приказује насумични цитат
- **Праћује** играчев напредак у куцању реч по реч у реалном времену
- **Истиче** текућу реч да усмери пажњу играча
- **Пружа** одмах визуелне повратне информације о грешкама у куцању
- **Израчунава** и приказује укупно време када се цитат заврши
Хајде да направимо нашу игру и научимо о догађајима!
### Структура фајлова
Пре него што почнемо са кодирањем, хајде да се организујемо! Имање чисту структуру фајлова од почетка ће вам уштедети главобоље касније и учинити ваш пројекат професионалнијим. 😊
Задржаћемо ствари једноставним са само три фајла: `index.html` за структуру странице, `script.js` за сву логику игре и `style.css` да све лепо изгледа. Ово је класични трио који покреће већину веба!
**Направите нову фасциклу за свој рад отварањем конзоле или терминала и извршењем следеће команде:**
```bash
# Линукс или макОС
mkdir typing-game && cd typing-game
# Виндоус
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` - Дефинише визуелни изглед и стилизовање
## Креирање корисничког интерфејса
Сада хајде да направимо бину на којој ће се одвијати сва акција игре! Замислите да дизајнирате контролни панел свемирског брода - морамо осигурати да све што нашим играчима треба буде баш тамо где га очекују.
Хајде да схватимо шта нам игра стварно треба. Да ли бисте играјући игру брзог куцања, шта бисте желели да видите на екрану? Ево шта ћемо морати имати:
| UI Елемент | Сврха | HTML елемент |
|------------|-------|--------------|
| Приказ цитата | Приказује текст за куцање | `
` са `id="quote"` |
| Подручје порука | Приказује поруке статуса и успеха | `
` са `id="message"` |
| Текстуални унос | Где играчи куцају цитат | `` са `id="typed-value"` |
| Дуљме за старт | Започиње игру | `