Używam HTML5 do programowania gier; przeszkodą, na którą się teraz natknąłem, jest sposób odtwarzania efektów dźwiękowych.
Szczegółowe wymagania są nieliczne:
- Graj i miksuj wiele dźwięków,
- Odtwórz tę samą próbkę wiele razy, być może nakładające się na siebie odtworzenia,
- Przerywać odtwarzanie próbki w dowolnym momencie,
- Najlepiej odtwarzaj pliki WAV zawierające (niskiej jakości) surowe PCM, ale oczywiście mogę je przekonwertować.
Moje pierwsze podejście polegało na użyciu <audio>
elementu HTML5 i zdefiniowaniu wszystkich efektów dźwiękowych na mojej stronie. Firefox odtwarza pliki WAV po prostu brzoskwiniowe, ale #play
wielokrotne wywoływanie tak naprawdę nie odtwarza próbki wielokrotnie. Z mojego zrozumienia specyfikacji HTML5 <audio>
element śledzi również stan odtwarzania, więc to wyjaśnia dlaczego.
Moją bezpośrednią myślą było sklonowanie elementów audio, dlatego stworzyłem następującą małą bibliotekę JavaScript, aby to dla mnie zrobić (zależy od 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;
};
});
}
};
Teraz mogę to zrobić Snd.boom();
z konsoli Firebug i grać snd/boom.wav
, ale wciąż nie mogę grać tej samej próbki wiele razy. Wygląda na to, że <audio>
element ten jest raczej funkcją przesyłania strumieniowego, niż czymś do odtwarzania efektów dźwiękowych.
Czy istnieje sprytny sposób, aby tak się stało, czego mi brakuje, najlepiej używając tylko HTML5 i JavaScript?
Powinienem również wspomnieć, że moim środowiskiem testowym jest Firefox 3.5 na Ubuntu 9.10. Inne przeglądarki, których wypróbowałem - Opera, Midori, Chromium, Objawienie Pańskie - przynosiły różne wyniki. Niektórzy nic nie grają, a niektórzy zgłaszają wyjątki.