2012-04-30 22 views
8

私は音をしばしば演奏するゲームを作っています。私はそれが演奏されている間、サウンドが再び演奏されないことに気づいた。たとえば、プレイヤーが壁に衝突した場合、「太鼓」の音が鳴ります。しかし、プレイヤーが1つの壁に衝突してすぐに別の壁に衝突すると、ただ1つの「強打」音が鳴り、最初の音が終わらないために起こると私は信じています。本当?これを避けるにはどうすればいいですか?解決しようHTML5では、同じ音を複数回同時に再生できますか?

...私はいつもその音の別のコピーを演奏、音3回をプリロードと思ったが、これはむしろ愚かなようだ:

あなたがプリロードする必要があります...私は正しかったが判明します複数のバージョンのサウンドを再生し、それらを循環再生します。

CODE:

var ns = 3; //The number of sounds to preload. This depends on how often the sounds need to be played, but if too big it will probably cause lond loading times. 
var sounds = []; //This will be a matrix of all the sounds 

for (i = 0; i < ns; i ++) //We need to have ns different copies of each sound, hence: 
    sounds.push([]); 

for (i = 0; i < soundSources.length; i ++) 
    for (j = 0; j < ns; j ++) 
     sounds[j].push(new Audio(sources[i])); //Assuming that you hold your sound sauces in a "sources" array, for example ["bla.wav", "smile.dog" "scream.wav"] 

var playing = []; //This will be our play index, so we know which version has been played the last. 

for (i = 0; i < soundSources.length; i ++) 
    playing[i] = 0; 

playSound = function(id, vol) //id in the sounds[i] array., vol is a real number in the [0, 1] interval 
{ 
    if (vol <= 1 && vol >= 0) 
     sounds[playing[id]][id].volume = vol; 
    else 
     sounds[playing[id]][id].volume = 1; 

    sounds[playing[id]][id].play(); 
    ++ playing[id]; //Each time a sound is played, increment this so the next time that sound needs to be played, we play a different version of it, 

    if (playing[id] >= ns) 
     playing[id] = 0; 
} 
+0

あなたはオーディオを再生するために何を使用していますか?私はそれが '

+0

'sound = new Audio(" souce.wav "); sound.play(); ' – corazza

答えて

2

ポリフォニーをシミュレートするために音を数回ロードします。ラウンドロビン方式でそれらを再生します。私のデモをmatthewtoledo.comでチェックしてください。具体的には、関数_initSoundBank()

+0

だから、基本的に、私は正しかったですか? – corazza

+0

それが私が見つけた最善の方法です。誰かがより良い解決策を持っているなら、私は本当に知りたいです。 – mrbinky3000

+0

ああ、それは動作します!コードをトーストします... – corazza

1

はい、単一の<audio>オブジェクトは一度に1つのトラックしか再生できません。 <audio>オブジェクトには、オーディオトラックの現在の位置を示すcurrentTime属性があるとします。<audio>オブジェクトが複数のトラックを再生できる場合、どの値がcurrentTimeに反映されますか?

Is playing sound in Javascript performance heavy?のこの問題のスーパーセットについては、私の解決策をご覧ください。 (基本的には、同じ音で重複<audio>タグを追加します。)

+0

Aha!私は誰かが前に私の頭の中にその考えを植えたことを知っていた...ありがと;) – corazza

0

をそれが唯一の今のFirefoxとChromeで実行されているが、将来的にあなたは、特にゲームやオーディオ・アプリケーション向けに設計されてWebAudioのAPIを、使用する必要がありますブラウザに表示されます。

ここでは、任意のサウンドを何度も再生したり、他の楽しいものをいくつか再生したりできます。そのため

良いチュートリアルはここにある:http://www.html5rocks.com/en/tutorials/webaudio/games/

4

あなたは、audio要素のクローンを作成することができます。同時に2回以上演奏できるかどうかはわかりませんが、複数回サウンドを1回以上再生することはできません。

var sound = document.getElementById("incomingMessageSound") 
var sound2 = sound.cloneNode() 
sound.play() 
sound2.play() 

私はこれが私が必要な唯一の場所であるクロームのために働くことを知っています。 幸運を祈る!

関連する問題