Spiele pausieren

Pause?

In den meisten Spielen ist es wünschenswert an einer bestimmten Stelle eine kurze Unterbrechung einzulegen, um etwas anderes zu tun wie z.B. eine Pause machen oder die Einstellungen ändern. Dies ist leider nicht so einfach wie es sich anhört. Das Spiel ist zwar gestoppt, aber vielleicht sollen dabei noch einige Menüs oder Animationen weiter laufen.

Eine fein abgestimmte Kontrolle einzubauen, was unterbrochen werden kann und was nicht, ist eine Menge arbeit. Daher bietet Godot hierfür eine einfache Rahmenstruktur zum pausieren.

Wie pausieren funktioniert

Um in einen Pausenmodus zu gelangen, muss der Pausenstatus gesetzt werden. Dies erfolgt durch Zuweisen von true zur Eigenschaft SceneTree.paused:

get_tree().paused = true
GetTree().Paused = true;

Dies hat folgendes Verhalten:

  • Die 2D und 3D Physik wird gestoppt.
  • _process und _physics_process wird in Nodes nicht mehr aufgerufen.
  • _input und _input_event wird ebenfalls nicht mehr aufgerufen.

Dies stoppt effektiv das ganze Spiel. Das Aufrufen dieser Funktion über ein Skript führt standardmäßig zu einem nicht wiederherstellbaren Status (nichts funktioniert mehr!).

White-Listing-Nodes

Stellen Sie vor dem Aktivieren der Pause sicher, dass Nodes, die während der Pause weiterarbeiten müssen, auf der weißen Liste stehen. Dies erfolgt durch Bearbeiten der Eigenschaft "Pausenmodus" in einem Node:

../../_images/pausemode.png

Sie können das gleiche Ergebnis im Code erzielen:

func _ready():
    pause_mode = Node.PAUSE_MODE_PROCESS

Standardmäßig haben alle Nodes diese Eigenschaft im Status "vererbt". Dies bedeutet, dass sie nur verarbeitet werden (oder nicht), je nachdem welche Eigenschaft auf dem übergeordneten Node festgelegt ist. Wenn der Elternteil auf "vererbt" eingestellt ist, wird der Großelternteil überprüft und so weiter. Wenn bei keinem der Großeltern ein Status gefunden werden kann, wird der Pausenstatus in Szenenbaum verwendet. Dies bedeutet, wenn das Spiel angehalten wird, wird standardmäßig jeder Node angehalten.

Die drei möglichen Zustände für einen Node sind also:

  • Erben: Prozess abhängig vom Status des Elternteils, Großelternteils usw. Der erste Elternteil, der einen Nicht-Vererbungsstatus hat.
  • Stop: Stoppt den Node, egal was passiert (und Kinder im Vererbungsmodus). Wenn dieser Node angehalten wird, wird er nicht verarbeitet.
  • Verarbeiten: Verarbeitet den Node, egal was passiert (und Kinder im Vererbungsmodus). Egal ob angehalten oder nicht, wird dieser Node verarbeitet.

Beispiel

Ein Beispiel hierfür ist das Erstellen eines Popups oder Bedienfelds mit darin enthaltenen Steuerelementen. Stellen Sie den Pausenmodus auf "Verarbeiten" und blenden Sie es dann aus:

../../_images/pause_popup.png

Wenn Sie die Wurzel des Pausen-Popups auf "Verarbeiten" setzen, erben alle Kinder und Enkelkinder diesen Status. Auf diese Weise funktioniert dieser Zweig des Szenenbaums nach einer Pause weiter.

Machen Sie es schließlich so, wenn eine Pause-Taste gedrückt wird (egal welche Taste), aktivieren Sie die Pause und zeigen Sie den Pause-Bildschirm an.

func _on_pause_button_pressed():
    get_tree().paused = true
    $pause_popup.show()
public void _on_pause_button_pressed()
{
    GetTree().Paused = true;
    GetNode<Control>("pause_popup").Show();
}

Gehen Sie beim Schließen des Pausenbildschirms wie folgt vor, um die Pause zu entfernen:

func _on_pause_popup_close_pressed():
    $pause_popup.hide()
    get_tree().paused = false
public void _on_pause_popup_close_pressed()
{
    GetNode<Control>("pause_popup").Hide();
    GetTree().Paused = false;
}

Und das sollte alles sein!