Creando un jueguito Roguelike. Parte 4

Programando al personaje
En esta entrada vamos a programar el movimiento del personaje y sus mecánicas de apuntado. Tendremos que definir algunas variables, configurar nodos e implementar la lógica necesaria.
Seleccionaremos al nodo Personaje y le agregaremos un script. A este lo guardamos en la carpeta Programas como personaje.gd.
Definiendo variables
Las variables que necesitamos son:
velocidad_movimiento: Esta determina qué tan rápido se mueve el personaje. La haremos tipoexportpara poder editarla en el inspector.sprite: Hará referencia al nodo sprite del jugador.pivote_arma: Hará referencia al nodo alrededor del cual rotará el arma.cannon: Esta hará referencia al cañón del arma, es decir, al punto de donde saldrán los proyectiles.
Las últimas tres variables serán configuradas como onready para asegurar que los nodos se inicien correctamente cuando se carguen en el árbol de escenas.
El código necesario para la definición de las variables se muestra a continuación:
@export var velocidad_movimiento : float = 50
@onready var sprite : Sprite2D = $Sprite
@onready var pivote_arma : Node2D = $Arma
@onready var cannon : Node2D = $Arma/CannonImplementando el movimiento
Para mover al personaje usaremos la función _physics_process(), la cual es llamada cada vez que se genera un cuadro y gestiona los movimientos basados en físicas.
La lógica que usamos para implementar el movimiento obedece al siguiente proceso:
- Obtener la entrada de movimiento del jugador usando la función
Input.get_vector(). - Asignar los tiempos de entrada de movimiento al vector de velocidad del jugador.
- Llamar la función
move_and_slide()para aplicar el vector velocidad al jugador y detectar colisiones.
El código necesario se muestra enseguida:
func _physics_process(delta: float) -> void:
var entrada_mover : Vector2 = Input.get_vector("mover_arriba","mover_abajo","mover_izquierda","mover_derecha")
velocity = entrada_mover * velocidad_movimiento
move_and_slide()Implementando el apuntado
Para hacer que el arma rote siguiendo al cursor, usaremos la función _process(). Esta función es llamada cada cuadro y gestiona actualizaciones que no están basadas en físicas. Los pasos para implementar el apuntado son:
- Obtener la posición del ratón usando la función
get_global_mouse_position(). - Calcular la dirección desde el jugador hacia la posición del ratón.
- Normalizar el vector dirección.
- Ajustar la rotación del pivote del arma basados en el vector dirección.
- Convertir la rotación de radianes a grados usando la función
rad_to_deg(). - Ajustar la rotación tras agregar 90° para apuntar el arma en la dirección correcta.
El código se proporciona enseguida:
func _process(delta: float) -> void:
var posicion_raton : Vector2 = get_global_mouse_position()
var direccion_raton : Vector2 = (posicion_raton - global_position).normalized()
pivote_arma.rotation_degrees = rad_to_deg(direccion_raton.angle()) + 90Rotando al sprite
Para conseguir el efecto de que el personaje se gire hacia donde apunta el cursor agregaremos la siguiente línea al final de _process():
sprite.flip_h = direccion_raton.x < 0Guardando al personaje como escena
Vamos a guardar al personaje como una escena independiente, lo cual nos permitirá reutilizarlo tantas veces como queramos.
Para ello, nos dirigimos al panel de Escenas, seleccionamos el nodo Personaje, damos clic derecho y seleccionamos Guardar rama como escena y guardamos como personaje.tscn.
Y listo. El personaje ya se mueve y apunta. En la siguiente entrada veremos cómo crear y generar las diferentes mazmorras del juego.