Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Buttons

Dies ist der 15. Schritt von 16 des Gamedev Phaser Tutorials. Anstatt das Spiel sofort zu starten, können wir diese Entscheidung dem Spieler überlassen, indem wir einen Start-Button hinzufügen, den er drücken kann. Lassen Sie uns untersuchen, wie das geht.

Neue Eigenschaften

Wir benötigen eine Eigenschaft, um einen booleschen Wert zu speichern, der darstellt, ob das Spiel gerade gespielt wird oder nicht, und eine weitere, um unseren Button darzustellen. Fügen Sie diese Zeilen unter Ihren anderen Eigenschaftsdefinitionen hinzu:

js
class ExampleScene extends Phaser.Scene {
  // ... previous property definitions ...
  playing = false;
  startButton;
  // ... rest of the class ...
}

Laden des Button-Spritesheets

Wir können das Button-Spritesheet laden, genau wie wir die Wobble-Animation des Balls geladen haben. Fügen Sie Folgendes am Ende der preload()-Methode hinzu:

js
this.load.spritesheet("button", "img/button.png", {
  frameWidth: 120,
  frameHeight: 40,
});

Ein einzelner Button-Rahmen ist 120 Pixel breit und 40 Pixel hoch.

Sie müssen auch das Button-Spritesheet herunterladen und es in Ihrem /img Verzeichnis speichern.

Hinzufügen des Buttons zum Spiel

Das Hinzufügen des neuen Buttons zum Spiel erfolgt durch die Verwendung der add.sprite Methode. Fügen Sie die folgenden Zeilen am Ende Ihrer create() Methode hinzu:

js
this.startButton = this.add.sprite(
  this.scale.width * 0.5,
  this.scale.height * 0.5,
  "button",
  0,
);

Zusätzlich zu den Parametern, die wir bei den anderen add.sprite-Aufrufen übergeben haben (wie beim Hinzufügen des Balls und des Paddels), geben wir diesmal auch die Rahmennummer an, die in diesem Fall 0 ist. Das bedeutet, dass der erste Rahmen des Spritesheets für das anfängliche Erscheinungsbild des Buttons verwendet wird.

Um den Button auf verschiedene Eingaben wie Mausklicks reagieren zu lassen, müssen wir die folgenden Zeilen direkt nach dem vorherigen add.sprite-Aufruf hinzufügen:

js
this.startButton.setInteractive();
this.startButton.on(
  "pointerover",
  () => {
    this.startButton.setFrame(1);
  },
  this,
);
this.startButton.on(
  "pointerdown",
  () => {
    this.startButton.setFrame(2);
  },
  this,
);
this.startButton.on(
  "pointerout",
  () => {
    this.startButton.setFrame(0);
  },
  this,
);
this.startButton.on(
  "pointerup",
  () => {
    this.startGame();
  },
  this,
);

Zuerst rufen wir setInteractive auf dem Button auf, um ihn auf Zeigerereignisse reagieren zu lassen. Dann fügen wir dem Button die vier Ereignislistener hinzu:

  • pointerover: Wenn sich der Zeiger über dem Button befindet, ändern wir den Button-Rahmen auf 1, den zweiten Rahmen des Spritesheets.
  • pointerdown: Wenn der Button gedrückt wird, ändern wir den Button-Rahmen auf 2, den dritten Rahmen des Spritesheets.
  • pointerout: Wenn der Zeiger den Button verlässt, ändern wir den Button-Rahmen zurück auf 0, den ersten Rahmen des Spritesheets.
  • pointerup: Wenn der Button losgelassen wird, rufen wir die startGame-Methode auf, um das Spiel zu starten.

Nun müssen wir die oben im Code erwähnte startGame() Methode definieren:

js
class ExampleScene extends Phaser.Scene {
  // ...
  startGame() {
    this.startButton.destroy();
    this.ball.body.setVelocity(150, -150);
    this.playing = true;
  }
}

Wenn der Button gedrückt wird, entfernen wir den Button, setzen die Anfangsgeschwindigkeit des Balls und setzen die playing Eigenschaft auf true.

Abschließend für diesen Abschnitt, gehen Sie zurück in Ihre create Methode, finden Sie die Zeile this.ball.body.setVelocity(150, -150); und entfernen Sie sie. Der Ball soll sich erst bewegen, wenn der Button gedrückt wurde, nicht vorher!

Das Paddle unbeweglich halten, bevor das Spiel startet

Es funktioniert wie erwartet, aber wir können das Paddle noch bewegen, wenn das Spiel noch nicht gestartet wurde, was etwas albern aussieht. Um dies zu verhindern, können wir die playing Eigenschaft nutzen und das Paddle nur beweglich machen, wenn das Spiel gestartet wurde. Dafür passen Sie die update() Methode folgendermaßen an:

js
class ExampleScene extends Phaser.Scene {
  // ...
  update() {
    // ...
    if (this.playing) {
      this.paddle.x = this.input.x || this.scale.width * 0.5;
    }
    // ...
  }
  // ...
}

Auf diese Weise ist das Paddle unbeweglich, nachdem alles geladen und vorbereitet wurde, aber bevor das eigentliche Spiel beginnt.

Vergleichen Sie Ihren Code

Hier ist, was Sie bisher haben sollten, live laufend. Um den Quellcode anzusehen, klicken Sie auf den "Play" Button.

Nächste Schritte

Das Letzte, was wir in dieser Artikelreihe tun werden, ist, das Gameplay noch interessanter zu machen, indem wir etwas Randomisierung in die Art und Weise einfügen, wie der Ball vom Paddle abprallt.