# Een spel maken met behulp van events
Heb je je ooit afgevraagd hoe websites weten wanneer je op een knop klikt of tekst typt in een tekstvak? Dat is de magie van event-driven programmeren! Wat is een betere manier om deze essentiële vaardigheid te leren dan door iets nuttigs te bouwen - een typ-snelheidsspel dat reageert op elke toetsaanslag die je maakt.
Je zult uit eerste hand zien hoe webbrowsers "praten" met je JavaScript-code. Elke keer dat je klikt, typt of je muis beweegt, stuurt de browser kleine berichten (we noemen ze events) naar je code, en jij bepaalt hoe je daarop reageert!
Tegen de tijd dat we klaar zijn, heb je een echt typ-spel gebouwd dat je snelheid en nauwkeurigheid bijhoudt. Nog belangrijker is dat je de fundamentele concepten begrijpt die elke interactieve website aandrijven die je ooit hebt gebruikt. Laten we beginnen!
## Quiz voorafgaand aan de les
[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/21)
## Event-driven programmeren
Denk eens aan je favoriete app of website - wat zorgt ervoor dat het levendig en responsief aanvoelt? Het draait allemaal om hoe het reageert op wat jij doet! Elke tik, klik, veeg of toetsaanslag creëert wat we een "event" noemen, en daar gebeurt de echte magie van webontwikkeling.
Wat programmeren voor het web zo interessant maakt, is dat we nooit weten wanneer iemand op die knop zal klikken of begint te typen in een tekstvak. Misschien klikken ze meteen, wachten ze vijf minuten, of klikken ze helemaal niet! Door deze onvoorspelbaarheid moeten we anders nadenken over hoe we onze code schrijven.
In plaats van code te schrijven die van boven naar beneden loopt zoals een recept, schrijven we code die geduldig wacht tot er iets gebeurt. Het is vergelijkbaar met hoe telegraafoperators in de 19e eeuw bij hun machines zaten, klaar om te reageren zodra er een bericht binnenkwam.
Dus wat is precies een "event"? Simpel gezegd, het is iets dat gebeurt! Wanneer je op een knop klikt - dat is een event. Wanneer je een letter typt - dat is een event. Wanneer je je muis beweegt - dat is weer een event.
Event-driven programmeren stelt ons in staat om onze code in te stellen om te luisteren en te reageren. We maken speciale functies, genaamd **event listeners**, die geduldig wachten op specifieke gebeurtenissen en in actie komen wanneer ze plaatsvinden.
Denk aan event listeners als een deurbel voor je code. Je stelt de deurbel in (`addEventListener()`), vertelt wat voor geluid hij moet horen (zoals een 'klik' of 'toetsaanslag'), en specificeert wat er moet gebeuren wanneer iemand aanbelt (jouw aangepaste functie).
**Zo werken event listeners:**
- **Luisteren** naar specifieke gebruikersacties zoals klikken, toetsaanslagen of muisbewegingen
- **Voeren uit** jouw aangepaste code wanneer het gespecificeerde event plaatsvindt
- **Reageren** onmiddellijk op gebruikersinteracties, wat zorgt voor een naadloze ervaring
- **Behandelen** meerdere events op hetzelfde element met verschillende listeners
> **NOTE:** Het is de moeite waard om te benadrukken dat er verschillende manieren zijn om event listeners te maken. Je kunt anonieme functies gebruiken of benoemde functies maken. Je kunt verschillende snelkoppelingen gebruiken, zoals het instellen van de `click`-eigenschap, of `addEventListener()` gebruiken. In onze oefening gaan we ons richten op `addEventListener()` en anonieme functies, omdat dit waarschijnlijk de meest gebruikte techniek is onder webontwikkelaars. Het is ook de meest flexibele, omdat `addEventListener()` werkt voor alle events en de eventnaam als parameter kan worden opgegeven.
### Veelvoorkomende events
Hoewel webbrowsers tientallen verschillende events bieden waar je naar kunt luisteren, vertrouwen de meeste interactieve applicaties op slechts een handvol essentiële events. Het begrijpen van deze kern-events geeft je de basis om geavanceerde gebruikersinteracties te bouwen.
Er zijn [tientallen events](https://developer.mozilla.org/docs/Web/Events) beschikbaar waar je naar kunt luisteren bij het maken van een applicatie. In principe roept alles wat een gebruiker op een pagina doet een event op, wat je veel mogelijkheden geeft om ervoor te zorgen dat ze de ervaring krijgen die je wenst. Gelukkig heb je meestal maar een klein aantal events nodig. Hier zijn een paar veelvoorkomende (inclusief de twee die we zullen gebruiken bij het maken van ons spel):
| Event | Beschrijving | Veelvoorkomende toepassingen |
|-------|--------------|------------------------------|
| `click` | De gebruiker heeft ergens op geklikt | Knoppen, links, interactieve elementen |
| `contextmenu` | De gebruiker heeft met de rechtermuisknop geklikt | Aangepaste rechtermuisklikmenu's |
| `select` | De gebruiker heeft tekst gemarkeerd | Tekstbewerking, kopieeracties |
| `input` | De gebruiker heeft tekst ingevoerd | Formuliervalidatie, realtime zoeken |
**Begrip van deze eventtypes:**
- **Wordt geactiveerd** wanneer gebruikers interactie hebben met specifieke elementen op je pagina
- **Biedt** gedetailleerde informatie over de actie van de gebruiker via event-objecten
- **Maakt** het mogelijk om responsieve, interactieve webapplicaties te maken
- **Werkt** consistent op verschillende browsers en apparaten
## Het spel maken
Nu je begrijpt hoe events werken, laten we die kennis in de praktijk brengen door iets nuttigs te bouwen. We gaan een typ-snelheidsspel maken dat event handling demonstreert en je helpt een belangrijke ontwikkelaarsvaardigheid te ontwikkelen.
We gaan een spel maken om te ontdekken hoe events werken in JavaScript. Ons spel zal de typvaardigheid van een speler testen, wat een van de meest onderschatte vaardigheden is die alle ontwikkelaars zouden moeten hebben. Leuk feitje: het QWERTY-toetsenbord dat we vandaag gebruiken, werd eigenlijk ontworpen in de jaren 1870 voor typemachines - en goede typvaardigheden zijn nog steeds net zo waardevol voor programmeurs vandaag de dag! De algemene flow van het spel ziet er als volgt uit:
```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
```
**Zo werkt ons spel:**
- **Start** wanneer de speler op de startknop klikt en een willekeurige quote weergeeft
- **Volgt** de typvoortgang van de speler woord voor woord in realtime
- **Markeert** het huidige woord om de focus van de speler te begeleiden
- **Geeft** directe visuele feedback bij typfouten
- **Bereken** en toont de totale tijd wanneer de quote is voltooid
Laten we ons spel bouwen en meer leren over events!
### Bestandsstructuur
Voordat we beginnen met coderen, laten we ons organiseren! Een schone bestandsstructuur vanaf het begin bespaart je later hoofdpijn en maakt je project professioneler. 😊
We houden het simpel met slechts drie bestanden: `index.html` voor de structuur van onze pagina, `script.js` voor alle logica van ons spel, en `style.css` om alles er geweldig uit te laten zien. Dit is de klassieke trio die de meeste websites aandrijft!
**Maak een nieuwe map voor je werk door een console- of terminalvenster te openen en het volgende commando in te voeren:**
```bash
# Linux or macOS
mkdir typing-game && cd typing-game
# Windows
md typing-game && cd typing-game
```
**Wat deze commando's doen:**
- **Maakt** een nieuwe map genaamd `typing-game` voor je projectbestanden
- **Navigeert** automatisch naar de nieuw aangemaakte map
- **Creëert** een schone werkruimte voor je spelontwikkeling
**Open Visual Studio Code:**
```bash
code .
```
**Dit commando:**
- **Start** Visual Studio Code in de huidige map
- **Opent** je projectmap in de editor
- **Biedt** toegang tot alle ontwikkeltools die je nodig hebt
**Voeg drie bestanden toe aan de map in Visual Studio Code met de volgende namen:**
- `index.html` - Bevat de structuur en inhoud van je spel
- `script.js` - Behandelt alle spel-logica en event listeners
- `style.css` - Definieert het visuele uiterlijk en de styling
## Maak de gebruikersinterface
Laten we nu het podium bouwen waar alle actie van ons spel zal plaatsvinden! Denk hieraan als het ontwerpen van het bedieningspaneel van een ruimteschip - we moeten ervoor zorgen dat alles wat onze spelers nodig hebben precies daar is waar ze het verwachten.
Laten we uitzoeken wat ons spel eigenlijk nodig heeft. Als je een typ-spel zou spelen, wat zou je dan op het scherm willen zien? Hier is wat we nodig hebben:
| UI-element | Doel | HTML-element |
|------------|------|-------------|
| Quote-weergave | Toont de tekst om te typen | `
` met `id="quote"` |
| Berichtgebied | Geeft status- en succesberichten weer | `
` met `id="message"` |
| Tekstinvoer | Waar spelers de quote typen | `` met `id="typed-value"` |
| Startknop | Start het spel | `