# Egy játék létrehozása eseményekkel
Gondolkodtál már valaha azon, hogyan tudják a weboldalak, mikor kattintasz egy gombra vagy gépelsz egy szövegdobozba? Ez az eseményvezérelt programozás varázsa! Mi lehet jobb módja ennek az alapvető készségnek az elsajátítására, mint egy hasznos dolog készítése – egy gépelési sebesség játék, amely minden billentyűleütésedre reagál.
Első kézből fogod látni, hogyan „beszélgetnek” a webböngészők a JavaScript kódoddal. Minden kattintás, gépelés vagy egérmozgás alkalmával a böngésző apró üzeneteket (ezeket nevezzük eseményeknek) küld a kódodnak, és te döntheted el, hogyan válaszolsz!
Amikor végeztünk, egy valódi gépelős játékot fogsz készíteni, amely méri a sebességedet és a pontosságodat. Ami még fontosabb, megérted azokat az alapvető fogalmakat, amelyeket minden interaktív weboldal használ, amit valaha használtál. Vágjunk bele!
## 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 reagálóképessé? Minden arról szól, hogyan reagál arra, amit csinálsz! Minden érintés, kattintás, húzás vagy billentyűleütés eseményt hoz létre, és itt történik meg a webfejlesztés valódi varázsa.
Ez teszi a webes programozást különösen érdekessé: soha nem tudhatjuk, mikor kattintanak valakinek arra a gombra vagy kezdi el gépelni egy szövegdobozban. Azonnal kattinthatnak, várhatnak öt percet, vagy talán soha nem is kattintanak! Ez a kiszámíthatatlanság miatt másképp kell gondolkodnunk a kód írásáról.
Ahelyett, hogy a kódot fentről lefelé futó receptként írnánk meg, olyan kódot írunk, ami türelmesen várakozik, hogy valami megtörténjen. Ez hasonló ahhoz, ahogy az 1800-as években a távírógépesek ültek a gépük mellett, készen arra, hogy azonnal reagáljanak, amint üzenet érkezik a dróton keresztül.
De mi is az az „esemény”? Egyszerűen valami, ami történik! Amikor rákattintasz egy gombra – az egy esemény. Amikor beütöd egy betűt – az egy esemény. Amikor mozgatod az egeret – az is egy esemény.
Az eseményvezérelt programozás lehetővé teszi, hogy a kódunk hallgasson és reagáljon. Különleges függvényeket hozunk létre, amelyeket **eseményfigyelőknek** hívunk, és ezek türelmesen várnak, hogy bizonyos dolgok történjenek, majd akcióba lendülnek, amikor megtörténnek.
Gondolj az eseményfigyelőkre úgy, mint egy csengő a kódodhoz. Beállítod a csengőt (`addEventListener()`), megmondod neki, milyen hangot figyeljen (például 'click' vagy 'keypress'), majd megadod, mi történjen, ha valaki megnyomja (a saját függvényed).
**Így működnek az eseményfigyelők:**
- **Hallgatnak** specifikus felhasználói műveletekre, mint kattintás, billentyűleütés vagy egérmozgás
- **Futtatjá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
> **MEGJEGYZÉS:** Érdemes kiemelni, hogy számos módja van eseményfigyelők létrehozásának. Használhatsz névtelen függvényeket, vagy nevezetteket. 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 gyakorlatunkban az `addEventListener()` és névtelen függvények használatára fókuszálunk, mivel ez a leggyakoribb technika a webfejlesztők körében. Ez a legkevésbé kötött módszer, mivel az `addEventListener()` minden eseményre működik, és az esemény nevét paraméterként adhatod meg.
### Gyakori események
Bár a webböngészők több tucat különféle eseményt kínálnak, amelyekre figyelhetsz, a legtöbb interaktív alkalmazás csak néhány alapvető eseményre támaszkodik. Ezeknek az eseményeknek a megértése adja meg az alapokat a bonyolult felhasználói interakciókhoz.
Van [több tucat esemény](https://developer.mozilla.org/docs/Web/Events), amelyeket egy alkalmazás készítésekor hallgathatsz. Gyakorlatilag bármi, amit a felhasználó egy oldalon csinál, eseményt vált ki, ami nagy hatalmat ad arra, hogy biztosítsd számukra a kívánt élményt. Szerencsére általában csak pár eseményre van szükséged. Íme néhány gyakori (köztük az a kettő, amiket a játék készítésekor fogunk használni):
| Esemény | Leírás | Gyakori felhasználási módok |
|---------|--------|-----------------------------|
| `click` | A felhasználó valamire kattintott | Gombok, linkek, interaktív elemek |
| `contextmenu` | A felhasználó a jobb egérgombbal kattintott | Egyedi jobbklikk menük |
| `select` | A felhasználó kijelölt szöveget | Szövegszerkesztés, másolás |
| `input` | A felhasználó szöveget írt be | Űrlap ellenőrzés, valós idejű keresés |
**Ezeknek az eseménytípusoknak a megértése:**
- **Indul** el, amikor a felhasználók adott elemeket érintenek meg az oldalon
- **Részletes információkat szolgáltat** a felhasználói műveletről eseményobjektumokon keresztül
- **Lehetővé teszi** interaktív, reagáló webalkalmazások létrehozását
- **Működik** következetesen különböző böngészőkben és eszközökön
## A játék létrehozása
Most, hogy érted az események működését, tegyük is próbára ezt a tudást egy hasznos dolog elkészítésével. Létrehozunk egy gépelési sebesség játékot, amely bemutatja az eseménykezelést, miközben egy fontos fejlesztői készségedet fejleszti.
Egy játékot fogunk készíteni, hogy megvizsgáljuk az események működését JavaScript-ben. A játékunk egy játékos gépelési tudását fogja tesztelni, ami az egyik alulértékelt készség, amit minden fejlesztőnek érdemes elsajátítania. Érdekesség: a QWERTY billentyűzet-elrendezést, amit ma használunk, az 1870-es években tervezték gépírók számára – é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 néz ki:
```mermaid
flowchart TD
A[Játékos kattint a Start gombra] --> B[Véletlenszerű idézet megjelenik]
B --> C[Játékos begépeli a szövegdobozba]
C --> D{Szó kész?}
D -->|Igen| E[Következő szó kiemelése]
D -->|Nem| F{Eddig helyes?}
F -->|Igen| G[Normál stílus megtartása]
F -->|Nem| H[Hibastílus megjelenítése]
E --> I{Idézet kész?}
I -->|Nem| C
I -->|Igen| J[Sikerüzenet megjelenítése idővel]
G --> C
H --> C
```
**Így fog működni a játékunk:**
- **Elindul**, amikor a játékos rákattint a start gombra, és megjelenik egy véletlenszerű idézet
- **Követi** a játékos gépelési folyamatát szóról szóra, 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ákra
- **Számolja** és megjeleníti az összes eltelt időt, amikor az idézet befejeződik
Készítsük el a játékot, és tanuljunk meg az eseményekről!
### Fájlstruktúra
Mielőtt kódolni kezdenénk, rendezkedjünk be! Ha már az elején tiszta fájlstruktúránk van, az később sok fejfájást megelőz, és profibbá teszi a projektedet. 😊
Egyszerűen tartjuk majd három fájlra: `index.html` a lap szerkezetéhez, `script.js` a játék logikájához, és `style.css` hogy szépen nézzen ki. Ez egy klasszikus trió, ami a legtöbb weboldalt működteti!
**Hozz létre egy új mappát a munkádhoz úgy, hogy nyitsz egy konzolt vagy terminált, és beírod a következő parancsot:**
```bash
# Linux vagy macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Ezeknek a parancsoknak a funkciója:**
- **Létrehoz** egy új `typing-game` nevű könyvtárat a projekt fájljaidnak
- **Belép** automatikusan az újonnan létrehozott könyvtárba
- **Tiszta munkaterületet biztosít** a játék fejlesztéséhez
**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 projekt mappádat a szerkesztőben
- **Hozzáférést ad** az összes fejlesztői eszközhöz, amire szükséged lesz
**Add hozzá a mappához a következő három fájlt Visual Studio Code-ban:**
- `index.html` – tartalmazza a játék szerkezetét és tartalmát
- `script.js` – kezeli az összes játék logikát és eseményfigyelőt
- `style.css` – meghatározza a vizuális megjelenést és stílust
## Felhasználói felület létrehozása
Most építsük meg a színpadot, ahol az egész játék eseménye zajlik majd! Gondolj erre úgy, mint egy űrhajó vezérlőpultjának megtervezésére – biztosnak kell lennünk abban, hogy minden, amire a játékosoknak szükségük van, ott legyen, ahol elvárják.
Határozzuk meg, mire van szüksége a játékunknak. Ha te játszanál egy gépelős játékkal, mit szeretnél látni a képernyőn? Íme, amire szükségünk lesz:
| Felhasználói felület elem | Cél | HTML elem |
|---------------------------|-----|-----------|
| Idézet megjelenítő | Megjeleníti a begépelendő szöveget | `
` az `id="quote"`-tal |
| Üzenet terület | Állapot- és sikerüzeneteket mutat | `
` az `id="message"`-szel |
| Szövegbeviteli mező | Ahol a játékosok begépelik az idézetet | `` az `id="typed-value"`-val |
| Start gomb | Elindítja a játékot | `