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.
Y también tenemos una Escena que representa al Jugador (Player) con todas su características. Camara2D, Animaciones, Áreas2D…
Y también tenemos una escena llamada Nivel1 donde se va desenvolver la acción del juego.
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») |
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:
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.
Y seleccionamos la escena Hud.
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:
Y observamos que ahora se visualizan los Nodos hijo del Nodo Hud:
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.
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() |