# Játék készítése események segítségével
Gondolkodtál már azon, hogyan tudják a weboldalak, hogy mikor kattintasz egy gombra vagy írsz egy szövegdobozba? Ez az eseményvezérelt programozás varázsa! Mi lenne, ha ezt az alapvető készséget egy hasznos dolog építésével tanulnád meg – egy gépelési sebesség játékot, amely reagál minden billentyűleütésedre.
Első kézből fogod látni, hogyan "beszélnek" a webböngészők a JavaScript kódoddal. Minden alkalommal, amikor kattintasz, gépelsz vagy mozgatod az egeret, a böngésző apró üzeneteket küld (ezeket eseményeknek nevezzük) a kódodnak, és te döntöd el, hogyan reagálj rájuk!
Mire végeztünk, egy valódi gépelési játékot fogsz létrehozni, amely nyomon követi a sebességedet és pontosságodat. Ennél is fontosabb, hogy megérted az alapvető koncepciókat, amelyek minden interaktív weboldalt működtetnek, amit valaha használtál. Merüljünk el benne!
## Előadás előtti kvíz
[Előadás előtti kvíz](https://ff-quizzes.netlify.app/web/quiz/21)
## Eseményvezérelt programozás
Gondolj a kedvenc alkalmazásodra vagy weboldaladra – mi teszi élővé és reszponzívvá? Az, ahogyan reagál arra, amit csinálsz! Minden érintés, kattintás, húzás vagy billentyűleütés egy "eseményt" hoz létre, és itt történik a webfejlesztés igazi varázsa.
Ami a webes programozást igazán érdekessé teszi, az az, hogy sosem tudjuk, mikor kattint valaki arra a gombra, vagy kezd el gépelni egy szövegdobozba. Lehet, hogy azonnal kattint, vár öt percet, vagy soha nem kattint! Ez a kiszámíthatatlanság azt jelenti, hogy másképp kell gondolkodnunk arról, hogyan írjuk meg a kódunkat.
Ahelyett, hogy olyan kódot írnánk, amely receptként felülről lefelé fut, olyan kódot írunk, amely türelmesen vár, hogy valami történjen. Ez hasonló ahhoz, ahogyan a 1800-as években a távírókezelők ültek a gépeik mellett, készen arra, hogy válaszoljanak, amint egy üzenet érkezett a dróton.
Tehát mi is pontosan az "esemény"? Egyszerűen fogalmazva, ez valami, ami történik! Amikor kattintasz egy gombra – az egy esemény. Amikor beírsz egy betűt – az egy esemény. Amikor mozgatod az egeret – az egy másik esemény.
Az eseményvezérelt programozás lehetővé teszi, hogy a kódunk hallgasson és reagáljon. Különleges funkciókat hozunk létre, amelyeket **eseményfigyelőknek** nevezünk, amelyek türelmesen várnak bizonyos dolgok megtörténésére, majd akcióba lépnek, amikor ezek bekövetkeznek.
Gondolj az eseményfigyelőkre úgy, mint egy csengőre a kódod számára. Beállítod a csengőt (`addEventListener()`), megmondod neki, milyen hangot hallgasson (például 'click' vagy 'keypress'), majd meghatározod, mi történjen, amikor valaki megnyomja (a saját funkciódat).
**Így működnek az eseményfigyelők:**
- **Figyelnek** bizonyos felhasználói műveletekre, mint kattintások, billentyűleütések vagy egérmozgások
- **Végrehajtják** a saját kódodat, amikor a megadott esemény bekövetkezik
- **Azonnal reagálnak** a felhasználói interakciókra, zökkenőmentes élményt teremtve
- **Kezelnek** több eseményt ugyanazon az elemen különböző figyelők segítségével
> **NOTE:** Érdemes kiemelni, hogy számos módja van eseményfigyelők létrehozásának. Használhatsz névtelen függvényeket, vagy létrehozhatsz névvel ellátottakat. Használhatsz különböző rövidítéseket, például a `click` tulajdonság beállítását, vagy az `addEventListener()` használatát. A gyakorlatban az `addEventListener()`-re és névtelen függvényekre fogunk koncentrálni, mivel ez a webfejlesztők által leggyakrabban használt technika. Ez a legflexibilisebb is, mivel az `addEventListener()` minden eseményhez működik, és az esemény neve paraméterként megadható.
### Gyakori események
Bár a webböngészők tucatnyi különböző eseményt kínálnak, amelyeket figyelhetsz, a legtöbb interaktív alkalmazás csak néhány alapvető eseményre támaszkodik. Ezeknek az alapvető eseményeknek a megértése lehetővé teszi, hogy kifinomult felhasználói interakciókat építs.
[Számos esemény](https://developer.mozilla.org/docs/Web/Events) áll rendelkezésedre, amelyeket figyelhetsz, amikor alkalmazást hozol létre. Alapvetően bármi, amit a felhasználó egy oldalon csinál, eseményt vált ki, ami nagy hatalmat ad neked, hogy biztosítsd a kívánt élményt. Szerencsére általában csak egy kis maroknyi eseményre van szükséged. Íme néhány gyakori (beleértve azt a kettőt, amelyet a játékunk létrehozásakor használni fogunk):
| Esemény | Leírás | Gyakori felhasználási esetek |
|--------|--------|-----------------------------|
| `click` | A felhasználó valamire kattintott | Gombok, linkek, interaktív elemek |
| `contextmenu` | A felhasználó jobb egérgombbal kattintott | Egyedi jobb kattintásos menük |
| `select` | A felhasználó kijelölt egy szöveget | Szövegszerkesztés, másolási műveletek |
| `input` | A felhasználó szöveget írt be | Űrlapellenőrzés, valós idejű keresés |
**Ezeknek az eseménytípusoknak a megértése:**
- **Kiváltódnak**, amikor a felhasználók interakcióba lépnek az oldalad bizonyos elemeivel
- **Részletes információt nyújtanak** a felhasználói műveletről eseményobjektumokon keresztül
- **Lehetővé teszik**, hogy reszponzív, interaktív webalkalmazásokat hozz létre
- **Konzisztensen működnek** különböző böngészőkben és eszközökön
## A játék elkészítése
Most, hogy megértetted, hogyan működnek az események, tegyük próbára ezt a tudást valami hasznos dolog építésével. Készítsünk egy gépelési sebesség játékot, amely bemutatja az eseménykezelést, miközben segít egy fontos fejlesztői készség fejlesztésében.
Egy játékot fogunk készíteni, hogy felfedezzük, hogyan működnek az események a JavaScriptben. A játékunk a játékos gépelési képességét fogja tesztelni, ami az egyik leginkább alábecsült készség, amelyet minden fejlesztőnek érdemes elsajátítania. Érdekesség: a ma használt QWERTY billentyűzetkiosztást valójában az 1870-es években tervezték írógépekhez – és a jó gépelési készségek ma is ugyanolyan értékesek a programozók számára! A játék általános menete így fog kinézni:
```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
```
**Így fog működni a játékunk:**
- **Elindul**, amikor a játékos rákattint az indítás gombra, és megjelenít egy véletlenszerű idézetet
- **Nyomon követi** a játékos gépelési előrehaladását szó szerint valós időben
- **Kiemeli** az aktuális szót, hogy irányítsa a játékos figyelmét
- **Azonnali vizuális visszajelzést ad** a gépelési hibákról
- **Kiszámítja** és megjeleníti az összes időt, amikor az idézet befejeződik
Építsük meg a játékunkat, és tanuljunk az eseményekről!
### Fájlstruktúra
Mielőtt elkezdenénk kódolni, szerveződjünk! Ha már az elején tiszta fájlstruktúrát hozol létre, az később megkímél a fejfájástól, és professzionálisabbá teszi a projektedet. 😊
Egyszerűen fogjuk tartani, csak három fájllal: `index.html` az oldal struktúrájához, `script.js` az összes játéklogikához, és `style.css`, hogy minden jól nézzen ki. Ez a klasszikus trió, amely a web nagy részét működteti!
**Hozz létre egy új mappát a munkádhoz egy konzol vagy terminál ablak megnyitásával, és add ki a következő parancsot:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Ezek a parancsok a következőket teszik:**
- **Létrehoznak** egy új könyvtárat `typing-game` néven a projektfájlok számára
- **Automatikusan belépnek** az újonnan létrehozott könyvtárba
- **Beállítanak** egy tiszta munkaterületet a játékfejlesztéshez
**Nyisd meg a Visual Studio Code-ot:**
```bash
code .
```
**Ez a parancs:**
- **Elindítja** a Visual Studio Code-ot az aktuális könyvtárban
- **Megnyitja** a projektmappádat a szerkesztőben
- **Hozzáférést biztosít** az összes szükséges fejlesztői eszközhöz
**Adj hozzá három fájlt a mappához a Visual Studio Code-ban a következő nevekkel:**
- `index.html` – Tartalmazza a játékod szerkezetét és tartalmát
- `script.js` – Kezeli az összes játéklogikát és eseményfigyelőt
- `style.css` – Meghatározza a vizuális megjelenést és a stílust
## Felhasználói felület létrehozása
Most építsük meg a színpadot, ahol minden játék akció zajlik majd! Gondolj erre úgy, mint egy űrhajó vezérlőpaneljének tervezésére – biztosítanunk kell, hogy minden, amire a játékosoknak szükségük van, ott legyen, ahol számítanak rá.
Gondoljuk át, hogy mit igényel a játékunk. Ha egy gépelési játékot játszanál, mit szeretnél látni a képernyőn? Íme, mire lesz szükségünk:
| UI Elem | Cél | HTML Elem |
|---------|-----|-----------|
| Idézet megjelenítése | Megmutatja a gépelendő szöveget | `
` `id="quote"`-val |
| Üzenet terület | Állapot- és sikerüzeneteket jelenít meg | `
` `id="message"`-val |
| Szövegbevitel | Ahol a játékosok begépelik az idézetet | `` `id="typed-value"`-val |
| Indítás gomb | Elindítja a játékot | `