Cómo hacer el efecto de «cámara lenta» en Godot Engine

por Mar 25, 2020Aprende, Tutoriales0 Comentarios

¡Hola gente! ¿Cómo están? En este tutorial aprenderemos a hacer un efecto de cámara lenta para nuestros juegos en Godot Engine. Esto que aplicaremos lo he aprendido desde el canal de Game Endeavor, dejaré el enlace por aquí.

Si tienes una buena conexión a internet, quizás te interese ver la versión en vídeo de este tutorial 👇️

Para muchos puede ser interesante introducir un efecto de ralentización cuando matamos a un enemigo importante, pasamos por una zona extraña o descubrimos un nuevo item.

No es una tarea tan complicada porque Godot cuenta con una función muy interesante que nos permite jugar con la velocidad del motor entero, pudiendo retrasarlo o acelerarlo. Sin embargo esto último supongo que lleva cuidado, porque si estamos con algo muy grande entre manos y le damos más velocidad, uff, sólo imagina si ya tenías bajones de fps con el juego normal.

Bien, es momento de empezar. Añadan un nuevo nodo de los básicos y le ajustan un script. Las variables que usaremos son:

Valor final, o end value. Esta constante representa el tope de nuestro motor. La velocidad máxima que puede alcanzar. Una velocidad de 1.0 es la normal, un 2.0 es el doble de la velocidad normal, por consiguiente, tener menos de 1.0 es retrasar el motor y obtener nuestro efecto de lentitud.

Necesitamos tres variables flotantes para guardar el tiempo en que inicia el efecto, la duración en milisegundos y el valor inicial de “fuerza” con la que literalmente golpearemos al tiempo.

La última variable es un booleano para comprobar que la ralentización esté activa.

Pasemos ahora a la función que inicia el efecto, se llamará start. Contará con dos parámetros para que seamos capaces de controlar la duración en segundos y la fuerza de nuestra ralentización. Si decidimos no cambiar esos parámetros, podemos asignarles un valor por defecto con el signo de igual: la duración será de 0.4 segundos y la fuerza de 0.9.

Dentro de la función la variable de time_start va a ser igual al tiempo en milisegundos que el motor tiene activo desde que empezó a ejecutarse el juego. Después la duración en milisegundo será igual al parámetro que definimos arriba por mil. Recuerden que el parámetro de duración que usamos en la función está en segundos, cada segundo son 1000 milisengundos. Ya con esto diremos que el valor de fuerza inicial será igual a 1.0 menos la fuerza que indicamos en el segundo parámetro.

Para finalizar con esa función escriben que la propiedad time_scale de la clase Engine, que guarda las funciones básicas del motor, sea igual al valor de fuerza que acabamos de calcular. Cerramos diciendo que el efecto está activo.

En la función de proceso abriremos una condición para ver si la variable is_active es verdadera. En este caso el tiempo en milisegundos ya debió haber cambiado, así que lo volvemos a calcular en una variable llamada “current_time” que sea igual al nuevo tiempo del motor en milisegundos menos el primero, nos servirá para comprobar cada frame cuánto tiempo hemos avanzado desde que inició el conteo.

Para asignar el valor con el que ralentizaremos el tiempo, haremos uso de las Easing Equations o ecuaciones de aceleración. Las ecuaciones de aceleración determinan la velocidad en la que un parámetro cambia su valor a lo largo del tiempo. La ecuación que utilizaremos en este vídeo se encuentra en esta otra página donde se describen las ecuaciones. No sabía de la existencia de estos recursos hasta que lo encontré en el vídeo del que me estoy basando, así que muchas gracias Game Endevor.


Estas ecuaciones manejan cuatro parámetros: el primero es el tiempo actual, el segundo es el valor que cambiará, el tercero es el número máximo que puede alcanzar y el cuarto es la duración en milisegundos, que es nuestro caso, en que tardará para llegar al valor máximo.

Definiremos así la ecuación, tal cual como se indica en el sitio web.

Volviendo a nuestra función de proceso nos falta otra comprobación que sea para saber que si el tiempo actual ya es tanto como para ser mayor a la duración que establecimos al inicio del script, entonces el efecto pase a ser falso y el valor directamente se posicione con el que máximo, es decir, la velocidad normal del motor, que es 1.0.

Mientras no se cumpla esa segunda condición, la escala del tiempo en la clase Engine será igual al nuevo valor que se ha estado calculando en la variable “value” con la ecuación de aceleración.

Ya que hemos terminado, lo único que tenemos que hacer cuando queramos activar la ralentización, es acceder al nodo y llamar a su función de start(). Miren un ejemplo: si ponemos este nodo como hijo de cualquier otro, yo voy a usar de ejemplo el estado Hit de un cerdo, que se ejecuta siempre que recibe un golpe, sólo tenemos que acceder con el símbolo de dólar a ese nodo y llamar a la función start, nisiquiera hay que escribir parámetros porque ya pusimos unos por defecto.

Espero que este tutorial te sea de ayuda, recuerda pasar por el canal de Game Endeavor, siempre está publicando contenido más interesante que el mio.


Patreon 🦊️

Muchas gracias a esas personas que me envían una donación o son parte de mi campaña en Patreon, ya que hacen posible este contenido. Nos vemos más tarde 🙂️.

¡Comenta! 👇️

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¿Qué son los setters/getters en GDScript?

¿Qué son los setters/getters en GDScript?

En varios tutoriales donde hago uso de la palabra reservada "setget", dejo el enlace con la explicación de la documentación oficial sobre esa función. Sea porque en una que otra ocasión me haya olvidado de enlazar al manual, o todavía no se entienda bien, llegan...