Das HTML-Element <canvas> ist eine Zeichenfläche, auf der du per JavaScript Formen, Bilder und Animationen erzeugst. Auf Canvas basieren viele Browserspiele und Diagramme.
Erste Zeichnung
Ergebnis
Das Koordinatensystem beginnt oben links (0, 0); x wächst nach rechts, y nach unten.
Linien und Pfade
Ergebnis
| Methode | Wirkung |
|---|---|
fillRect, strokeRect, clearRect | Rechtecke füllen/umranden/löschen |
beginPath, moveTo, lineTo, closePath | Pfade zeichnen |
arc, quadraticCurveTo, bezierCurveTo | Kreise und Kurven |
fill, stroke | Pfad füllen / umranden |
fillText, strokeText | Text |
drawImage | Bild oder anderes Canvas |
save, restore, translate, rotate, scale | Zustand und Transformationen |
Animation mit requestAnimationFrame
Eine Animation zeichnet immer wieder ein neues Bild. requestAnimationFrame ruft deine Funktion passend zur Bildwiederholrate (meist 60-mal pro Sekunde) auf:
Ergebnis
Der Trick: Bewegung hängt von der vergangenen Zeit (dt) ab, nicht von der Anzahl der Bilder. So läuft die Animation auf schnellen und langsamen Geräten gleich schnell.
Steuerung per Tastatur
Ergebnis
Typische Spielschleife
- Eingabe lesen (Tasten, Maus, Touch)
- Zustand aktualisieren (Positionen, Punkte, Kollisionen)
- Zeichnen (Bildfläche leeren, alles neu malen)
- Nächsten Frame anfordern
Kollisionen zwischen Rechtecken prüfst du so:
Ergebnis
true false
Scharf auf Retina-Bildschirmen
Auf hochauflösenden Displays wirkt Canvas unscharf. Skaliere die Zeichenfläche mit devicePixelRatio:
const dpr = window.devicePixelRatio || 1;
canvas.width = 300 * dpr; canvas.height = 150 * dpr;
canvas.style.width = "300px"; canvas.style.height = "150px";
ctx.scale(dpr, dpr);Merke
canvas.getContext("2d")liefert den Zeichenkontext; Ursprung oben links- Rechtecke, Pfade, Kreise, Text und Bilder lassen sich zeichnen
- Animation:
requestAnimationFrameund Bewegung nach vergangener Zeit - Spielschleife: Eingabe, Zustand ändern, zeichnen
- Kollision zweier Rechtecke durch vier Vergleiche
Aufgabe
Lass einen Ball über die Zeichenfläche springen und färbe ihn bei jedem Wandkontakt anders.