# Žaidimo kūrimas naudojant įvykius
Ar kada nors susimąstėte, kaip svetainės žino, kai paspaudžiate mygtuką ar rašote teksto laukelyje? Tai yra įvykių valdomos programavimo magija! Koks geresnis būdas išmokti šį svarbų įgūdį nei sukurti ką nors naudingo – rašymo greičio žaidimą, kuris reaguoja į kiekvieną jūsų paspaustą klavišą.
Jūs pamatysite iš arti, kaip žiniatinklio naršyklės „kalba“ su jūsų JavaScript kodu. Kiekvieną kartą kai paspaudžiate, rašote ar judinate pelę, naršyklė siunčia mažus pranešimus (juos vadiname įvykiais) jūsų kodui, o jūs nusprendžiate, kaip į juos reaguoti!
Kai baigsime, jūs būsite sukūrę tikrą rašymo žaidimą, kuris seka jūsų greitį ir tikslumą. Svarbiau, jūs suprasite pagrindines sąvokas, kurios veikia kiekvieną interaktyvią svetainę, kurią kada nors naudojote. Pradėkime!
## Priešpaskaitos testas
[Priešpaskaitos testas](https://ff-quizzes.netlify.app/web/quiz/21)
## Įvykių valdomas programavimas
Pagalvokite apie savo mėgstamiausią programėlę ar svetainę – kas ją daro gyvą ir jautrią? Viskas priklauso nuo to, kaip ji reaguoja į jūsų veiksmus! Kiekvienas bakstelėjimas, paspaudimas, perbraukimas ar klavišo paspaudimas sukuria tai, ką vadiname „įvykiu“, ir tai yra tikroji interneto kūrimo magija.
Štai kas daro programavimą žiniatinkliui taip įdomų: mes niekada nežinome, kada kas nors paspaus tą mygtuką arba pradės rašyti teksto laukelyje. Jie gali paspausti iš karto, palaukti penkias minutes arba gal niekada nespausti! Šis nenuspėjamumas reiškia, kad turime kitaip mąstyti rašydami savo kodą.
Vietoj to, kad rašytume kodą, kuris veikia iš viršaus į apačią kaip receptas, mes rašome kodą, kuris kantriai laukia, kol kažkas įvyks. Tai panašu į 1800-ųjų telegrafo operatorius, kurie sėdėdavo prie savo mašinų, pasirengę reaguoti, kai tik per laidą ateidavo žinutė.
Tai kas yra „įvykis“? Paprastai sakant, tai kažkas, kas įvyksta! Kai paspaudžiate mygtuką – tai įvykis. Kai įvedate raidę – tai įvykis. Kai judinate pelę – tai dar vienas įvykis.
Įvykių valdomas programavimas leidžia mums nustatyti kodą, kuris klausosi ir reaguoja. Mes kuriame specialias funkcijas, vadinamas **įvykių klausytojais** (event listeners), kurios kantriai laukia tam tikrų dalykų įvykti, o kai jie įvyksta, tuoj pat pradeda veikti.
Pagalvokite apie įvykių klausytojus kaip durų skambutį jūsų kodui. Jūs įrengiate durų skambutį (`addEventListener()`), nurodote, kokio garso klausytis (pvz., „click“ arba „keypress“), o tada apibrėžiate, kas turėtų nutikti, kai kas nors paspaudžia skambutį (jūsų pasirinkta funkcija).
**Kaip veikia įvykių klausytojai:**
- **Klauso** konkrečių vartotojo veiksmų, tokių kaip paspaudimai, klavišo paspaudimai ar pelės judesiai
- **Atlieka** jūsų pasirinktą kodą, kai nurodytas įvykis įvyksta
- **Reaguoja** iš karto į vartotojo sąveikas, sukuriant sklandžią patirtį
- **Aptarnauja** kelis įvykius tame pačiame elemente naudodami skirtingus klausytojus
> **PASTABA:** Svarbu paminėti, kad yra daug būdų sukurti įvykių klausytojus. Galite naudoti anonimines funkcijas arba sukurti pavadintas. Galite naudoti įvairias trumpesnes formas, pavyzdžiui, nustatyti `click` savybę ar naudoti `addEventListener()`. Mūsų pratime sutelksime dėmesį į `addEventListener()` ir anoniminias funkcijas, nes tai tikriausiai pati dažniausia technika, kurią naudoja interneto kūrėjai. Taip pat tai pati lankščiausia, nes `addEventListener()` veikia su visais įvykiais, o įvykio pavadinimas gali būti pateiktas kaip parametras.
### Įprasti įvykiai
Nors interneto naršyklės siūlo dešimtis skirtingų įvykių, kuriuos galite klausytis, dauguma interaktyvių programėlių remiasi vos keliais pagrindiniais įvykiais. Šių pagrindinių įvykių supratimas suteiks pagrindą kurti sudėtingas vartotojo sąveikas.
Yra [dešimtys įvykių](https://developer.mozilla.org/docs/Web/Events), kuriuos galite naudoti kurdami programėlę. Iš esmės bet koks vartotojo veiksmas puslapyje sukuria įvykį, kuris suteikia jums daug galios užtikrinti pageidaujamą vartotojo patirtį. Laimei, paprastai jums reikės tik kelių įvykių. Štai keletas įprastų (įskaitant du, kuriuos naudosime kurdami žaidimą):
| Įvykis | Aprašymas | Dažniausios naudojimo sritys |
|--------|-----------|------------------------------|
| `click` | Vartotojas paspaudė kažką | Mygtukai, nuorodos, interaktyvūs elementai |
| `contextmenu` | Vartotojas paspaudė dešinį pelės mygtuką | Adaptuotos dešinio pelės mygtuko meniu |
| `select` | Vartotojas pažymėjo tekstą | Teksto redagavimas, kopijavimo operacijos |
| `input` | Vartotojas įvedė tekstą | Formų validacija, realaus laiko paieška |
**Šių įvykių tipų supratimas:**
- **Sukelia veiksmą**, kai vartotojas sąveikauja su specifiniais jūsų puslapio elementais
- **Teikia** išsamią informaciją apie vartotojo veiksmą per įvykių objektus
- **Leidžia** kurti jautrias, interaktyvias interneto programėles
- **Veikia** nuosekliai įvairiose naršyklėse ir įrenginiuose
## Žaidimo kūrimas
Dabar, kai suprantate, kaip veikia įvykiai, panaudosime šias žinias praktiškai kurdami ką nors naudingo. Mes sukursime rašymo greičio žaidimą, kuris demonstruoja įvykių tvarkymą, tuo pačiu padėdamas jums įgyti svarbų programuotojo įgūdį.
Kursime žaidimą, kad ištirtume, kaip veikia įvykiai JavaScripte. Mūsų žaidimas patikrins žaidėjo rašymo įgūdžius, kurie yra vieni iš mažiausiai vertinamų įgūdžių, kuriuos turėtų turėti visi programuotojai. Įdomu: QWERTY klaviatūros išdėstymas, kurį naudojame šiandien, iš tiesų buvo sukurta 1870-aisiais rašomosioms mašinėlėms – ir geri rašymo įgūdžiai vis dar yra labai vertingi programuotojams! Žaidimo pagrindinė eiga atrodys taip:
```mermaid
flowchart TD
A[Žaidėjas spaudžia Pradėti] --> B[Atsitiktinis citatos rodymas]
B --> C[Žaidėjas rašo į lauką]
C --> D{Žodis baigtas?}
D -->|Taip| E[Paryškinti kitą žodį]
D -->|Ne| F{Iki šiol teisinga?}
F -->|Taip| G[Palikti įprastą stilių]
F -->|Ne| H[Rodyti klaidos stilių]
E --> I{Citata baigta?}
I -->|Ne| C
I -->|Taip| J[Rodyti sėkmės pranešimą su laiku]
G --> C
H --> C
```
**Kaip veiks mūsų žaidimas:**
- **Prasideda**, kai žaidėjas paspaudžia pradžios mygtuką ir parodomas atsitiktinis citatos tekstas
- **Sekamas** žaidėjo rašymo progresas žodis po žodžio realiuoju laiku
- **Pažymimas** dabartinis žodis, kad žaidėjas galėtų susikaupti
- **Teikiama** momentinė vizualinė grįžtamoji informacija apie rašymo klaidas
- **Skaičiuojamas** ir rodomas bendras laikas, kai citata yra parašyta
Sukurkime mūsų žaidimą ir sužinokime apie įvykius!
### Failų struktūra
Prieš pradėdami rašyti kodą, susitvarkykime! Aiški failų struktūra nuo pat pradžių jums sutaupys galvos skausmo vėliau ir padarys jūsų projektą profesionalesnį. 😊
Mes laikysimės paprastumo ir turėsime tik tris failus: `index.html` puslapio struktūrai, `script.js` visai žaidimo logikai bei `style.css` visam stiliaus aprašymui. Tai klasikinė trio, kuris varo didžiąją dalį interneto!
**Sukurkite naują aplanką savo darbui atidarydami konsolę arba terminalą ir įveskite šią komandą:**
```bash
# Linux arba macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Štai ką daro šios komandos:**
- **Sukuria** naują katalogą `typing-game` jūsų projekto failams
- **Automatiškai pereina** į naujai sukurtą katalogą
- **Sukuria** švarią darbo erdvę žaidimo kūrimui
**Atidarykite Visual Studio Code:**
```bash
code .
```
**Ši komanda:**
- **Paleidžia** Visual Studio Code dabartiniame kataloge
- **Atidaro** jūsų projekto aplanką redaktoriuje
- **Suteikia** prieigą prie visų kūrimo įrankių, kurių jums reikės
**Pridėkite tris failus į aplanką Visual Studio Code su šiais pavadinimais:**
- `index.html` – žaidimo struktūra ir turinys
- `script.js` – visa žaidimo logika ir įvykių klausytojai
- `style.css` – išvaizdos ir stiliaus aprašymas
## Vartotojo sąsajos kūrimas
Dabar sukurkime sceną, kur vyks visas mūsų žaidimo veiksmas! Galvokite apie tai kaip apie erdvėlaivio valdymo pulto dizainą – turime užtikrinti, kad žaidėjams reikalingi dalykai būtų ten, kur jie tikisi.
Išnagrinėkime, ko mūsų žaidimui tikrai reikia. Jei žaistumėte rašymo žaidimą, ką norėtumėte matyti ekrane? Štai ko reikės:
| Sąsajos elementas | Paskirtis | HTML elementas |
|-------------------|-----------|---------------|
| Citatos rodymas | Rodo tekstą, kurį reikia įvesti | `
` su `id="quote"` |
| Pranešimų zona | Rodo būsenos ir sėkmės pranešimus | `
` su `id="message"` |
| Teksto įvedimas | Kur žaidėjai rašo citatą | `` su `id="typed-value"` |
| Pradžios mygtukas | Pradeda žaidimą | `