Movimiento y salto en Godot Engine


Si eres nuevo en Godot Engine es probable que quieras aprender a mover cosas dentro de una escena. En esta entrada te mostrare como cumplir ese objetivo y, además, a aplicar gravedad.



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

Voy a tratar de explicar detalladamente lo que hace cada código.

Movimiento, gravedad y salto en Godot Engine 3.0

No tienen que preocuparse por los otros nodos, se usan simplemente para formar el nivel y ajustar la cámara de la escena. Nuestro objetivo es aprender a programar el movimiento y la posibilidad de salto para nuestro personaje, así que entren directamente en la hoja de código del nodo "Jugador" formado por un KinematicBody, uno de los tres cuerpos físicos dentro de Godot.



Variables con "export"


Primero vamos a encontrar las variables que tienen la palabra "export" al comienzo. Si nos dirigimos al inspector de nodos vamos a encontrar el nombre de la variable con su respectivo valor, y vamos a poder cambiarlo. Para eso es que usamos el export, es una forma más rápida de cambiar valores en las variables que se usan para manejar velocidades o tiempo.


Aplicando la función "_plysics_process"

Como vamos a trabajar con físicas, no podemos usar la función para proceso normal (_process), debemos especificar lo que queremos, por eso se usa el "_physics_process", especial para procesos físicos.



Uso de una función única para el movimiento

 

Cuando trabajo en los movimientos de un objeto utilizo una función para controlar las colisiones y las acciones del jugador en las teclas. Al ser algo tan importante y que siempre se debe estar comprobando, llamo a la función "_move(delta)" cada segundo. Se le tiene que pasar la variable "delta" para que al hacer los cálculos de movimiento dentro de _move, se pueda trabajar con el tiempo, algo importante en la física. En caso de que tengan otro nombre para la función _move, se lo pueden poner. No es obligatorio llamarla _move(), la pueden definir como "mover" o "movimiento".

Teclas presionadas






Hay varias formas para calcular el movimiento según las teclas presionadas. Uno muy sencillo es sumar o restar cuando presionamos las teclas que queremos. Sabemos que la izquierda es -1 y la derecha 1, por lo tanto ponemos que en caso de ser la tecla izquierda la presionada se reste un 1 al 0 y en caso contrario, que se sume.

Fórmulas para el movimiento

Para el movimiento podemos usar fórmulas físicas muy sencillas que pueden ver en este enlace: https://www.youtube.com/watch?v=TbB-qfWwV3E (El vídeo no es mio, espero que pronto pueda hacer mi propio material para cubrir youtube) con estudiar un poco sobre el "Movimiento rectilíneo uniforme M.R.U" vamos a entender las fórmulas, en caso de que no las conozcas.

Todo número multiplicado por 1, da el mismo número. Por lo tanto, nuestro -1 o 1 encerrado en "moveX" sólo se usa para saber que dirección tomar, si ninguna tecla se presiona, da 0 y todo número multiplicado por 0...

Aplicar los valores calculados

Ya tenemos todos los cálculos para que el personaje se mueva. Sólo tenemos que aplicarlo usando "move_and_slide()", con ese código vamos a necesitar dos parámetros: el primero es la velocidad que acabamos de calcular y el segundo es el lugar donde vamos a ubicar nuestro "suelo", el collider que va a simular el lugar donde nuestro personaje pone los pies xd. Por ejemplo, si tenemos una caja nuestro personaje se tiene que parar en la parte de arriba de la caja, la cual se representa como -1 en el eje Y (vertical), ya que el -1 es el que va hacia arriba y el 1 para abajo. 

Detectar suelo y aplicar la posibilidad de saltar

Ya estamos listos, sólo tenemos que decir que en caso de chocar con ese "suelo" (floor) la gravedad se desactive para que no sigamos cayendo. Además podemos agregar el salto dentro de la condición del suelo, para que sólo pueda saltar en caso de estar en el suelo.




Espero que mi primer "tutorial" les sea de utilidad. Sé que tengo que mejorar, pero no tengo mucho tiempo para preparar las publicaciones, mi ventaja es que enseñando, puedo practicar Godot. La cosa es tener que explicar todo mi código después xD, pero tengo la intención de hacer una publicación por semana con un vídeo corto que ayude a entender.

Desde el Nautilus, me despido.

Comentarios

  1. Muy buen artículo, me quede con ganas de más ... :D
    Cuando tengas tiempo pon un registro para newsletters y así podemos recibir notificaciones por email, sobre el material nuevo que vayas creando.

    Saludos!!!
    Happy Hacking!!!

    ResponderEliminar
  2. Hola muy buen artículo, pero tengo una duda, cuando aplicas las fórmulas de movimiento pones:
    distancia.x = speed*delta
    velocidad.y += gravedad*delta
    velocidad.x = (moveX*distancia.x)/delta
    pero acaso en la primera linea, no seria lo mismo que poner:
    velocidad.x = (input_x * speed * delta)/delta
    y a la vez eso no es lo mismo que poner direcrtamente:
    velocidad.x = input_x * speed

    ResponderEliminar
    Respuestas
    1. Sí. Te puede funcionar, pero me pareció mejor hacer mención de las fórmulas exactas para evitar confusiones.

      Eliminar
  3. GRacias muy bueno,no tenia en cuenta el usar el delta dentro de una función que la creas por afuera del bucle principal:muchas gracias esperamos más post que hay muy poco sobre todo escrito....Este blog tendria que terminar convertido en un pdf...Saludos.

    ResponderEliminar
    Respuestas
    1. Sí, pronto voy a pasar todos los artículos a una versión de pdf. Gracias por tu comentario :)

      Eliminar
  4. Hola, gracias por los tutoriales. Dos preguntas: ¿podrías hacer un tutorial básico explicando el concepto de "nodo" en Godot? y ¿cómo cambiar el tipo de nodo en el nodo principal de un programa? Gracias

    ResponderEliminar
    Respuestas
    1. ¿Te refieres a cambiar el tipo de nodo desde código? entre la segunda y primera semana de febrero voy a publicar lo que pides. Gracias por el comentario :)

      Eliminar
  5. Ta bueno lo de las teclas precionadas :V

    Una cosa, no es necesario utilizar delta cuando usas move_and_slide(), ya que viene con un delta incluido por dentro.

    ResponderEliminar
    Respuestas
    1. pero ahora que lo pienso el delta te sirve para el movimiento

      Eliminar
  6. Acabo de encontrar este blog, y es genial! Muchas gracias por el tuto, voy a empezar seguirlos.

    ResponderEliminar

Publicar un comentario