Creación de Videojuegos.Godot Engine. Vidas

Tema 19. Godot Engine. Vidas

En este tema, vamos a crear una escena nueva que contendrá una imagen .png  pero que contendrá una Área2D. Esta escena la usaremos en diversas escenas de nuestros proyectos con el objetivo que cuando el personaje la toque o la coga, por ejemplo, gane una vida.

Creamos el Area2D y su CollisionShape2D. Godot
Creamos el Area2D y su CollisionShape2D. Godot

Ahora crearemos un Nodo hijo del Area2D de tipo Sprite y le asignaremos una imagen .png

Creamos Nodo Sprite y asignamos una imagen. Godot
Creamos Nodo Sprite y asignamos una imagen. Godot

También le podemos añadir si queremos un nodo hijo a la clase Area2D de tipo AnimationPlayer por si necesitamos darle animación en un momento dado. Por ejemplo, cuando el personaje coga este objeto, que aparezcan estrellitas…

De momento AnimationPlayer lo dejaremos así.

Eso sí, como la imagen es cuadrada, se ha escogido un cuadrado como figura en el Nodo CollisionShape2D y se ha dimensionado al tamaño de la imagen.

Asignamos un Shape y Creamos el Nodo AnimationPlayer. Godot
Asignamos un Shape y Creamos el Nodo AnimationPlayer. Godot

Para finalizar, guardaremos toda la Escena con el nombre: Vida 

Recordad renombrar el Nodo Área2D a Vida para que se llame igual que la escena.

ANIMAMOS LA ESCENA VIDA

Accedemos al Nodo AnimationPlayer y creamos una nueva animación con el nombre Idle.

En este ejemplo, crearemos una animación partiendo de un solo Sprite, y lo que haremos será ir modificando la posición y en cada frame de la animación.

Para crear una animación en diferentes posiciones del eje y, iremos a Sprite y en las propiedades de la derecha hacemos Click sobre la Llave que hay en Transform Position:

En las propiedades de la derecha hacemos Click sobre la Llave. Godot
En las propiedades de la derecha hacemos Click sobre la Llave. Godot

Creamos una pista para la propiedad “position”. Le decimos Crear:

Creamos una pista para la propiedad “position”. Godot
Creamos una pista para la propiedad “position”. Godot

En el inspector de Animación vemos que hemos creado una animación para la propiedad position.

Animación para la propiedad position. Godot
Animación para la propiedad position. Godot

Ahora podemos ir cambiando las posiciones X o Y según deseamos que se desplace la animación e ir insertando cada posición mediante la llave a los frames de la animación.

Cambiamos las posiciones X o Y según deseamos que se desplace la animación. Godot
Cambiamos las posiciones X o Y según deseamos que se desplace la animación. Godot

En este ejemplo se va alternando la posición Y en cada frame: 5,0-5,0,5,-5…

Posición Y en cada frame: 5,0-5,0,5,-5... Godot
Posición Y en cada frame: 5,0-5,0,5,-5… Godot

Una vez hecho, se activa el loop y se ajusta el tiempo de los frames a 0.8

Se activa el loop y se ajusta el tiempo de los frames a 0.8. Godot
Se activa el loop y se ajusta el tiempo de los frames a 0.8. Godot

Podemos modificar la velocidad de nuestra animación desde la propiedad Speed del AnimationPlayer:

Velocidad de nuestra animación desde la propiedad Speed del AnimationPlayer.Godot
Velocidad de nuestra animación desde la propiedad Speed del AnimationPlayer.Godot

Ahora iremos a nuestra Escena principal y arrastramos el Nodo Vida sobre ella y situamos el Sprite animado en el lugar que queramos en la escena.

Situamos el Sprite animado la escena. Godot
Situamos el Sprite animado la escena. Godot

Podemos hacer la imagen más pequeña (escalarlo con la opción Modo Escalado) Se selecciona la imagen Vida y con la tecla CMD (Mac) o SHIFT(Linux) pulsada se escala el ancho y el alto.

Escalamos con la opción Modo Escalado. Godot
Escalamos con la opción Modo Escalado. Godot
Personaje en la escena. Godot
Personaje en la escena. Godot

Nos daremos cuenta que la imagen todavía no se anima.

Por lo tanto ahora debemos crear el Script para poder darle animación. Creamos un Script en el Nodo Vidas: le ponemos un nombre significativo.

Creamos un Script en el Nodo Vidas. Godot
Creamos un Script en el Nodo Vidas. Godot

Añadimos la instrucción de Animación en la función ready

func _ready():
$AnimationPlayer.play(“Idle”)

Si ejecutamos el proyecto veremos que la imagen se anima de forma continua. Recordemos que hemos activado el loop en sus propiedades.

DETECCIÓN DEL NODO VIDAS CON EL PLAYER

Ahora solo tenemos que implementar la detección del Nodo Player cuando toque al Nodo Vidas (Área2D)

Pero esta vez al conectar el Nodo Vidas, lo haremos consigo mismo, es decir, contaremos en Nodo Vidas con el propio Nodo Vidas y veremos su comportamiento.

El Nodo Vidas. Godot
El Nodo Vidas. Godot

Nos ponemos en el Nodo Vidas y desde Nodos Conectamos a body_entered(..) y conectamos con el Nodo Vidas.

Conectamos con el Nodo Vidas. Godot
Conectamos con el Nodo Vidas. Godot

Ahora imprimimos el nombre de un body cuando dicho cuerpo entre en Vidas

func _on_Vidas_body_entered(body):
print(body.name)

Y observamos qué sucede cuando el Player toque o entre en el cuerpo Vidas:

Mensaje por Consola. Godot
Mensaje por Consola. Godot

Observamos que cuando el Player toca Vidas, se muestra su nombre.

Ahora si renombramos el Nodo Vida a Vidas0 (lo tendremos que renombrar en todos los Nodos donde se encuentre) podremos replicar o duplicarlo varias veces y veremos que el comportamiento será el mismo.

Duplicamos el Nodo Vidas. Godot
Duplicamos el Nodo Vidas. Godot

 Por lo tanto, ahora tenemos diversos objetos Vidas en el escenario que el personaje puede “atrapar” y la función será la misma.

Escena con el Player y los Nodos Vidas. Godot
Escena con el Player y los Nodos Vidas. Godot
RECOGER VIDA

Ahora, lo que sucede en todos los juegos cuando un Personaje recoge una Vida, es que el objeto Vida se borra y el Personaje recibe una vida.

Primero veremos como se borra una vida cuando el Player la recoge: la función queue_free() libera un Nodo.

Por lo tanto añadimos esta función en func _on_Vidas_body_entered(body):

func _on_Vidas_body_entered(body):
queue_free()

Ahora cuando el Player toca la Vida, ésta desaparece.

INGRESO DE VIDA

Para gestionar las vidas, usaremos una nueva variable. Y para ello usaremos el Script general que creamos anteriormente: DataManager.gd

var vidas_player = 3

Declaramos una variable con 3 vidas pero defecto.

Ahora en el Script Vidas cada vez que el Personaje recoge una Vida se suma 1 al contenido de la variable vidas_player

func _on_Vidas_body_entered(body):
DataManager.vidas_player +=1
queue_free()

Si queremos, para ver el valor de dicha variable por Consola, podemos imprimirlo con print:

DataManager.vidas_player +=1
print(DataManager.vidas_player)
queue_free()

Si probamos a recoger las Vidas, veremos que cuando cogemos la primera, se imprime 4 ya que por defecto, partíamos con 3 vidas. Y si volvemos a recoger otra, se incrementa a 5

Las vidas recogidas se muestran por Consola. Godot
Las vidas recogidas se muestran por Consola. Godot

El siguiente paso será quitar una vida cuando nos caemos. Para ello vamos al Script del Player donde tocaba las áreas de caída y restamos una vida.

func _on_Area2D_body_entered(body):
if body == self:
DataManager.vidas_player -=1
get_tree().reload_current_scene()

Para ver que se le está quitando una vida al Player tendremos que añadir un print en la función _ready del Player porque cada vez que se inicie mostrará el valor de la variable.

func _ready():
print(DataManager.vidas_player)
global_position = DataManager.init_position

Ahora podemos probar a caernos y a coger vidas. Veremos como la variable vidas_player refleja en cada momento la situación de vidas del Jugador.


Í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