◆ 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/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');
  }
}