Estoy usando HTML5 para programar juegos; El obstáculo con el que me he encontrado ahora es cómo reproducir efectos de sonido.
Los requisitos específicos son pocos en número:
- Juega y mezcla múltiples sonidos,
- Reproduzca la misma muestra varias veces, posiblemente reproducciones superpuestas,
- Interrumpir la reproducción de una muestra en cualquier punto,
- Preferiblemente reproduzco archivos WAV que contienen PCM sin procesar (de baja calidad), pero puedo convertirlos, por supuesto.
Mi primer enfoque fue usar el <audio>
elemento HTML5 y definir todos los efectos de sonido en mi página. Firefox reproduce los archivos WAV simplemente a melocotón, pero llamar #play
varias veces realmente no reproduce la muestra varias veces. Desde mi comprensión de la especificación HTML5, el <audio>
elemento también rastrea el estado de reproducción, por lo que eso explica por qué.
Mi pensamiento inmediato fue clonar los elementos de audio, así que creé la siguiente pequeña biblioteca de JavaScript para hacer eso por mí (depende de jQuery):
var Snd = {
init: function() {
$("audio").each(function() {
var src = this.getAttribute('src');
if (src.substring(0, 4) !== "snd/") { return; }
// Cut out the basename (strip directory and extension)
var name = src.substring(4, src.length - 4);
// Create the helper function, which clones the audio object and plays it
var Constructor = function() {};
Constructor.prototype = this;
Snd[name] = function() {
var clone = new Constructor();
clone.play();
// Return the cloned element, so the caller can interrupt the sound effect
return clone;
};
});
}
};
Así que ahora puedo hacerlo Snd.boom();
desde la consola Firebug y jugar snd/boom.wav
, pero aún no puedo reproducir la misma muestra varias veces. Parece que el <audio>
elemento es realmente más una función de transmisión en lugar de algo con lo que reproducir efectos de sonido.
¿Hay una manera inteligente de hacer que esto suceda que me falta, preferiblemente usando solo HTML5 y JavaScript?
También debo mencionar que mi entorno de prueba es Firefox 3.5 en Ubuntu 9.10. Los otros navegadores que he probado - Opera, Midori, Chromium, Epiphany - produjeron resultados variables. Algunos no juegan nada, y algunos lanzan excepciones.