Creando un jueguito Roguelike. Parte 7

Configurando las entradas a los cuartos
En esta parte nos vamos a enfocar en los cuartos y las entradas a los mismos. Comenzaremos con un script sencillo que nos permitirá realizar pruebas, para luego movernos a uno más complejo.
Variables
Definiremos las variables necesarias. Requerimos un enumerador para las direcciones. Este será definido en el script cuarto.gd para centralizar los datos, lo cual se hace como sigue:
enum Direccion
{
NORTE,
OESTE,
ESTE,
SUR
}Luego, en entrada_cuarto.gd vamos a definir la variable de dirección usando el enumerador:
@export var direccion : Cuarto.Direccion = Cuarto.Direccion.NORTEEnseguida vamos a crear algunas variables que hagan referencia a ciertos nodos en el mismo script:
@onready var barrera : StaticBody2D = $Barrera
@onready var barrera_collider : CollisionShape2D = $Barrera/CollisionShape2D
@onready var puerta : Node2D = $Puerta
@onready var puerta_cerrada : StaticBody2D = $Puerta/PuertaCerrada
@onready var puerta_cerrada_collider : CollisionShape2D = $Puerta/PuertaCerrada/CollisionShape2D
@onready var jugador_spawn : Node2D = $JugadorSpawn
@onready var disparador_salida : Area2D = $DisparadorSalida
var vecino : CuartoFunciones
Toca definir las funciones en el mismo script. Vamos a poner únicamente la estructura y más delante las iremos rellenando.
func _ready():
pass
func colocar_vecino(cuarto_vecino : Cuarto):
pass
func colocar_barrera(colocar : bool):
pass
func abrir_puerta():
pass
func cerrar_puerta():
pass
func _on_body_entered_disparador_salida(body):
passFunción _ready()
Vamos a conectar mediante código la señal body_entered del disparador_salida a la función _on_body_entered_disparador_salida().
func _ready():
disparador_salida.body_entered.connect(_on_body_entered_disparador_salida)Función obtener_direccion_vecino()
Debajo de las funciones que ya hemos definido, toca crear una nueva, que obtendrá la dirección de la entrada vecina:
func obtener_direccion_vecino() -> Cuarto.Direccion:
if direccion == Cuarto.Direccion.NORTE:
return Cuarto.Direccion.SUR
elif direccion == Cuarto.Direccion.SUR:
return Cuarto.Direccion.NORTE
elif direccion == Cuarto.Direccion.OESTE:
return Cuarto.Direccion.ESTE
else:
return Cuarto.Direccion.OESTEFunción abrir_puerta()
Esta abrirá la puerta por poner en falso a puerta_cerrada y deshabilitar su collider. Necesitamos devolver tempranamente si es que hay una barrera.
Completamos su función como sigue:
func abrir_puerta():
if barrera.visible:
return
puerta_cerrada.visible = false
puerta_cerrada_collider.disabled = trueFunción cerrar_puerta()
Simplemente será lo inverso de la anterior:
func cerrar_puerta():
if barrera.visible:
return
puerta_cerrada.visible = true
puerta_cerrada_collider.visible = falseFunción colocar_barrera()
Alternará la visibilidad y colisión de la barrera, basada en el valor lógico de entrada.
func colocar_barrera(colocar : bool):
barrera.visible = colocar
barrera_collider.disabled = !colocar
puerta.visible = !colocarFunción colocar_vecino()
Esta función será llamada cuando queramos definir un cuarto vecino para esta entrada.
func colocar_vecino(cuarto_vecino : Cuarto):
vecino = cuarto_vecino
colocar_barrera(false)Antes de continuar, debemos asegurarnos de definir la clase EntradaCuarto justo al inicio de este archivo, antes del extends:
class_name EntradaCuarto
En la siguiente entrada nos enfocaremos en el programa cuarto.gd, donde gestionaremos las entradas y las conectaremos con nuestro generacion_cuartos.gd.