Creación de Videojuegos. Godot Engine. Acciones del personaje.

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:

Personaje spritesheet. Godot Engine.
Personaje spritesheet. Godot Engine.

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.

Animación personaje en reposo (Idle). Godot
Animación personaje en reposo de frente (Idle). Godot

Nuestro personaje en estado Idle aparecerá en esta posición y de animará:

Personaje Idle animado. Godot.
Personaje Idle animado. Posición frente. Godot.

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)
El personaje se posa sobre la plataforma. Gravedad. Godot
El personaje se posa sobre la plataforma. Gravedad. Godot

Y si nos desplazamos hacia la derecha, entonces caerá sobre la segunda plataforma:

Nos movemos hacia la izquierda. El personaje se sitúa encima de la segunda plataforma. Godot
Nos movemos hacia la derecha. El personaje se sitúa encima de la segunda plataforma. Godot

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))

ÍNDICE


0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x