Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.

View in English Always switch to English

Vidas extra

Este es el paso 8 de los 11 del tutorial para crear un juego Breakout con JavaScript puro. En este artículo implementaremos un sistema de vidas, para que el jugador pueda seguir jugando hasta perder tres vidas, y no solo una, lo que hace que el juego resulte divertido durante más tiempo.

Nuevas variables

Añade dos variables nuevas debajo de let score = 0; para guardar el número de vidas y si se debe mostrar el mensaje de vida perdida:

js
let lives = 3;
let showLifeLostText = false;

Dibujar las etiquetas de texto

Dibujar los textos se parece a algo que ya hicimos en la lección Llevar la puntuación y ganar. Reemplaza drawScore() por una función drawStatus() que dibuje la puntuación, las vidas restantes y un mensaje cuando el jugador pierda una vida:

js
function drawStatus() {
  ctx.font = "18px Arial";
  ctx.fillStyle = "#0095dd";
  ctx.textBaseline = "top";
  ctx.textAlign = "left";
  ctx.fillText(`Puntos: ${score}`, 5, 5);

  ctx.textAlign = "right";
  ctx.fillText(`Vidas: ${lives}`, canvas.width - 5, 5);

  if (showLifeLostText) {
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillText(
      "Vida perdida, haz clic para continuar",
      canvas.width / 2,
      canvas.height / 2,
    );
  }
}

Las tres etiquetas comparten la misma fuente y el mismo color. Usamos textAlign y textBaseline para colocar la puntuación arriba a la izquierda, las vidas arriba a la derecha y el mensaje de vida perdida en el centro (si showLifeLostText es true).

En update(), reemplaza la llamada a drawScore() por drawStatus().

El código para gestionar las vidas

Para implementar las vidas en nuestro juego, primero cambiemos el comportamiento cuando la pelota sale de los límites. En lugar de reiniciar de inmediato:

js
if (ballIsOutOfBounds) {
  // Lógica de fin del juego
  location.reload();
  return;
}

Llamaremos a una nueva función llamada ballLeaveScreen(); elimina las líneas anteriores (mostradas arriba) y reemplázalas por la siguiente línea:

js
if (ballIsOutOfBounds) {
  ballLeaveScreen();
  return;
}

El return detiene el procesamiento del resto del movimiento y de las colisiones de este fotograma después de que la pelota sale de la pantalla.

Queremos reducir el número de vidas cada vez que la pelota sale del canvas. Añade la función ballLeaveScreen() a tu código:

js
function ballLeaveScreen() {
  lives--;
  if (lives === 0) {
    // Lógica de fin del juego
    location.reload();
    return;
  }

  paddle.pos.x = canvas.width / 2;
  ball.pos.x = paddle.pos.x;
  ball.pos.y = paddle.hitbox.top - ball.size.h / 2;
  ball.vel = { x: 0, y: 0 };
  showLifeLostText = true;
  canvas.addEventListener(
    "pointerdown",
    () => {
      showLifeLostText = false;
      ball.vel = { x: 150, y: -150 };
      lastTimestamp = null;
    },
    { once: true },
  );
}

En lugar de mostrar inmediatamente la alerta cuando pierdes una vida, primero restamos una vida del número actual y comprobamos si el valor es distinto de cero. Si lo es, el jugador todavía tiene vidas y puede seguir jugando: verá el mensaje de vida perdida, las posiciones de la pelota y la paleta se restablecerán en la pantalla, y con la siguiente entrada (un clic o un toque) el mensaje se ocultará y la pelota empezará a moverse de nuevo.

Cuando el número de vidas disponibles llega a cero, el juego termina y se muestra el mensaje de alerta de fin del juego.

Compara tu código

Esto es lo que deberías tener hasta ahora, funcionando en vivo. Para ver su código fuente, haz clic en el botón "Play".

Próximos pasos

Las vidas hicieron que el juego sea más indulgente: si pierdes una vida, todavía te quedan dos más y puedes seguir jugando. Ahora ampliemos el aspecto y la sensación del juego añadiendo animaciones y tweens.