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.
Ahora crearemos un Nodo hijo del Area2D de tipo Sprite y le asignaremos una imagen .png
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.
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:
Creamos una pista para la propiedad “position”. Le decimos Crear:
En el inspector de Animación vemos que hemos creado una animación para la propiedad position.
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.
En este ejemplo se va alternando la posición Y en cada frame: 5,0-5,0,5,-5…
Una vez hecho, se activa el loop y se ajusta el tiempo de los frames a 0.8
Podemos modificar la velocidad de nuestra animación desde la propiedad Speed del AnimationPlayer:
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.
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.
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.
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.
Nos ponemos en el Nodo Vidas y desde Nodos Conectamos a body_entered(..) y conectamos con el Nodo Vidas.
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:
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.
Por lo tanto, ahora tenemos diversos objetos Vidas en el escenario que el personaje puede “atrapar” y la función será la misma.
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
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.