Pasar por una puerta con una llave Godot Engine

 
Si tienes ganas de aprender a cambiar de escena en Godot aplicando el método de "pasar por puertas" entra aquí.

El proyecto que he realizado y que puedes usar para hacer las pruebas se encuentra aquí: descarga

Voy a tratar de explicar detalladamente lo que necesitamos para nuestro objetivo:

Crear los nodos


Estos son los nodos que vamos a necesitar. La casa es un simple sprite que tiene un Area2D para señalar la puerta, y la llave un StaticBody2D para detectar más fácilmente su colisión con el jugador,  aunque también puede usarse un Area2D para la llave.

Vamos a añadir un grupo "Jugadores" para el nodo del jugador y un grupo "Llaves" para el nodo de la llave. Si no sabes asignar grupos puedes ver: grupos en godot

En nuestra escena de "casa" vamos a crear un nodo Area2D y su collision_shape, posicionando en el lugar donde queremos la puerta.

Pasamos al código



Dentro de la hoja de código de nuestra "casa" vamos a definir dos variables: la primera (escena_cuarto) se encarga de guardar el "paquete" de escena, usamos export para poder seleccionar un paquete desde el selector de archivos y arrastrarlo a la variable. La segunda se encarga de guardar el nodo de área2D que creamos dentro de la casa, ya que así podemos controlar la entrada del jugador en la zona de la puerta sin necesidad de usar las señales de nodo.

Saber si se entra en la puerta

 
Aquí hacemos una comprobación sencilla: con el get_overlapping_bodies() vamos a tener una lista con todos los cuerpos físicos que entren en el área, si tenemos la entrada de muchos cuerpos a la vez podemos tener un error, por eso es que uso un bucle for para comprobar toda la lista de cuerpos y al encontrar uno que se encuentra en el grupo de "Jugadores" hacer todo lo demás. Con los && podemos decir que esa condición se cumpla sólo si todos los valores de la condición son ciertos, los && es lo mismo que poner "and" para separar cada condición. En caso de que se cumpla, (porque el jugador tenga la llave en true, se presione la tecla de abajo y se encuentre en la puerta) va a hacer un cambio de escena "get_tree().change_scene_to(escena_cuarto)" nos va a dirigir a la escena que hemos puesto en el inspector, en caso de que no pongan nada los va a dirigir a una escena vacía.

Es importante resaltar que la escena a la que queremos mandar a nuestro personaje,  se ponga en la instancia de la escena "casa" y no dentro de la escena principal. Ya que siempre nos dirigiría a una escena en especifico y no a cuartos diferentes como es probable que se quiera.

Agarrar llave desde el jugador


En el jugador sólo tenemos que crear la variable "llave_puerta" y decir que por defecto es falsa. Después, dentro de la función  _move() que es creada por mi para calcular las colisiones, agregamos una condición para que la variable se convierta en verdadera.

Con "get_slide_collision()" vamos a obtener todas las colisiones que se produzcan cuando se choca con algo usando un "move_and_slide()", le tenemos que poner de parámetro un "get_slide_count()) ya que nos va a decir con cuantas cosas hemos chocado, pero al usar ese comando nos va a devolver un 1 en caso de chocar con una cosa o un 2 en caso de chocar con dos cosas. Pero como deben saber, al trabajar con Arrays[] el primer indice dentro de ella es un 0 (Array[0] = algo) por eso tenemos que usar (get_slide_count()-1)

Cada vez que se produce una colisión se retorna un diccionario con valores que podemos usar. Uno de ellos es el ["collider"] que nos dice directamente con qué nodo hemos chocado y nos permite obtener su nombre y grupos, y muchas otras cosas que no necesitamos por ahora. Ya sólo queda decir lo que queremos que pase cuando se cumplan las condiciones, en mi caso quiero que la variable llave sea verdadera y el nodo de la llave ("collider") se destruya cuando choquemos con él. 
Eso es todo, espero que esta información les sea de ayuda.

Desde el Nautilus, me despido

Comentarios

Entradas populares de este blog