Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

Vie supplémentaire

C'est la 8e étape sur 11 du tutoriel sur la création d'un jeu de casse-briques en utilisant uniquement JavaScript. Dans cet article, nous allons mettre en œuvre un système de vies, afin que le·la joueur·euse puisse continuer à jouer jusqu'à ce qu'il perde trois vies, et pas seulement une, ce qui rend le jeu plus agréable pendant plus longtemps.

Nouvelles variables

Ajoutons deux nouvelles variables sous let score = 0; pour stocker le nombre de vies et si le message de vie perdue doit être affiché :

js
let vies = 3;
let afficherTexteViesPerdues = false;

Dessiner les étiquettes de texte

Le dessin des textes ressemble à ce que nous avons déjà fait dans la leçon Suivre le score et gagner. Remplacez dessinerScore() par une fonction dessinerStatut() qui dessine le score, les vies restantes et un message lorsque le·la joueur·euse perd une vie :

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

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

  if (afficherTexteViesPerdues) {
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillText(
      "Vie perdue, cliquez pour continuer",
      canvas.width / 2,
      canvas.height / 2,
    );
  }
}

Les trois étiquettes partagent la même police et la même couleur. Nous utilisons textAlign et textBaseline pour positionner le score en haut à gauche, les vies en haut à droite et le message de vie perdue au centre (si afficherTexteViesPerdues est true).

Dans actualiser(), remplacez l'appel à dessinerScore() par dessinerStatut().

Le code de gestion des vies

Pour implémenter les vies dans notre jeu, commençons par changer le comportement lorsque la balle sort des limites. Au lieu de redémarrer immédiatement :

js
if (balleEstHorsLimites) {
  // Logique de fin de partie
  location.reload();
  return;
}

Nous appelons une nouvelle fonction nommée balleSortirEcran() ; supprimez les lignes précédentes (montrées ci-dessus) et remplacez-les par la ligne suivante :

js
if (balleEstHorsLimites) {
  balleSortirEcran();
  return;
}

Le return arrête le traitement du mouvement et des collisions restants pour cette image après que la balle quitte l'écran.

Nous voulons diminuer le nombre de vies chaque fois que la balle quitte le canevas. Ajoutez la fonction balleSortirEcran() à votre code :

js
function balleSortirEcran() {
  vies--;
  if (vies === 0) {
    // Logique de fin de partie
    location.reload();
    return;
  }

  raquette.pos.x = canvas.width / 2;
  balle.pos.x = raquette.pos.x;
  balle.pos.y = raquette.hitbox.top - balle.taille.h / 2;
  balle.vel = { x: 0, y: 0 };
  afficherTexteViesPerdues = true;
  canvas.addEventListener(
    "pointerdown",
    () => {
      afficherTexteViesPerdues = false;
      balle.vel = { x: 150, y: -150 };
      derniereChronologie = null;
    },
    { once: true },
  );
}

Au lieu d'afficher instantanément l'alerte lorsque vous perdez une vie, nous soustrayons d'abord une vie du nombre actuel et vérifions si c'est une valeur non nulle. Si oui, alors le·la joueur·euse a encore des vies et peut continuer à jouer — il voit le message de vie perdue, les positions de la balle et de la raquette sont réinitialisées à l'écran, et lors de la prochaine entrée (clic ou toucher) le message est masqué et la balle recommence à bouger.

Lorsque le nombre de vies disponibles atteint zéro, la partie est terminée et le message d'alerte de fin de partie est affiché.

Comparer votre code

Voici ce que vous devez avoir jusqu'à présent, en cours d'exécution en direct. Pour voir son code source, cliquez sur le bouton « Exécuter ».

Prochaines étapes

Les vies rendent le jeu plus indulgent — si vous perdez une vie, il vous en reste encore deux et vous pouvez continuer à jouer. Maintenant, développons l'apparence et la sensation du jeu en ajoutant des animations et des interpolations.