Vidas, puntos, y tiempo para completar nivel - Juego de Plataformas 2D (2)


Algo muy importante al momento de hacer juegos de plataformas es mantener el control de los puntos que se obtienen en la partida y las vidas que el jugador debe cuidar. Vamos a hacerlo ahora.
> El proyecto que puedes usar como guía se encuentra aquí.

Creando los nodos


Para ver la cantidad de vida, puntos, y tiempo dentro del juego, vamos a necesitar un nodo llamado "CanvasLayer" que se encarga de mantener todos los elementos que conforman el HUD, dentro de la pantalla. En él vamos a colocar los nodos que tengan un texto o imagen que siempre queremos ver. Los nodos de "Tiempo" y "Puntos" se llaman "RichTextLabel" y se usan como contenedores del nodo "Label" (es un nodo para texto). Por último tenemos el Sprite del corazón que representa nuestras vidas.

Los tres nodos se tienen que ubicar en el lugar que queramos de la pantalla, y deben estar dentro de CanvasLayer:

Creando las variables


Ahora vamos a definir todas las variables que usaremos, lo voy a hacer dentro del script para el jugador. Las primeras cuatro variables están relacionadas con la vida del jugador: "en_juego" se usa para saber si estamos vivos, en caso de que sea falsa activamos un reinicio de nivel. Los puntos y las vidas son valores numéricos normales y por último usamos una variable de "Recuperación" que activo cada vez que chocamos con el enemigo, para que en lugar de quitarnos todos los corazones de golpe, tengamos un descanso cada segundo.

Las últimas cuatro variables se encargan de instanciar nodos: "tiempo_juego" se encarga de crear el Timer (como una alarma) que cuente todos los segundos que le quedan al nivel.  "Tiempo_recuperación" nos da un segundo cada vez que somos golpeados por el enemigo, y durante ese segundo no podemos ser dañados. El "tiempo_text" y "puntos_text" son variables que se encargan de mostrar los valores numéricos de sus respectivos nombres en el CanvasLayer.

Controlando las nuevas instancias para el tiempo


En nuestra función de inicio vamos a colocar nuestras nuevas instancias de tiempo como hijas de algún nodo. Al tiempo de juego le vamos a poner como padre al CanvasLayer usando el "add_child(nombre_de_nodo)". En su configuración vamos a poner el tiempo máximo (en segundos) que queremos para nuestro nivel, para eso se usa "wait_time=seg". El parámetro de "one_shot" se usa para decir que el Timer sólo va a iniciarse una vez (en caso de que sea falso el Timer se repetiría cuando pasen los 300 segundos). Con el "start()" le estamos diciendo que inicie el Timer cuando lea esa línea de código.

Para el tiempo se recuperación es lo mismo. Con la diferencia de que no lo vamos a activar, ya que sólo lo queremos cuando el enemigo nos ataque. Además de eso, hemos añadido al nodo de recuperación como hijo del jugador, ya que el programa entiende esto: "self.add_child(tiempo_recuperacion)" cuando ponemos "add_child(..)" (self quiere decir "Yo mismo").

Preparando la recuperación


Esto es muy simple: si el tiempo de recuperación se acaba (si antes ha iniciado) entonces la recuperación se termina, sino inicia. Cuando el tiempo de juego se acaba, el juego termina. "is_stopped()" es como decir: "Esta parado" por eso se entiende que "Si tiempo EstaParado():"

Preparar la vida y los textos


Al ser variables que debemos actualizar cada segundo, las tenemos que ejecutar todo el tiempo. Cuando obtenemos un nodo de tipo "Sprite" vamos a poder cambiar el frame que tiene su imagen: spr.frame. Si le decimos que el frame de la vida sea igual al número de las vidas, se colocará la imagen de la última vida... por lo tanto le tenemos que decir de algún modo que queremos usar el valor de las vidas negativo pero siempre sumando la cantidad de vidas iniciales. Así tenemos que: -12 + 12 = 0; cuando pierdan una vida: -11+12 = 1; y así sucesivamente.

Ahora, como vimos arriba: es necesario que los nuevos nodos tengan asignado un padre. En éste caso vamos a usar los nodos RichTextLabel que tenemos dentro del CanvasLayer como padres para nuestros nuevos nodos Label

Recuerden que no podemos poner directamente los valores números del Timer o  los puntos, es necesario usar str() para transformar el resultado (sea numérico o booleano) en una cadena de texto.

Sumar vidas


Esto es algo muy sencillo. Si los puntos son mayores o iguales a 30 y las vidas NO son 12, entonces suma una vida y resta los 30 puntos. En caso de que tengas todas las vidas, estarás sumando solamente puntos toda la partida.

Espero que esta información les sea útil. Cualquier recomendación/crítica la pueden dejar en los comentarios.

Desde el Nautilus, me despido

Comentarios

Entradas populares de este blog