Punktestand verfolgen und gewinnen
Dies ist der 8. Schritt von 10 des Gamedev Canvas Tutorials. Den Quellcode, wie er nach Abschluss dieser Lektion aussehen sollte, finden Sie unter Gamedev-Canvas-workshop/lesson8.html.
Die Zerstörung der Ziegelsteine ist wirklich cool, aber um das Spiel noch beeindruckender zu machen, könnten Punkte für jeden vom Benutzer getroffenen Ziegel vergeben und der Gesamtscore gezählt werden.
Punkte zählen
Wenn Sie Ihren Punktestand während des Spiels sehen können, können Sie irgendwann Ihre Freunde beeindrucken. Sie benötigen eine Variable, um die Punkte aufzuzeichnen. Fügen Sie Folgendes in Ihr JavaScript ein, nach den restlichen Variablen:
let score = 0;
Sie benötigen auch eine drawScore()
-Funktion, um die Punkteanzeige 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 einem Canvas zu zeichnen ist ähnlich wie das Zeichnen einer Form. Die Schriftdefinition 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 Schrift zu setzen, und fillText()
, um den tatsächlichen Text festzulegen, der auf dem Canvas platziert wird, und wo er platziert wird. Der erste Parameter ist der Text selbst – der obige Code zeigt die aktuelle Punktzahl – und die letzten zwei Parameter sind die Koordinaten, an denen der Text auf dem Canvas platziert wird.
Um jedes Mal Punkte zu vergeben, wenn ein Ziegel getroffen wird, fügen Sie der collisionDetection()
-Funktion eine Zeile hinzu, um den Wert der Punktevariable bei jeder erkannten Kollision zu erhöhen. Fügen Sie die folgende hervorgehobene Zeile in Ihren Code 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++;
}
}
}
}
}
Das Aufrufen von drawScore()
aus der draw()
-Funktion hält die Punktzahl mit jedem neuen Frame auf dem neuesten Stand — fügen Sie die folgende Zeile in draw()
ein, direkt unter dem Aufruf von drawPaddle()
:
drawScore();
Eine Gewinnmeldung anzeigen, wenn alle Ziegel zerstört wurden
Das Sammeln der Punkte funktioniert gut, aber Sie werden sie nicht für immer hinzufügen – was passiert, wenn alle Ziegel zerstört wurden? Es ist schließlich der Hauptzweck des Spiels, also sollten Sie eine Gewinnmeldung anzeigen, wenn alle verfügbaren Punkte gesammelt wurden. Fügen Sie 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 dessen können Ihre Benutzer das Spiel tatsächlich gewinnen, wenn sie alle Ziegel 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 Alarmtaste angeklickt wird.
Vergleichen Sie Ihren Code
Der neueste Code sieht so aus (und funktioniert auch so), falls Sie ihn mit Ihrem vergleichen möchten:
Hinweis: Versuchen Sie, mehr Punkte pro getroffenem Ziegel hinzuzufügen und drucken Sie die Anzahl der gesammelten Punkte im Endspiel-Alarmfenster aus.
Nächste Schritte
Das Spiel sieht an diesem Punkt ziemlich gut aus. In der nächsten Lektion werden Sie den Reiz des Spiels erweitern, indem Sie Maussteuerungen hinzufügen.