Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Pausieren von Spielen und Prozessierungsmodus

Einführung

In den meisten Spielen ist es wünschenswert, das Spiel irgendwann zu unterbrechen, um etwas anderes zu tun, z.B. eine Pause zu machen oder die Optionen zu ändern. Die Implementierung einer feinkörnigen Steuerung für das, was pausiert werden kann (und was nicht), ist eine Menge Arbeit, so dass in Godot ein einfacher Rahmen für die Pausierung vorgesehen ist.

Wie das Pausieren funktioniert

Um das Spiel zu pausieren, muss der Pausenstatus gesetzt werden. Dies geschieht durch Zuweisung von true an die Property SceneTree.paused:

get_tree().paused = true

Dadurch werden zwei Dinge bewirkt. Erstens wird die 2D- und 3D-Physik für alle Nodes gestoppt. Zweitens wird das Verhalten bestimmter Nodes abhängig von ihrem Prozessierungsmodus angehalten oder gestartet.

Bemerkung

Die Physikserver können mit Hilfe ihrer set_active-Methoden aktiv gemacht werden, während das Spiel pausiert ist.

Prozessierungsmodi

Jeder Node in Godot hat einen "Prozessierungsmodus", der definiert, wann er verarbeitet wird. Er kann unter den Node-Propertys eines Nodes im Inspektor gefunden und geändert werden.

../../_images/pausemode.webp

Sie können die Property auch mit Code ändern:

func _ready():
    process_mode = Node.PROCESS_MODE_PAUSABLE

Jeder Modus weist einen Node an, Folgendes zu tun:

  • Erben: Prozessieren je nach Status des Parent, sowie dessen Parent usw. Der erste Parent, der einen Nicht-Vererbungsstatus hat.

  • Pausierbar: Prozessierung des Nodes (und seiner Child-Nodes im Modus "Erben") nur, wenn das Spiel nicht pausiert ist.

  • Wenn Pausiert: Prozessiert den Node (und seine Child-Nodes im Erben-Modus) nur, wenn das Spiel pausiert ist.

  • Immer: Prozessiert den Node (und seine Child-Nodes im Modus "Erben") in jedem Fall. Ob pausiert oder nicht, dieser Node wird verarbeitet.

  • Deaktiviert: Der Node (und seine Child-Nodes im Modus "Vererben") wird überhaupt nicht prozessiert.

Standardmäßig haben alle Nodes diese Property auf den Status "Erben" gesetzt. Wenn der Parent auf "Erben" gesetzt ist, wird dessen Parent überprüft und so weiter. Wenn ein Zustand in keinem übergeordneten Nodes gefunden werden kann, wird der Pausenzustand im SceneTree verwendet. Das bedeutet, dass standardmäßig alle Nodes angehalten werden, wenn das Spiel pausiert wird. Wenn ein Node die Verarbeitung anhält, passieren mehrere Dinge.

Die Funktionen _process, _physics_process, _input, und _input_event werden nicht aufgerufen. Signale funktionieren jedoch weiterhin und bewirken, dass die mit ihnen verbundene Funktion ausgeführt wird, selbst wenn das Skript dieser Funktion an einen Node angehängt ist, der gerade nicht verarbeitet wird.

Animations-Nodes halten ihre aktuelle Animation an, Audio-Nodes halten ihren aktuellen Audio-Stream an, und Partikel halten an. Sie werden automatisch fortgesetzt, wenn das Spiel nicht mehr pausiert ist.

Es ist wichtig zu beachten, dass selbst wenn ein Node verarbeitet wird, während das Spiel pausiert ist, die Physik standardmäßig NICHT für ihn funktioniert. Wie bereits erwähnt, liegt das daran, dass die Physikserver ausgeschaltet sind. Die Physikserver können auf aktiv gesetzt werden, während das Spiel pausiert ist, indem man ihre set_active-Methoden benutzt.

Beispiel für ein Pausenmenü

Beginnen Sie damit, einen Button zu erstellen, mit dem das Spiel angehalten werden kann.

Erstellen Sie ein Menü mit einem Schließen-Button, setzen Sie den Prozessierungsmodus des Root-Nodes des Menüs auf Wenn Pausiert und blenden Sie dann das Menü aus. Da der Prozessierungsmodus für den Root-Node auf Wenn Pausiert gesetzt ist, erben alle seine Child-Nodes und deren Child-Nodes diesen Prozessierungsmodus. Auf diese Weise beginnen alle Nodes des Menüs mit der Prozessierung, wenn das Spiel pausiert wird.

Hängen Sie ein Skript an den Root-Node des Menüs an, verbinden Sie den zuvor erstellten Pause-Button mit einer neuen Methode im Skript und halten Sie innerhalb dieser Methode das Spiel an und zeigen Sie das Pausenmenü an.

func _on_pause_button_pressed():
    get_tree().paused = true
    show()

Verbinden Sie schließlich den Schließen-Button des Menüs mit einer neuen Methode im Skript. In dieser Methode heben Sie die Spielpause auf und blenden das Pausenmenü aus.

func _on_close_button_pressed():
    hide()
    get_tree().paused = false

Sie sollten nun ein funktionierendes Pausenmenü haben.