Godot. Crear un ítem recolectable

Enviado por tech4life el

Para dar mayor jugabilidad a nuestros juegos, a veces es interesante añadir items u objetos que el jugador pueda recoger para incrementar sus habilidades en el juego. 

En este mini tutorial vamos a dar las claves para crear un ítem para que nuestro jugador, en nuestro caso una nave, pueda recogerlo y le incremente alguna de sus habilidades. En este caso será un escudo y enseñaremos como recoger el ítem y activar el escudo.

El primer paso es crear la escena que corresponda a nuestro ítem.

En nuestro caso hemos creado una escena con un node, dos sprites 2D y un collision shape. Una de las sprites es un círculo de color verde, y la segunda sprite es el escudo, que irá dentro. Por último el Collision Shape es de tipo CircleShape2D cubriendo toda la sprite.

En nuestro juego, los ítems y enemigos, caen de la parte superior de la pantalla, a una velocidad determinada, y el jugador solo se puede mover a derecha e izquierda para recoger los ítems o esquivar enemigos. Por ello hemos creado un script linkado a nuestro escudo : 

En él seteamos una velocidad inicial aleatoria, en base a un rango y al nível actual. Y luego simplemente en la función _physics_process le indicamos que la posición y va variando (cayendo) y que llegado a un punto (700) desaparezca (queue_free) , esto es una vez sale de pantalla.

Por útimo en esta parte, a nuestro node le hemos puesto un nombre de grupo, en la pestaña de node, subpestaña Groups. Esto es importante para más tarde, para identificar cuando el player colisione con el objeto saber de que tipo es.

El siguiente paso es ir a nuestro player, y en la función : _on_area_entered añadir el siguiente código.

En este caso indicamos que si el area que ha colisionado con el player es del grupo shield (que es el grupo que le hemos dado al escudo) haga el siguiente código. En nuestro caso, le decimos que el escudo desaparezca de pantalla (queue_free) y luego seteamos una variable global indicando que hemos cogido el ítem escudo y por último emitimos una señal que en nuestro caso hemos declarado en una clase Global.

El siguiente paso es ir al script de nuestra escena principal o de juego y en la función _ready hacer la siguiente asignación : 

Esto es para indicarle que cuando la señal activateShield se lance, aqui la recogeremos y llamaremos a la funcion activateShield de nuestra escena principal.

En esta función lo único que haremos será activar un timer que habremos añadido a la escena para que el escudo solo dure unos segundos, y capturaremos la señal de finalización del timer para volver a indicar que el escudo ya no está activo.

En nuestra escena del jugador, le hemos añadido también el escudo, con una sprite nueva 

Y en el código del player hemos añadido el siguiente código : 

Aquí simplemente miramos la variable Global que tenemos para saber si el escudo se debe mostrar o no.

Por último nos falta ver como actua el escudo permitiendo que los enemigos no hagan daño al jugador. Para ello de nuevo en el script del player hemos añadido esto : 

En la función _on_area_entered, cuando lo que colisiona es un objeto de tipo meteor, miramos si el escudo está activo. En caso afirmativo, simplemente eliminamos el meteorito / enemigo. En caso contrario indicamos que el jugador se ha muerto.

Esta es una manera fácil y sencilla de crear un ítem que el jugador pueda recoger y una funcionalidad bastante básica que se puede mejorar pero que para un juego sencillo funciona perfectamente

Nivel