Klicks 🖱️
Ein gezeichnetes Bild ist schön — aber ein Spiel wird erst spannend, wenn der
Spieler mitmachen kann. Dafür gibt es die Hilfsfunktion onClick:
onClick(x, y, breite, höhe, handler)
Damit sagst du: „Wenn jemand in dieses Rechteck klickt, dann führe diese
Funktion (handler) aus." Die ersten vier Zahlen beschreiben den klickbaren
Bereich — genau wie bei fillRect: obere linke Ecke plus Breite und Höhe.
💡
onClickist eine fertige Hilfsfunktion aus dem Spiele-Template. Die Canvas-Felder in diesem Kapitel sind wirklich anklickbar — probier es aus!
Der erste Knopf
Deinen Zeichen-Code schreibst du ab jetzt in eine Funktion namens draw
und exportierst sie. Die Umgebung ruft draw für dich auf — du musst das
nicht selbst tun. (Das state in den Klammern brauchen wir gleich; für den
ersten Knopf kannst du es noch ignorieren.)
Wir zeichnen ein Rechteck und legen mit onClick einen klickbaren Bereich
auf dieselbe Stelle. Der handler ist eine Funktion, die beim Klick
aufgerufen wird — hier schreibt sie eine Nachricht in die Konsole.
Klick auf den Knopf 👇
Funktionen als Argumente
Ist dir aufgefallen, dass wir onClick als letztes eine ganze Funktion
übergeben? Das ist kein Zufall: In JavaScript ist eine Funktion ein Wert,
den du wie eine Zahl oder einen Text weiterreichen kannst.
Die kürzeste Schreibweise für so eine Funktion ist die Pfeil-Funktion:
() => {
// hier steht, was passieren soll
}
Die runden Klammern () sind die (hier leeren) Parameter, der Pfeil =>
trennt sie vom Funktions-Körper { ... }. Diese Funktion hat keinen Namen
— du gibst sie direkt dort an, wo du sie brauchst.
Genau das macht onClick möglich: Wir übergeben eine Funktion, aber sie wird
nicht sofort ausgeführt. onClick merkt sie sich und ruft sie erst
dann auf, wenn wirklich in den Bereich geklickt wird:
onClick(50, 50, 100, 100, () => {
console.log("Erst beim Klick!")
})
Eine Funktion, die man einer anderen Funktion übergibt, damit diese sie
„bei Gelegenheit" aufruft, nennt man Callback. Ohne dieses Prinzip könnte
onClick ja gar nicht wissen, was beim Klick geschehen soll.
Du musst die Funktion übrigens nicht direkt hinschreiben — du kannst genauso
gut eine ganz normale, benannte Funktion übergeben. Wichtig: Du gibst nur
ihren Namen an, ohne Klammern () dahinter — sonst würdest du sie
sofort aufrufen, statt sie zu übergeben:
function sagHallo() {
console.log("Hallo!")
}
onClick(50, 50, 100, 100, sagHallo) // die Funktion selbst — ohne ()
💡 Für kurze Aktionen, die nur an einer Stelle gebraucht werden, benutzen wir ab jetzt aber meistens die kurze Pfeil-Schreibweise
() => { ... }.
Etwas verändern: der Zustand und die Moves
Meistens soll ein Klick das Bild verändern. Um den „Zustand" (engl.
state) — also was gerade gilt — musst du dich aber nicht selbst
kümmern: Die Umgebung verwaltet ihn für dich und reicht ihn deiner Funktion
als Parameter state herein. In draw(state) liest du nur daraus,
was du zeichnen sollst.
Ändern darfst du den Zustand nicht direkt — dafür gibt es fertige Funktionen,
die Moves heißen. Rufst du im handler einen Move auf, passiert zweierlei
automatisch:
- der Move ändert den Zustand, und
- die Umgebung ruft danach dein
draw(state)mit dem neuen Zustand erneut auf.
Du rufst draw also nie selbst auf. Im nächsten Beispiel wächst ein
Quadrat bei jedem Klick: draw(state) zeichnet es in der Größe
state.größe, und der handler ruft den Move makeBigger() auf, der
state.größe vergrößert.
💡 Genau so funktioniert später auch dein richtiges Spiel mit boardgame.io: Du liest den Zustand und rufst Moves auf — den Rest erledigt die Umgebung.
Mehrere Knöpfe
Du kannst beliebig viele onClick-Bereiche festlegen — jeder mit eigenem
handler. Ein Move darf auch Angaben entgegennehmen: Hier rufen drei
Knöpfe denselben Move waehleFarbe(farbe) auf, jeder mit einer anderen
Farbe, und bestimmen so die Farbe des großen Quadrats:
Klick-Bereiche in einer Schleife
Weil die Position eines onClick-Bereichs einfach berechnet werden kann,
lassen sich ganze Raster anlegen. Dieses 3×3-Feld merkt sich im Zustand,
welche Zellen schon angeklickt wurden: Der Move markiere(schlüssel)
trägt die geklickte Zelle in state.markiert ein, und draw(state) malt in
jede markierte Zelle ein ✗:
Tipp: den Klick-Bereich sichtbar machen
Ein häufiger Fehler: Der gezeichnete Knopf und der onClick-Bereich liegen
nicht an derselben Stelle — dann klickst du auf den Knopf und nichts
passiert. Wenn ein Klick nicht funktioniert, zeichne den Bereich zur
Kontrolle kurz als Umriss mit denselben vier Zahlen:
onClick(x, y, breite, höhe, handler)
ctx.strokeStyle = "red"
ctx.strokeRect(x, y, breite, höhe) // dieselben vier Zahlen!
💡 Liegt der rote Rahmen genau auf deinem Knopf? Dann passen die Zahlen.
Übung 1 🎯 — Dein eigener Zähler
Baue einen Klick-Zähler in draw(state):
- Zeichne einen Knopf (ein Rechteck mit Beschriftung).
- Zeige den aktuellen Zählerstand
state.anzahlmitfillTextan. - Lege mit
onClickeinen klickbaren Bereich auf den Knopf, dessenhandlerden Movehochzaehlen()aufruft — er erhöhtstate.anzahlum 1.
Um das Neuzeichnen kümmert sich die Umgebung. Klick im Canvas oben links, um deine Lösung zu testen — die Prüfung simuliert außerdem automatisch einen Klick.
Übung 2 🎯 — Ein Schalter
Baue einen Schalter, der bei jedem Klick zwischen zwei Farben
umschaltet (z. B. rot und grün). Der Zustand state.an sagt, ob der Schalter
„an" ist: Zeichne den Schalter je nach state.an in der einen oder anderen
Farbe und lege einen onClick-Bereich darauf, dessen handler den Move
umschalten() aufruft.
Geschafft! 🎉
Du kannst jetzt das Canvas interaktiv machen: Du schreibst eine Funktion
draw(state), die den Zustand liest und zeichnet, legst mit onClick
klickbare Bereiche fest und rufst in den handlern Moves auf. Um den
Zustand zu speichern und nach jedem Move neu zu zeichnen, kümmert sich die
Umgebung — du liest nur und löst Moves aus.
Damit hast du alle Bausteine für ein eigenes Brettspiel: Formen, Farben, Text, Bilder — und jetzt auch die Steuerung. 🚀
🎮 Bereit fürs Finale? Im Kapitel Das Spielbrett zeichnen führst du genau diese Bausteine mit deinem boardgame.io-Tic-Tac-Toe zusammen und zeichnest das Spielfeld selbst.
- Koordinatensystem 📐
- Rechtecke ▭
- Farben 🌈
- Andere Formen ⚪
- Text 🔤
- Bilder 🖼️
- Klicks 🖱️ — du bist hier