Annuaire › Code ouvert
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 */ }
}
};