8

キャンバスベースのゲーム用に次のJSコードがあります。

var EXPLOSION = "sounds/explosion.wav";

function playSound(str, vol) {
  var snd = new Audio();
  snd.src = str;
  snd.volume = vol;
  snd.play();
}

function createExplosion() {
  playSound(EXPLOSION, 0.5);
}

これは機能しますが、呼び出されるたびにサウンドファイルをダウンロードするようにサーバー要求を送信します。または、事前にAudioオブジェクトを宣言した場合:

var snd = new Audio();
snd.src = EXPLOSION;
snd.volume = 0.5;

function createExplosion() {
  snd.play();
}

これは機能しますが、サウンドの再生が終了する前にcreateExplosion関数が呼び出された場合、サウンドはまったく再生されません。これは、サウンドファイルの1回の再生のみが一度に許可されることを意味します。複数の爆発が発生しているシナリオでは、まったく機能しません。

オーディオファイルをそれ自体と重複して複数回適切に再生する方法はありますか?

4

5 に答える 5

1

これを試して:

(function() {
    var snds = {};
    window.playSound(str,vol) {
        if( !snds[str]) (snds[str] = new Audio()).src = str;
        snds[str].volume = vol;
        snds[str].play();
    }
})();

次に、最初に呼び出すとサウンドがフェッチされますが、それ以降は毎回同じサウンドオブジェクトが再利用されます。


編集:サウンドを一度に複数回再生できるように、複製をプリロードすることもできます。

(function() {
    var snds = {}
    window.playSound = function(str,vol) {
        if( !snds[str]) {
            snds[str] = [new Audio()];
            snds[str][0].src = str;
        }
        var snd = snds[str], pointer = 0;
        while( snd[pointer].playing) {
            pointer++;
            if( pointer >= snd.length) {
                snd.push(new Audio());
                snd[pointer].src = str;
            }
        }
        snd[pointer].volume = vol;
        snd[pointer].play();
    };
})();

重なっているサウンドを再生しすぎると複数のリクエストが送信されますが、[変更なし]がすぐに返されるはずであり、以前よりも何度も再生した場合にのみ返されます。

于 2013-02-28T01:04:27.340 に答える
0

私のゲームではプリロードを使用していますが、サウンドが開始された後 (まったくプリロードしないか、ページの読み込み時にすべてをプリロードするのは賢明ではありません。一部のゲームプレイではサウンドがまったく再生されません。なぜそれらをロードするのですか)

const audio {};
audio.dataload = {'entity':false,'entityes':[],'n':0};
audio.dataload.ordernum = function() {
  audio.dataload.n = (audio.dataload.n + 1)%10;
  return audio.dataload.n;
}
audio.dataload.play =  function() {
 
    audio.dataload.entity = new Audio('/some.mp3');
    for (let i = 0; i<10;i++) {
      audio.dataload.entityes.push(audio.dataload.entity.cloneNode());
    }
   
    audio.dataload.entityes[audio.dataload.ordernum()].play();
  
}

audio.dataload.play() // plays sound and preload sounds to memory when it isn't
于 2020-04-08T09:01:42.973 に答える