Tema 16. Godot Engine. Aspectos fundamentales de las escenas.
RENOMBRAR Y REUBICAR ESCENA |
En este tema se van a explicar una serie de pasos muy importantes que son esenciales para el buen desarrollo de un proyecto. Es es caso de renombrar escenas o nodos para que podamos percibir mejor nuestra estructura de proyecto.
Recordamos que nuestro proyecto está formado por un Nodo2D al que hemos llamado Escena1.
Vamos a renombrar el Nodo Escena1 por Nivel1 y vamos a ver qué cambios debemos realizar:
Para ello, nos ponemos encima del Nodo y simplemente lo renombramos, pero si nos fijamos,
en la estructura de recursos, el archivo sigue llamándose como antes, Escena1.tscn
Por lo tanto, deberemos ir al archivo y proceder también a su modificación. Esto no es obligatorio pero sí muy recomendable. En una estructura con muchos más nodos puede llevarnos a mucha confusión si no lo hacemos. Por lo tanto es aconsejable hacerlo para evitar problemas tal y como vamos avanzando en nuestro proyecto:
Aquí vemos como coincide el nombre del Nodo con su fichero de Escena.
También es posible arrastrar el fichero Nivel1.tscn o Player.tscn a un nuevo directorio creado previamente. Siempre debemos organizar nuestro proyecto de la forma más estructurada posible.
ÁREA 2D Y SEÑALES |
Un requisito indispensable en cualquier proyecto es la detección del personaje cuando pierde una vida. En este ejemplo, vamos a crear un nivel de plataformas en el que el personaje cae por una abertura y el programa detectará que el personaje muere.
Para ello, vamos a generar una abertura en nuestro escenario por donde caerá el personaje “en caída libre.”
Por lo tanto ahora será necesario introducir en nuestro escenario un nuevo elemento que contacte con nuestro personaje. En este ejemplo añadiremos dicho elemento debajo del precipicio.
Para este tipo de elementos de detección se utilizan los Nodos de Área2D. Permiten definir áreas invisibles al jugador. Creamos un Nodo Área2D hijo de la Escena Nivel1:
Una vez añadido el Nod Área2D es necesario añadir un Nodo de Tipo CollisionShape2D para la detección de colisiones y añadirle una forma al CollisionShape, en este caso un rectángulo.
Y arrastramos la forma al lugar indicado en nuestro escenario, en este caso lo situamos debajo del precipicio. Recordad que podemos redimensionar la forma.
Los Nodos Área2D trabajan con señales. Ahora trabajaremos con una señal para indicar que el personaje toca dicha área.
Iremos al Nodo Área2D y cambiaremos a la pestaña Nodos (ventana derecha) que tenemos al lado de la pestaña de las propiedades.
Ahora hay que indicarle que “un cuerpo” ha ingresado en su región. Seleccionamos con doble Click la función body_entered(body: Node)
y a continuación le indicamos qué “cuerpo” ha entrado en su área. En este caso deberemos conectarlo con el Nodo Player.
Conectar una señal a un Método:
Una vez conectada la señal, se crea una función en el Script del Player:
func _on_Area2D_body_entered(body): pass # Replace with function body. |
y es aquí donde le indicaremos qué es lo que deseamos que se haga cuando el Player ha entrado en contacto con el Área2D
En este tema, mostraremos un mensaje por Consola:
unc _on_Area2D_body_entered(body): print(“EL PLAYER TOCA EL ÁREA”) |
Probamos el proyecto vemos que cuando el personaje cae y toca el Área2D se muestra el mensaje:
REINICIAR UNA ESCENA |
En este tema veremos cómo modificamos el texto que se mostraba cuando el personaje tocaba el Área2D por un reinicio de escena.
En el motor de Godot existe una función que se utiliza mucho llamada get_tree() que gestiona la estructura de una escena del juego.
Usaremos un método de la función get.tree() para reiniciar la escena actual:
func _on_Area2D_body_entered(body): get_tree().reload_current_scene() |
Tal y como hemos implementado el código, funciona bien, pero hay un pequeño problema. Puede ocurrir que otro objeto que no sea el Player acceda o toque el Área2D, por ejemplo, imaginemos que un enemigo también pueda caer en el agujero y pueda tocar al Área2D.
Para asegurarnos que sea el jugador el que toque reinicie la escena cuando toque el Área2D podemos establecer una condición preguntando si es el Personaje el que ha tocado dicha área.
func _on_Area2D_body_entered(body): if body == self: get_tree().reload_current_scene() |
Como el Área2D está conectada con el Player, cuando el cuerpo del Player sea él mismo identificará que es el Player el que ha tocado con el Área2D en caso de ser otro cuerpo la condición será falsa y no se ejecutará el reinicio de escena.
DUPLICAR ÁREAS 2D |
Imaginad que ahora queremos hacer el mismo proceso, es decir, que el Player caiga por un agujero y se reinicie la escena, pero claro está teniendo varios agujeros. La forma más sencilla de hacer esto, es duplicando las Áres2D.
Para ello, lo primero que haremos será crear 3 huecos en los TileSets:
Ahora podemos Duplicar las áreas. Nota: Si renombramos las áreas con un número al final, Godot añade un número más al área duplicada, como un contador. Y lo hace de forma automática. Esto no es necesario pero puede ser útil.
Renombro mi Área2D a Area2D1 y la duplico 3 veces, nos ponemos encima y botón derecho del ratón Duplicar o CMD+D
Ahora si el personaje cae por cualquier agujero, la escena se reinicia. No hay que tocar el código.