Tema 10. Godot Engine. Acciones del personaje.
PERSONAJE EN REPOSO |
En el tema anterior la animación cambiaba de dirección en función de la tecla pulsada Izquierda o derecha.
En este tema ampliaremos la animación con el personaje en reposo. Es decir, cuando no se pulsa la tecla izquierda o derecha, el personaje deberá permanecer en un estado de animación en reposo.
Primero tendremos que crear una nueva animación en el Nodo Animation que represente cómo queremos que se muestre nuestro personaje en reposo.
Dada nuestra matriz del personaje:
Por ejemplo, podremos establecer la animación en reposo desde los índices 4 a 7. Empezando siempre desde el índice 0.
Creamos la animación Idle de la misma forma que hemos creado la animación Left y Right
Marcaremos el loop para que se anime de forma continua cuando esté parado.
Nuestro personaje en estado Idle aparecerá en esta posición y de animará:
Ahora modificaremos el código y le indicaremos que cuando las teclas Left y Right no estén pulsadas, que se visualice la animación Idle. Abrimos el Script del personaje:
func _process(delta): if Input.is_action_pressed(«Player_Left»): $AnimationPlayer.play(«Left») if Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Right») if !Input.is_action_pressed(«Player_Left») and !Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Idle») |
La admiración delante de la condición, la niega. Esto se lee así: Si la tecla izquierda no está pulsada y la tecla derecha no está pulsada.
El operador and no permite verificar que la tecla Left (Y and) la tecla Right no se están pulsando.
MOVIMIENTO HORIZONTAL |
Una vez hemos definido las animaciones de nuestro personaje, ahora vamos a darle movimiento tanto hacia la izquierda como hacia la derecha.
Primero, vamos a crear una variable para establecer la velocidad. Esta variable será de tipo vector, que establece las dimensiones para x y para y.
var velocidad = Vector2() |
Escribimos var delante de la variable. No hace falta indicar el tipo de variable. Y le decimos que será de tipo Vector2.
Para mover el personaje hacia la izquierda tendremos que disminuir la variable x del vector2
func _process(delta): if Input.is_action_pressed(«Player_Left»): $AnimationPlayer.play(«Left») velocidad.x = -100 if Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Right») velocidad.x = 100 if !Input.is_action_pressed(«Player_Left») and !Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Idle») velocidad.x = 0 move_and_slide(velocidad) |
Asignamos al movimiento izquierda el valor de la x del vector a -100
Asignamos al movimiento derecha el valor de la x del vector a 100
Y usamos la función move_and_slide(velocidad) que le pasamos el vector velocidad y que será la encargada de realizar el movimiento.
Iniciamos el programa y probamos a mover el personaje. Cambiamos el valor de la variable de 100 a 200 para que se desplace más rápido.
CAÍDA DEL PERSONAJE (GRAVEDAD) |
Ahora el personaje caerá hacia abajo si no encuentra una plataforma.
Para hacer esto solo debemos decirle a nuestro personaje que siempre vaya hacia abajo. Como hemos definido plataformas de tipo staticBody2D si se encuentra con una plataforma se quedará sobre ella.
Añadimos la variable velocidad.y = 200 para que el personaje vaya siempre hacia abajo.
func _process(delta): velocidad.y = 200 if Input.is_action_pressed(«Player_Left»): $AnimationPlayer.play(«Left») velocidad.x = -100 if Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Right») velocidad.x = 100 if !Input.is_action_pressed(«Player_Left») and !Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Idle») velocidad.x = 0 move_and_slide(velocidad) |
Y si nos desplazamos hacia la derecha, entonces caerá sobre la segunda plataforma:
El código que hemos usado sirve para representar una caída constante. Si queremos representar una caída acelerada entonces añadiremos las siguientes líneas al código:
Sumamos a cada paso de ser dibujado nuestras imágenes en pantalla el valor acumulado de y y multiplicamos por delta que determina los fps por segundo en cada dispositivo.
func _process(delta): velocidad.y += 200 * delta if Input.is_action_pressed(«Player_Left»): $AnimationPlayer.play(«Left») velocidad.x = -100 if Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Right») velocidad.x = 100 if !Input.is_action_pressed(«Player_Left») and !Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Idle») velocidad.x = 0 move_and_slide(velocidad) |
SALTO DEL PERSONAJE |
Para realizar el salto de nuestro personaje, primero lo que haremos será crear las teclas apropiadas en nuestro mapa de editor de teclado. Ver Configurar acciones.
Añadimos la acción «Jump» y asignamos la tecla que queramos de nuestro teclado.
Y añadimos el código que verifica si la tecla de salto está pulsada. Un salto del personaje hacia arriba se representa decrementando la coordenada velocidad.
func _process(delta): velocidad.y += 200 * delta if Input.is_action_pressed(«Jump»): velocidad.y = -200 if Input.is_action_pressed(«Player_Left»): $AnimationPlayer.play(«Left») velocidad.x = -100 if Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Right») velocidad.x = 100 if !Input.is_action_pressed(«Player_Left») and !Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Idle») velocidad.x = 0 move_and_slide(velocidad) |
Esta implementación tiene un pequeño problema, y es que si pulsamos la tecla salto de forma seguida, el personaje no para de elevarse hacia arriba. Esto sucede porque no hay un límite establecido para saltar.Para ello tenemos que indicarle que no vuelva a saltar hasta que no haya tocado el suelo (plataforma).
FUNCIÓN is_on_foor() |
La función is_on_floor nos informa que el personaje ha tocado o está tocando el suelo.
Para ello añadimos la siguiente restricción al salto:
if Input.is_action_pressed(«Jump») and is_on_floor(): |
Pero si ejecutamos el programa, veremos que el personaje no salta. Esto es debido a la función move_and_slide(velocidad) que solo está testeando la velocidad en el eje x.
Para ello debemos indicar a la función move_and_slide la dirección de salto del personaje para que el motor de juego pueda calcular el movimiento en vertical.
move_and_slide(velocidad,Vector2(0,-1))
Además, si queremos establecer una animación del personaje saltando, lo tenemos fácil con la función is_on_floor() porque en el caso de que el personaje no esté en el suelo ( !is_on_floor()) entonces es porque está saltando:
Y aquí tenemos el código completo con la animación del personaje saltando:
func _process(delta): velocidad.y += 200 * delta if Input.is_action_pressed(«Jump») and is_on_floor(): velocidad.y = -200 if Input.is_action_pressed(«Player_Left»): $AnimationPlayer.play(«Left») velocidad.x = -100 if Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Right») velocidad.x = 100 if !Input.is_action_pressed(«Player_Left») and !Input.is_action_pressed(«Player_Right»): $AnimationPlayer.play(«Idle») velocidad.x = 0 if !is_on_floor(): $AnimationPlayer.play(«Animacion_JUMP») #Personaje saltando move_and_slide(velocidad,Vector2(0,-1)) |