Creación de Videojuegos. Godot Engine. Instanciar escenas.

Tema 28. Godot Engine. Instanciar escenas

Cuando el juego va creciendo y se va aumentando el número de escenas o nodos y deseamos mantener un nivel de independencia entre los “nodos” de una escena o entre las propias escenas, la mejor forma es la de instanciar las escenas.

Instanciar significa añadir escenas como hijas de otras escenas de tal manera que mantenemos un nivel de independencia entre ellas.

Primero vamos a plantear el siguiente escenario:

Imaginemos que en un proyecto tenemos una Escena completa que representa un Hud con un Joystick y a su vez dispone de otros botones adicionales Nodos.

Nodo Hud con botones. Godot
Nodo Hud con botones. Godot

Imagen del Nodo Hud. Godot
Imagen del Nodo Hud. Godot

Y también tenemos una  Escena que representa al Jugador (Player) con todas su características. Camara2D, Animaciones, Áreas2D…

Imagen del Nodo Player. Godot
Imagen del Nodo Player. Godot

Y también tenemos una escena llamada Nivel1 donde se va desenvolver la acción del juego.

Escena Nivel1 donde se desenvuelve el juego. Godot
Escena Nivel1 donde se desenvuelve el juego. Godot

Nodo Player. Godot
Nodo Player. Godot

Escena Nivel1 con el jugador y objetos. Godot
Escena Nivel1 con el jugador y objetos. Godot
1er CASO: ¿Qué ocurre si no instanciamos?

Si arrastramos las escenas Hud y Player de forma separada sobre el Nivel1, el proyecto funcionará bien. 

En el Script del Player, haremos lo siguiente para obtener el nodo Joystick y acceder a sus propiedades:

(En el Nodo Joystickbuttons tenemos implementado un método get_values() que devuelve el valor del joystick pulsado)

#Obtenemos el objeto joystick
onready var joystick = get_node(“/root/Nivel1/Hud/Joystick/Joystickbuttons”)
Nodo Nivel1 con el Nodo Player y Hud que hemos arrastrado. Godot
Nodo Nivel1 con el Nodo Player y Hud que hemos arrastrado. Godot
Imagen de la escena Nivel1 con el Player, el Hud y objetos Godot
Imagen de la escena Nivel1 con el Player, el Hud y objetos Godot

Pero, si ahora creamos una nueva escena llamada Presentación y arrastramos la escena Player dentro, y ejecutamos el proyecto, veremos que nos aparece un error:

Nueva escena Presentación con el Nodo Player dentro. Godot
Nueva escena Presentación con el Nodo Player dentro. Godot
Imagen de la escena Presentación. Godot
Imagen de la escena Presentación. Godot

la variable anterior joystick es null porque no se ha encontrado la ruta “/root/Nivel1/Hud/Joystick/Joystickbuttons” ya que estamos accediendo a dicho Nodo desde Nodo Player en dicha escena y no encuentra el Nodo Hud con todos sus Nodos hijos.

Por lo tanto, si queremos independizar las escenas para posteriormente ir añadiendo otras escenas, es recomendable instanciar como se explicará a continuación.

Existen dos formas de instanciar las escenas en un proyecto.

INSTANCIAR DESDE LA VENTANA DE ESCENAS

Ahora instanciaremos la Escena Hud dentro de la escena Player:

Nos situamos encima del Nodo Player (padre) y hacemos Click sobre el ancla Instanciar Escena hijo.

Instanciamos Hud como escena Hija de Player. Godot
Instanciamos Hud como escena Hija de Player. Godot

Y seleccionamos la escena Hud.

Seleccionamos la escena Hud para ser instanciada dentro de la escena Player. Godot
Seleccionamos la escena Hud para ser instanciada dentro de la escena Player. Godot
Ahora Hud es una escena instanciada de Player. Godot
Ahora Hud es una escena instanciada de Player. Godot

Ahora se muestra Hud como escena hijo de Player (instanciada)

Si deseamos ver los Nodos hijo de Hud, dentro de la escena Player, nos ponemos encima de Hud y con el botón derecho del ratón marcamos Hijo Editables:

Visualización de los Nodos hijos de la escena instanciada Hud. Godot
Visualización de los Nodos hijos de la escena instanciada Hud. Godot

Y observamos que ahora se visualizan los Nodos hijo del Nodo Hud:

Los Nodos de Hud se muestran en la escena Player. Godot
Los Nodos de Hud se muestran en la escena Player. Godot

Y ahora con modificar la línea de código por la siguiente referencia:

onready var joystick = get_node(“Hud/Joystick/Joystickbuttons”)

ambas escenas, Nivel1 y Presentación funcionarán bien porque ahora Hud es nodo Hijo (está instanciado) del Nodo Player y en ambas escenas el Nodo Hud está instanciado como hijo del Nodo Player.

Y obtenemos los valores del Joystick:

input_vector = joystick.get_value()
INSTANCIAR DESDE CÓDIGO

Estos pasos hacen exactamente los mismo que antes pero instanciando todo usando solo código.

Para instanciar por código haremos lo siguiente:

Primero quitaremos o borraremos el Nodo Hud del Player ya que lo vamos a cargar por código.

Quitamos el Nodo Hud instanciado del Nodo Player. Godot
Quitamos el Nodo Hud instanciado del Nodo Player. Godot

Entramos en el Script del Player y primero creamos la instrucción para cargar la escena Hud

Y creamos una variable joy (para obtener el nodo después) vacía.

onready var escena_hud = preload(“res://Scenes/Hud.tscn”).instance()
var joy = null

En la función ready:

Añadimos la escena Hud a la escena del Player para que se muestren todos los botones que existen en dicha escena.

Y obtenemos el Nodo que nos interese mediante el método get_node(Nodo) que haya dentro de la escena Hud.

En este ejemplo devuelve en joy el Nodo Joystickbuttons que implementa la función get_values() y que devuelve los valores del joystick.

func _ready():
add_child(escena_hud)
joy = escena_hud.get_node(“Joystick/Joystickbuttons”)
#Activar Joystick
input_vector = joy.get_value()

ÍNDICE


0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x