Punkte zählen und gewinnen
Dies ist der 8. Schritt von 10 des Gamedev Canvas Tutorials. Sie können den Quellcode, wie er nach Abschluss dieser Lektion aussehen sollte, unter Gamedev-Canvas-workshop/lesson8.html finden.
Steine zu zerstören ist schon cool, aber noch besser wäre es, wenn das Spiel Punkte für jeden getroffenen Stein vergeben und die Gesamtpunktzahl zählen würde.
Die Punkte zählen
Wenn Sie Ihre Punktzahl während des Spiels sehen können, können Sie schließlich Ihre Freunde beeindrucken. Sie benötigen eine Variable, um die Punktzahl aufzuzeichnen. Fügen Sie in Ihrem JavaScript nach den restlichen Variablen Folgendes hinzu:
let score = 0;
Sie benötigen auch eine drawScore()
Funktion, um die Punktanzeige zu erstellen und zu aktualisieren. Fügen Sie folgendes nach der collisionDetection()
Funktion hinzu:
function drawScore() {
ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
ctx.fillText(`Score: ${score}`, 8, 20);
}
Text auf einer Leinwand zu zeichnen ist ähnlich wie das Zeichnen einer Form. Die Schriftartdefinition sieht genauso aus wie die in CSS — Sie können die Größe und den Schriftarttyp in der font()
Methode festlegen. Verwenden Sie dann fillStyle()
, um die Farbe der Schriftart festzulegen, und fillText()
, um den tatsächlichen Text, der auf die Leinwand platziert wird, und den Ort, an dem er platziert wird, festzulegen. Der erste Parameter ist der Text selbst — der obige Code zeigt die aktuelle Punktzahl — und die letzten beiden Parameter sind die Koordinaten, an denen der Text auf der Leinwand platziert wird.
Um bei jedem Treffen eines Steins Punkte zu vergeben, fügen Sie eine Zeile zur collisionDetection()
Funktion hinzu, um den Wert der Punktzahl-Variable zu erhöhen, wenn ein Zusammenstoß erkannt wird. Fügen Sie die folgende hervorgehobene Zeile zu Ihrem Code hinzu:
function collisionDetection() {
for (let c = 0; c < brickColumnCount; c++) {
for (let r = 0; r < brickRowCount; r++) {
const b = bricks[c][r];
if (b.status === 1) {
if (
x > b.x &&
x < b.x + brickWidth &&
y > b.y &&
y < b.y + brickHeight
) {
dy = -dy;
b.status = 0;
score++;
}
}
}
}
}
Das Aufrufen von drawScore()
aus der draw()
Funktion hält die Punktzahl mit jedem neuen Bild auf dem neuesten Stand — fügen Sie die folgende Zeile innerhalb von draw()
, direkt unterhalb des Aufrufs von drawPaddle()
, hinzu:
drawScore();
Anzeige einer Gewinnmeldung, wenn alle Steine zerstört sind
Das Sammeln der Punkte funktioniert gut, aber Sie werden sie nicht ewig sammeln — was passiert, wenn alle Steine zerstört sind? Es ist schließlich der Hauptzweck des Spiels, also sollten Sie eine Gewinnmeldung anzeigen, wenn alle verfügbaren Punkte gesammelt wurden. Fügen Sie den folgenden hervorgehobenen Abschnitt in Ihre collisionDetection()
Funktion ein:
function collisionDetection() {
for (let c = 0; c < brickColumnCount; c++) {
for (let r = 0; r < brickRowCount; r++) {
const b = bricks[c][r];
if (b.status === 1) {
if (
x > b.x &&
x < b.x + brickWidth &&
y > b.y &&
y < b.y + brickHeight
) {
dy = -dy;
b.status = 0;
score++;
if (score === brickRowCount * brickColumnCount) {
alert("YOU WIN, CONGRATULATIONS!");
document.location.reload();
clearInterval(interval); // Needed for Chrome to end game
}
}
}
}
}
}
Dank dieser Funktion können Ihre Benutzer das Spiel tatsächlich gewinnen, wenn sie alle Steine zerstören, was bei Spielen ziemlich wichtig ist. Die Funktion document.location.reload()
lädt die Seite neu und startet das Spiel erneut, sobald die Schaltfläche im Alarmdialogfeld geklickt wird.
Vergleichen Sie Ihren Code
Der neueste Code sieht so aus (und funktioniert so), falls Sie ihn mit Ihrem vergleichen möchten:
Hinweis: Versuchen Sie, pro getroffenem Stein mehr Punkte hinzuzufügen, und geben Sie die Anzahl der gesammelten Punkte im Endspiel-Alarmdialogfeld aus.
Nächste Schritte
Das Spiel sieht mittlerweile ziemlich gut aus. In der nächsten Lektion werden Sie die Attraktivität des Spiels erweitern, indem Sie Maussteuerungen hinzufügen.