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/sons.js · 2.5 Ko
/* ============================================================
sons.js - jouer des sons avec l'objet Audio du navigateur
============================================================
p5.sound (loadSound...) n'est pas disponible ici : on utilise
l'objet standard `new Audio('fichier.wav')`.
RÈGLE DES NAVIGATEURS : un son ne peut démarrer qu'après une
ACTION de l'utilisateur (clic, touche, toucher). On crée donc
les objets Audio au premier appui (méthode activer()), pas avant.
============================================================ */
class GestionnaireSons {
/* constructor : appelé par `new GestionnaireSons()`. */
constructor() {
this.muet = false; // true = aucun son
this.actif = false; // true une fois les fichiers préparés
this.audios = {}; // nom -> objet Audio
}
/* ----------------------------------------------------------
activer()
But : préparer les sons. À appeler lors d'un appui
(clavier ou toucher). Sans effet si déjà fait.
---------------------------------------------------------- */
activer() {
if (this.actif) return;
this.actif = true;
for (const nom in SONS_FICHIERS) { // parcourt les clés de l'objet
try {
const audio = new Audio(SONS_FICHIERS[nom]);
audio.preload = 'auto'; // commence à charger le fichier
audio.volume = VOLUME_SONS;
this.audios[nom] = audio;
} catch (e) {
// Si Audio est indisponible, le jeu reste jouable sans son.
}
}
}
/* ----------------------------------------------------------
jouer(nom)
But : jouer un son depuis le début.
Paramètre : nom = clé de SONS_FICHIERS ('piece', 'erreur'...)
---------------------------------------------------------- */
jouer(nom) {
if (this.muet || !this.actif) return;
const audio = this.audios[nom];
if (!audio) return;
try {
audio.currentTime = 0; // revient au début
const promesse = audio.play(); // play() renvoie une "promesse"
if (promesse && promesse.catch) {
promesse.catch(function () { /* lecture refusée : on ignore */ });
}
} catch (e) { /* on ignore */ }
}
/* ----------------------------------------------------------
basculerMuet()
But : couper / remettre le son et mémoriser le choix.
---------------------------------------------------------- */
basculerMuet() {
this.muet = !this.muet;
Stockage.ecrire(CLE_MUET, this.muet ? '1' : '0');
}
}