Pausar el juego en Godot

por Jun 7, 2018Godot Engine, Tutoriales0 Comentarios

Pausar la partida en un vídeojuego es algo muy importante y se puede hacer de diferentes maneras. Mientras que en motores como GameMaker: Studio la programación de un menú de pausa puede tardar sus 15 min, en Godot podemos hacerlo en uno y medio.

Podemos controlar la pausa de nuestro juego desde cualquier nodo, simplemente necesitamos un script y un nodo que se encuentre en la escena y, preferiblemente, no forme parte del jugador, enemigo u objeto. Además, hay una forma mas fácil para tener la pausa: usando un script singleton que, como saben, se ejecuta durante todo el proyecto. Ahora vamos a ver los dos métodos para hacer una pausa en Godot.

Hacer un nodo «Pausa» en cada nivel

Esto puede funcionar para las personas que al hacer una pausa en su juego, quieren ver un menú en la pantalla o simplemente un mensaje. Consiste en lo siguiente:

Un nodo principal que es Node2D y todos los elementos relacionados con interfaces de usuario que quieran como hijos. Nótese que tengo el «ojo» del nodo txt_pausa oculto, para que no sea visible hasta que se encuentre en pausa.

En el script del nodo paused (pueden usar el nombre que quieran) colocamos lo siguiente:

extends Node2D

func _ready():
	set_process(true)

func _process(delta):
	
	if Input.is_action_just_pressed("pausa") and get_tree().paused:
		get_tree().paused = false
		$txt_pausa.visible = false
	elif Input.is_action_just_pressed("pausa") and get_tree().paused == false:
		get_tree().paused = true
		$txt_pausa.visible = true

Pueden usar la tecla que quieran, aquí «pausa» esta creada por mi. Pueden revisar las entradas de teclado para más información.

Accediendo al get_tree() estamos en el «padre» del proyecto, el cual tiene una propiedad «paused» que, al ser activada, se pone en pausa a si mismo y a todos sus hijos. Antes de hacer la pausa, nos aseguramos de que esa propiedad se encuentre en falso para colocarla verdadera y viceversa.  Lo otro simplemente es para hacer visible nuestro texto de pausa, pueden hacer lo mismo con un contenedor de un menú o cualquier otro nodo.

Anteriormente mencioné que un get_tree() tiene su propiedad «paused» y sí, pero también podemos encontrar en el inspector de cualquier otro nodo, una propiedad de «pause_mode«:

Ahí tenemos que seleccionar lo que pasará si el get_tree() entra en pausa, al dejarlo en «Inherit» le decimos que se quede congelado, pero si seleccionamos «process» podremos mover al personaje mientras todo lo demás esta en pausa.

Para evitar que todo el proyecto se congele y no podamos volver a quitar la pausa, vamos a poner el «pause_mode» del nodo que hace la función de switcher (en mi caso el nodo es «Paused») en «process»:

Ya con esto tenemos la pausa en esta escena, cada vez que presionen la tecla que hayan elegido. Pueden guardar el nodo y instanciarlo en todos los niveles que quieran para tener el mismo menú de pausa.

Usar un pausa.gd como singleton

Para esto sólo tenemos que crear un script y añadirlo al singleton, esto hará que se ejecute durante todo el proyecto. Dentro, tenemos prácticamente lo mismo que en el otro script:

extends Node

func _ready():
	self.pause_mode = PAUSE_MODE_PROCESS
	set_process(true)

func _process(delta):
	if Input.is_action_just_pressed("pausa") and get_tree().paused:
		get_tree().paused = false
	elif Input.is_action_just_pressed("pausa") and get_tree().paused == false:
		get_tree().paused = true

La diferencia es que, al ser un singleton, no podemos cambiar su pause_mode desde el inspector, por lo que usamos el código en la función _ready para que junto con iniciar, se mantenga «en proceso» cuando la pausa sea activada.


Ahora que saben hacer unas pausas en sus partidas, no olviden participar en el foro de Godot en Español ;). Si tienen una duda, pueden dejarla en los comentarios.

¡Comenta! 👇️

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *