Godot 2D #3 Movimiento TopDown avanzado

¡Muy buenas a todos!
Es hora de mejorar nuestro sistema de movimiento.
Para ello, vamos a utilizar como base el sistema de movimiento que hemos creado con anterioridad, es decir, el Movimiento TopDown.
Esta entrada corresponde a la parte escrita del vídeo que he hecho en YouTube. Si quieres ver este mismo tutorial de una forma más visual, no dudes en verte el vídeo.
Además, este vídeo incluye mucha más información y explicaciones gráficas que te ayudarán a comprender mejor qué es lo que estamos haciendo. Así que no lo dudes, y échale un ojo.
Vídeo de este tutorial:
Dicho todo esto, ¡Vamos al lío!
Si has seguido las instrucciones del tutorial para hacer el sistema de movimiento básico, tendrías que tener algo parecido a lo siguiente:
extends KinematicBody2D var motion = Vector2() func _physics_process(delta): motion=Vector2(0,0) if Input.is_action_pressed("ui_right"): motion.x = 100 elif Input.is_action_pressed("ui_left"): motion.x = -100 elif Input.is_action_pressed("ui_left"): motion.y = -100 elif Input.is_action_pressed("ui_left"): motion.y = 100 motion=move_and_slide(motion)
Cuando tengas todo listo es hora de empezar a cambiar cosas. Como habrás podido ver en el vídeo de este tutorial, nuestro objetivo es crear dentro de nuestro juego 3 velocidades distintas:
- Andar: velocidad que tendrá nuestro personaje al andar.
- Correr: velocidad que tendrá nuestro personaje al correr.
- Agachado: velocidad que tendrá nuestro personaje al caminar agachado.
Para ello, tendremos que decirle al entorno qué teclas queremos utilizar en nuestro teclado, para que Godot sepa cuándo estamos corriendo o cuándo estamos agachados. Si no sabes como hacerlo, aquí puedes aprenderlo.
En nuestro caso "Correr" será la tecla "Shift" y "Agachado" , será la tecla "Control". Aquí tienes una foto de cómo debería quedar al crear las acciones:

Lo primero que tenemos que hacer es crear las diferentes variables que van a almacenar las distintas velocidades que tendrá nuestro personaje. Para ello, vamos a crear estas variables junto a la variable "motion". Una vez que las tengamos, pondremos unas velocidades acorde a lo que nosotros queramos que nuestro personaje tenga. Por ejemplo, la velocidad al andar va a ser de 10, la de correr será de 20 y cuando estemos agachados, la velocidad será de 5. Por supuesto todos estos valores los podemos customizar a nuestro antojo dependiendo de las características que queramos tener en nuestro juego.
Luego crearemos una variable llamada "SPEED", que será la que usaremos para multiplicar nuestro vector "motion". Esta velocidad la iremos cambiando a lo largo del código dependiendo de lo que esté ocurriendo o lo que estemos haciendo, además, esto irá cambiando a su vez.
Si quieres los valores que he utilizado en el vídeo y en este tutorial los tienes en este código:
extends KinematicBody2D var motion = Vector2() var vel_walk = 10000 var vel_run = 50000 var vel_crouch = 2000 var SPEED = 0

Como ya has visto en el vídeo, el problema es que al movernos en diagonal, nuestro personaje va más rápido que si nos desplazamos en vertical o en horizontal. Esto es debido a que la magnitud del vector que le damos para moverse en diagonal es mucho mayor (en la parte de "explicación" del vídeo tienes esto mismo con ejemplos visuales para que lo entiendas mejor).
Entonces, ¿Cómo solucionamos esto? Muy simple. Lo que nos interesa saber es la dirección que nuestro personaje debe de tomar, no la magnitud. Así que lo que haremos es trasnformar todos estos vectores para quedarnos sólo con la dirección, diciéndole a Godot "Ey, quiero que, sin importar el vector que te pase, tú me lo pongas con la misma magnitud todos".
En términos matemáticos lo denominaríamos "normalizar el vector". Esto nos permite tener vectores cuya magnitud (longitud de la flecha) sea la misma, para luego multiplicarlos por la velocidad que nosotros queramos. Para poder realizarlo dentro de Godot, basta con decir que coja nuestro vector "motion" (o como se llame nuestro vector con el que le decimos a nuestro personaje que se mueva) y que lo normalice. Para ello, vamos a añadir debajo de los controles la siguiente línea de código:
motion = motion.normalized()

Una vez que tengamos esto, nuestro vector "motion" ya estará normalizado.
A partir de aquí, será donde le digamos a Godot que nos cambie la velocidad, y para ello vamos a decirle que, si estamos pulsando la tecla de correr o agacharse nos cambie "SPEED" a la velocidad que queramos y que si no, nos la iguale a la velocidad de andar.
Todo esto lo programaremos justo después de donde hemos normalizado "motion". Para ello vamos a usar este código de aquí:
if Input.is_action_pressed("Running"): SPEED=vel_run elif Input.is_action_pressed("Crouch"): SPEED=vel_crouch else: SPEED=vel_walk
Una vez tengamos esto completado, el sistema estará básicamente listo, únicamente nos quedará multiplicar nuestro "motion" por "SPEED" dentro de la función de "move and slide()".
Una cosa importante que tenemos que destacar, es que cuando multipliquemos nuestro vector por la velocidad, también deberemos hacerlo por "delta". Esto nos permitirá que sin importar el ordenador que estemos usando, esta función se ejecute sin problemas y que funcione de la misma manera.
El código final debería quedarte así:
extends KinematicBody2D var motion = Vector2() var vel_walk = 10000 var vel_run = 50000 var vel_crouch = 2000 var SPEED = 0 func _physics_process(delta): motion=Vector2(0,0) if Input.is_action_pressed("ui_right"): motion.x = 100 elif Input.is_action_pressed("ui_left"): motion.x = -100 elif Input.is_action_pressed("ui_left"): motion.y = -100 elif Input.is_action_pressed("ui_left"): motion.y = 100 motion = motion.normalized() if Input.is_action_pressed("Running"): SPEED=vel_run elif Input.is_action_pressed("Crouch"): SPEED=vel_crouch else: SPEED=vel_walk motion=move_and_slide(motion*SPEED*delta)

¡Y listo!
Ya tendríamos a nuestro personaje con diferentes velocidades preparado para la acción.
En el momento que ejecutemos el juego veremos que: sino pulsamos nada, el personaje irá a la velocidad de andar; si pulsamos "Shift" irá más rápido; y si pulsamos "Control", el personaje irá más lento.
Si tienes cualquier tipo de duda no dudes en ponerme un comentario aquí debajo o en el propio vídeo, e intentaré contestarte lo más rápido posible.
¡Nos vemos!
El vídeo de este tutorial:
Mi canal de YouTube:
https://www.youtube.com/channel/UCAwrHOXBtRvfw034z7BjIhw