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

Cada nodo en Godot tiene un "Modo de Pausa" que define cuándo se procesa. Puede encontrarse y cambiarse en las propiedades del :ref:`Node <class_Node>`en el inspector.

../../_images/pausemode.png

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

func _ready():
    pause_mode = Node.PAUSE_MODE_PROCESS

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).

  • Detener: Detiene el nodo sin importar qué (y también a los hijos en modo "Heredado"). Cuando está en pausa, este nodo no se procesará.

  • Procesar: Procesa el nodo sin importar qué (y también a los hijos en modo "Heredado"). En pausa o no, este nodo se procesará.

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.

Las funciones _process, _physics_process, _input y _input_event no se llamarán. Sin embargo, las señales aún funcionarán y harán que sus funciones conectadas se ejecuten, incluso si el script de esa función está adjunto a un nodo que tiene su modo de pausa establecido en "Detener" (Stop).

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.

Ejemplo de Menu de Pausa

Aquí tienes un ejemplo de un menú de pausa. Crea un popup o panel con controles dentro y establece su modo de pausa en "Procesar" (Process), luego ocúltalo. Al establecer la raíz del popup de pausa en "Procesar" (Process), todos los hijos y nietos heredarán ese estado. De esta manera, esta rama del árbol de escena continuará funcionando cuando el juego esté en pausa.

Por último, haz que cuando se presione el botón de pausa (cualquier botón servirá), se habilite la pausa y se muestre la pantalla de pausa.

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

Para quitar la pausa, realiza lo contrario cuando se cierre la pantalla de pausa:

func _on_pause_popup_close_pressed():
    $pause_popup.hide()
    get_tree().paused = false