Up to date

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

Pausar juegos y el modo de procesamiento (process mode)

Introducción

En la mayoría de los juegos, es deseable interrumpir el juego en algún momento para hacer algo más, como tomar un descanso o cambiar opciones. Implementar un control detallado de qué puede pausarse (y qué no) es mucho trabajo, por lo que Godot proporciona un marco simple para pausar.

Como funciona la pausa

Para pausar el juego, se debe establecer el estado de pausa. Esto se hace asignando true a la propiedad SceneTree.paused:

get_tree().paused = true

Hacer esto provocará dos cosas. Primero, se detendrán las físicas 2D y 3D para todos los nodos. Segundo, el comportamiento de ciertos nodos se detendrá o se iniciará dependiendo de su modo de procesamiento (process mode).

Nota

Los servidores de física pueden activarse mientras el juego está en pausa usando sus métodos set_active.

Modos de procesamiento

Each node in Godot has a "Process Mode" that defines when it processes. It can be found and changed under a node's Node properties in the inspector.

../../_images/pausemode.webp

También puedes modificar la propiedad con código:

func _ready():
    process_mode = Node.PROCESS_MODE_PAUSABLE

Esto es lo que cada modo indica que un nodo debe hacer:

  • Heredado: Se procesa en función del estado del padre, abuelo, etc. El primer padre que tenga un estado diferente a "Heredado" (non-Inherit).

  • Pausable: Process the node (and its children in Inherit mode) only when the game is not paused.

  • WhenPaused: Process the node (and its children in Inherit mode) only when the game is paused.

  • Always: Process the node (and its children in Inherit mode) no matter what. Paused or not, this node will process.

  • Disabled: The node (and its children in Inherit mode) will not process at all.

Por defecto, todos los nodos tienen esta propiedad en el estado "Heredado" (Inherit). Si el padre se establece en "Heredado", entonces se verificará el abuelo y así sucesivamente. Si no se encuentra un estado en ninguno de los abuelos, se usará el estado de pausa en SceneTree. Esto significa que, por defecto, cuando el juego está en pausa, todos los nodos estarán en pausa. Varias cosas suceden cuando un nodo deja de procesarse.

The _process, _physics_process, _input, and _input_event functions will not be called. However signals still work and cause their connected function to run, even if that function's script is attached to a node that is not currently being processed.

Los nodos de animación pausarán su animación actual, los nodos de audio pausarán su transmisión de audio actual y las partículas se detendrán. Estos se reanudarán automáticamente cuando el juego deje de estar en pausa.

Es importante tener en cuenta que incluso si un nodo está siendo procesado mientras el juego está en pausa, la física NO funcionará para él de forma predeterminada. Como se mencionó anteriormente, esto se debe a que los servidores de física están desactivados. Los servidores de física pueden activarse mientras el juego está en pausa mediante el uso de sus métodos set_active.

Pause menu example

Start by creating a button that will be used to pause the game.

Create a menu containing a close button, set the Process Mode of the menu's root node to When Paused, then hide the menu. Since the process mode is set to When Paused on the root node, all its children and grandchildren will inherit that process mode. This way, all the nodes in the menu will start processing when the game is paused.

Attach a script to the menu's root node, connect the pause button created earlier to a new method in the script, and inside that method pause the game and show the pause menu.

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

Finally, connect the menu's close button to a new method in the script. Inside that method, unpause the game and hide the pause menu.

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

You should now have a working pause menu.