J'ai essayer de faire ma petite sauce avec ce que j'ai trouvé sur le web, ce n'est pas encore terminé mais ça gère déjà le problème des sons simultanés et des différents formats sans faire de recopie lourde des éléments audio avec des cloneNode() comme j'ai pu le voir ailleurs.
Pour ceux que ça intéresse voici ma solution :
Les sons sont tous créer au chargement du jeu :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
function CreerSon(paramSon){
//Objet son :
var son = {
mId: paramSon[0], //"son1"
mLoop: paramSon[1], //false
mVolume: paramSon[2], //1
mSrc: paramSon[3] //"Son/laser"
};
//Création de l'element audio si il n'existe pas :
if (!document.getElementById(son.mId)){
var elementAudio = document.createElement('audio');
var Mp3 = !!elementAudio.canPlayType && "" != elementAudio.canPlayType('audio/mpeg');
//var Ogg = !!elementAudio.canPlayType && "" != elementAudio.canPlayType('audio/ogg; codecs="vorbis"');
elementAudio.id = son.mId;
if (Mp3) elementAudio.src = son.mSrc + ".mp3";
else elementAudio.src = son.mSrc + ".ogg";
document.body.appendChild(elementAudio);
}
return son;
} |
Le gestionnaire audio est déclaré en global :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
var gGesionnaireAudio = new GestionnaireAudio();
function GestionnaireAudio(){
var sonSimultaneMax = 10;
this.mPistesAudio = new Array();
for (i=0;i<sonSimultaneMax;i++) {
this.mPistesAudio[i] = new Array();
this.mPistesAudio[i]['piste'] = new Audio();
this.mPistesAudio[i]['termine'] = -1;
}
this.Jouer = function(son){
for (i=0;i<this.mPistesAudio.length;i++) {
var timer = new Date();
if (this.mPistesAudio[i]['termine'] < timer.getTime()) {
this.mPistesAudio[i]['termine'] = timer.getTime() + document.getElementById(son.mId).duration*1000;
this.mPistesAudio[i]['piste'].src = document.getElementById(son.mId).src;
this.mPistesAudio[i]['piste'].volume = son.mVolume;
this.mPistesAudio[i]['piste'].load();
this.mPistesAudio[i]['piste'].play();
break;
}
}
}
} |
Lancement d'un son :
gGesionnaireAudio.Jouer(fondAudio);
Il faut maintenant ajouter la gestion des sons continu (en boucle) et pouvoir les stopper à la demande.
Partager