# Tworzenie gry z wykorzystaniem zdarzeń
Czy kiedykolwiek zastanawiałeś się, jak strony internetowe wiedzą, kiedy klikniesz przycisk lub wpisujesz tekst w polu? To magia programowania opartego na zdarzeniach! Jaki lepszy sposób na naukę tej niezbędnej umiejętności niż zbudowanie czegoś pożytecznego – gry na szybkość pisania, która reaguje na każdy naciśnięty klawisz.
Zobaczysz na własne oczy, jak przeglądarki internetowe "komunikują się" z Twoim kodem JavaScript. Za każdym razem, gdy klikniesz, wpiszesz znak lub poruszysz myszką, przeglądarka wysyła małe wiadomości (nazywamy je zdarzeniami) do Twojego kodu, a Ty decydujesz, jak na nie zareagować!
Kiedy tu skończymy, stworzysz prawdziwą grę do pisania, która śledzi Twoją szybkość i dokładność. Co ważniejsze, zrozumiesz podstawowe koncepcje, które napędzają każdą interaktywną stronę internetową, jakiej kiedykolwiek używałeś. Zaczynajmy!
## Quiz przed wykładem
[Quiz przed wykładem](https://ff-quizzes.netlify.app/web/quiz/21)
## Programowanie zdarzeniowe
Pomyśl o swojej ulubionej aplikacji lub stronie – co sprawia, że wydaje się żywa i responsywna? To wszystko zależy od tego, jak reaguje na Twoje działania! Każde stuknięcie, kliknięcie, przesunięcie palcem lub naciśnięcie klawisza tworzy to, co nazywamy „zdarzeniem”, i to właśnie tam dzieje się prawdziwa magia tworzenia stron internetowych.
Oto, co sprawia, że programowanie pod kątem internetu jest tak interesujące: nigdy nie wiemy, kiedy ktoś kliknie ten przycisk lub zacznie pisać w polu tekstowym. Może kliknąć od razu, zaczekać pięć minut, a może nigdy nie kliknąć! Ta nieprzewidywalność oznacza, że musimy myśleć inaczej o tym, jak piszemy kod.
Zamiast pisać kod, który działa od góry do dołu niczym przepis kulinarny, piszemy kod, który cierpliwie czeka na zdarzenie. To podobne do tego, jak w XIX wieku telegrafiści siedzieli przy swoich urządzeniach, gotowi zareagować w chwili nadejścia sygnału.
Czym dokładnie jest „zdarzenie”? To po prostu coś, co się dzieje! Gdy klikniesz przycisk – to zdarzenie. Gdy wpiszesz literę – to zdarzenie. Gdy poruszysz myszką – to kolejne zdarzenie.
Programowanie zdarzeniowe pozwala nam ustawić nasz kod tak, aby nasłuchiwał i reagował. Tworzymy specjalne funkcje nazywane **nasłuchiwaczami zdarzeń**, które cierpliwie czekają na określone zdarzenia, a potem natychmiast przechodzą do akcji.
Pomyśl o nasłuchiwaczach zdarzeń jak o dzwonku do twojego kodu. Ustawiasz dzwonek (`addEventListener()`), określasz, na jaki dźwięk ma reagować (np. 'click' lub 'keypress'), a potem definiujesz, co ma się wydarzyć, gdy ktoś zadzwoni (Twoja niestandardowa funkcja).
**Oto jak działają nasłuchiwacze zdarzeń:**
- **Nasłuchują** określonych działań użytkownika, takich jak kliknięcia, naciśnięcia klawiszy czy ruchy myszki
- **Wykonują** Twój niestandardowy kod, gdy wystąpi określone zdarzenie
- **Reagują** natychmiast na interakcje użytkownika, tworząc płynne doświadczenie
- **Obsługują** wiele zdarzeń na tym samym elemencie za pomocą różnych nasłuchiwaczy
> **UWAGA:** Warto podkreślić, że istnieje wiele sposobów tworzenia nasłuchiwaczy zdarzeń. Można używać funkcji anonimowych lub nazwanych. Można stosować różne skróty, takie jak przypisywanie własności `click`, lub używać `addEventListener()`. W naszym ćwiczeniu skupimy się na `addEventListener()` i funkcjach anonimowych, ponieważ to chyba najpopularniejsza technika używana przez programistów webowych. Jest też najbardziej elastyczna, ponieważ `addEventListener()` działa dla wszystkich zdarzeń, a nazwa zdarzenia może być podana jako parametr.
### Typowe zdarzenia
Chociaż przeglądarki internetowe oferują dziesiątki różnych zdarzeń, na które można nasłuchiwać, większość interaktywnych aplikacji opiera się na zaledwie kilku podstawowych zdarzeniach. Zrozumienie tych kluczowych zdarzeń da Ci fundament do budowania zaawansowanych interakcji użytkownika.
Istnieje [dziesiątki zdarzeń](https://developer.mozilla.org/docs/Web/Events), na które możesz nasłuchiwać podczas tworzenia aplikacji. W zasadzie wszystko, co użytkownik robi na stronie, wywołuje zdarzenie, co daje Ci dużo mocy, aby zapewnić mu doświadczenie, jakiego pragnie. Na szczęście zwykle potrzebujesz tylko niewielkiej liczby zdarzeń. Oto kilka popularnych (w tym dwa, których użyjemy przy tworzeniu naszej gry):
| Zdarzenie | Opis | Typowe zastosowania |
|-----------|------|--------------------|
| `click` | Użytkownik kliknął coś | Przyciski, linki, elementy interaktywne |
| `contextmenu` | Użytkownik kliknął prawym przyciskiem myszy | Niestandardowe menu kontekstowe |
| `select` | Użytkownik zaznaczył fragment tekstu | Edycja tekstu, operacje kopiowania |
| `input` | Użytkownik wpisał tekst | Walidacja formularzy, wyszukiwanie w czasie rzeczywistym |
**Zrozumienie tych typów zdarzeń:**
- **Wywoływane** gdy użytkownicy wchodzą w interakcję z określonymi elementami na stronie
- **Dostarczają** szczegółowych informacji o działaniu użytkownika przez obiekty zdarzeń
- **Umożliwiają** tworzenie responsywnych, interaktywnych aplikacji webowych
- **Działają** spójnie na różnych przeglądarkach i urządzeniach
## Tworzenie gry
Teraz, gdy rozumiesz, jak działają zdarzenia, zastosujmy tę wiedzę w praktyce, budując coś użytecznego. Stworzymy grę na szybkość pisania, która pokaże obsługę zdarzeń i pomoże Ci rozwinąć ważną umiejętność programisty.
Stworzymy grę, aby zbadać, jak działają zdarzenia w JavaScript. Nasza gra przetestuje umiejętność pisania gracza, która jest jedną z najbardziej niedocenianych umiejętności, jaką powinni posiadać wszyscy programiści. Ciekawostka: układ klawiatury QWERTY, którego używamy dzisiaj, został zaprojektowany w latach 70. XIX wieku dla maszyn do pisania – a dobre umiejętności pisania na klawiaturze są nadal tak samo cenne dla programistów! Ogólny przebieg gry będzie wyglądać tak:
```mermaid
flowchart TD
A[Gracz klika Start] --> B[Wyświetla się losowy cytat]
B --> C[Gracz wpisuje w polu tekstowym]
C --> D{Słowo ukończone?}
D -->|Tak| E[Podświetl następne słowo]
D -->|Nie| F{Dotychczas poprawnie?}
F -->|Tak| G[Zachowaj normalny styl]
F -->|Nie| H[Pokaż styl błędu]
E --> I{Cytat ukończony?}
I -->|Nie| C
I -->|Tak| J[Pokaż komunikat sukcesu z czasem]
G --> C
H --> C
```
**Oto jak będzie działała nasza gra:**
- **Zaczyna się** gdy gracz kliknie przycisk start i wyświetli się losowy cytat
- **Śledzi** postępy gracza w pisaniu słowo po słowie w czasie rzeczywistym
- **Podświetla** aktualne słowo, aby skupić uwagę gracza
- **Daje** natychmiastową wizualną informację o błędach w pisaniu
- **Oblicza** i wyświetla całkowity czas po ukończeniu cytatu
Zbudujmy naszą grę i poznajmy zdarzenia!
### Struktura plików
Zanim zaczniemy kodować, uporządkujmy wszystko! Posiadanie czystej struktury plików od początku zaoszczędzi Ci bólu głowy później i sprawi, że Twój projekt będzie bardziej profesjonalny. 😊
Zachowamy prostotę, używając trzech plików: `index.html` dla struktury strony, `script.js` dla całej logiki gry oraz `style.css`, aby wszystko dobrze wyglądało. To klasyczne trio, które napędza większość internetu!
**Utwórz nowy folder na swoje pliki, otwierając konsolę lub terminal i wpisując następujące polecenie:**
```bash
# Linux lub macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Oto, co robią te polecenia:**
- **Tworzy** nowy katalog o nazwie `typing-game` na pliki projektu
- **Przechodzi** automatycznie do nowo utworzonego katalogu
- **Ustawia** czyste środowisko pracy do tworzenia gry
**Otwórz Visual Studio Code:**
```bash
code .
```
**To polecenie:**
- **Uruchamia** Visual Studio Code w bieżącym katalogu
- **Otwiera** folder projektu w edytorze
- **Zapewnia** dostęp do wszystkich potrzebnych narzędzi programistycznych
**Dodaj trzy pliki do folderu w Visual Studio Code o następujących nazwach:**
- `index.html` - zawiera strukturę i zawartość gry
- `script.js` - obsługuje całą logikę gry i nasłuchiwacze zdarzeń
- `style.css` - definiuje wygląd wizualny i stylizację
## Tworzenie interfejsu użytkownika
Zbudujmy teraz scenę, na której odbędzie się cała akcja gry! Pomyśl o tym jak o zaprojektowaniu panelu sterowania statku kosmicznego – musimy mieć pewność, że wszystko, czego potrzebują gracze, jest dokładnie tam, gdzie się tego spodziewają.
Zastanówmy się, czego faktycznie potrzebuje nasza gra. Gdybyś grał w grę na pisanie, co chciałbyś widzieć na ekranie? Oto, czego będziemy potrzebować:
| Element UI | Cel | Element HTML |
|------------|-----|--------------|
| Wyświetlanie cytatu | Pokazuje tekst do napisania | `
` z `id="quote"` |
| Obszar wiadomości | Wyświetla status i komunikaty o powodzeniu | `
` z `id="message"` |
| Pole tekstowe | Tam, gdzie gracz wpisuje cytat | `` z `id="typed-value"` |
| Przyciski start | Rozpoczyna grę | `