◆ Portail Antalaha

Annuaire › Code ouvert

Pirogue d'Antalaha - jeu de vanille (p5.js)

tutorial · Voir le site ↗
Connectez-vous pour copier ce site

Code publié par son auteur, en lecture seule. « Copier dans mon espace » crée un nouveau site à vous (non publié) que vous pouvez modifier librement.

js/outils.js · 3.3 Ko

/* ============================================================
   outils.js - petites fonctions utilitaires
   ============================================================
   1) collisionRect : détecter si deux rectangles se touchent
   2) Stockage      : sauvegarder le record (localStorage + repli)
   ============================================================ */

/* ------------------------------------------------------------
   collisionRect(a, b)
   But : savoir si deux rectangles se chevauchent
         (méthode "AABB" : rectangles alignés sur les axes).
   Paramètres : a et b = objets {x, y, l, h}
                x, y = coin haut-gauche ; l = largeur ; h = hauteur
   Retour : true (ils se touchent) ou false.

   Principe : deux rectangles se chevauchent si, sur l'axe horizontal
   ET sur l'axe vertical, leurs intervalles se recouvrent.
   ------------------------------------------------------------ */
function collisionRect(a, b) {
  return a.x < b.x + b.l &&     // le bord gauche de a est à gauche du bord droit de b
         a.x + a.l > b.x &&     // le bord droit de a est à droite du bord gauche de b
         a.y < b.y + b.h &&     // le haut de a est au-dessus du bas de b
         a.y + a.h > b.y;       // le bas de a est sous le haut de b
}

/* ------------------------------------------------------------
   Stockage : lire et écrire de petites données (le record).

   Le navigateur offre localStorage pour garder des données entre
   deux visites. MAIS dans ce site, protégé par un "bac à sable",
   localStorage lève une erreur (SecurityError) : il est interdit.
   On utilise donc try/catch : on essaie, et si ça échoue on se
   rabat sur une simple variable en mémoire (le record est alors
   conservé seulement tant que la page reste ouverte).

   try { ... } catch (e) { ... } : exécute le bloc try ; si une
   erreur survient, saute au bloc catch au lieu de planter.
   ------------------------------------------------------------ */
const Stockage = {
  memoire: {},          // repli : valeurs gardées tant que la page est ouverte
  disponible: null,     // null = pas encore testé ; true / false ensuite

  /* testerDisponibilite() : vérifie (une seule fois) que localStorage marche. */
  testerDisponibilite: function () {
    if (this.disponible !== null) return this.disponible;
    try {
      // Même lire window.localStorage peut lever une erreur dans un bac à sable.
      window.localStorage.setItem('__test__', '1');
      window.localStorage.removeItem('__test__');
      this.disponible = true;
    } catch (e) {
      this.disponible = false;
    }
    return this.disponible;
  },

  /* lire(cle, defaut) : renvoie la valeur (texte) ou `defaut` si absente. */
  lire: function (cle, defaut) {
    try {
      if (this.testerDisponibilite()) {
        const v = window.localStorage.getItem(cle);
        if (v !== null) return v;
      }
    } catch (e) { /* on ignore : on utilisera la mémoire */ }
    return (cle in this.memoire) ? this.memoire[cle] : defaut;
  },

  /* ecrire(cle, valeur) : enregistre la valeur (convertie en texte). */
  ecrire: function (cle, valeur) {
    this.memoire[cle] = String(valeur);        // toujours gardé en mémoire
    try {
      if (this.testerDisponibilite()) {
        window.localStorage.setItem(cle, String(valeur));
      }
    } catch (e) { /* on ignore : la mémoire suffit */ }
  }
};