2012-04-30 32 views
8

Sık sık oynanan bir oyun yapıyorum. Oynatılırken bir sesin tekrar oynamadığını fark ettim. Örneğin, oyuncu bir duvarla çarpışır, bir "yumru" sesi çalınır. Oyuncunun bir duvar ile çarpışır ve ardından hızla başka bir duvara çarptığı Ama, eğer yalnızca bir "güm" sesi oynadım ve ilk ses bitiremedi bunu sağladığına inanıyoruz edilir. Bu doğru mu? Bundan nasıl kaçmalıyım? Hep o sesin farklı bir kopyasını oynayan Sesi üç kez önceden yükleme düşündüm ama buHTML5'te aynı sesi aynı anda birden fazla oynatabilir miyim?

ÇÖZÜLDÜ ... oldukça aptalca görünüyor:

I ... önceden yüklemek için sağ ihtiyaç olduğunu kapatır sesin birden çok sürümü ve daha sonra bunları dairesel olarak oynatın.

KODU:

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 = yeni Ses (" souce.wav "); sound.play(); ' – corazza

cevap

2

Yük ses birkaç kez seslilik simüle etmek. Onları yuvarlak robin tarzında oyna. matthewtoledo.com adresindeki demo'uma bakın. Özellikle, fonksiyon _initSoundBank()

+0

Yani temelde haklı mıydım? – corazza

+0

Yep. Bu bulduğum en iyi yol. Eğer daha iyi bir çözümü varsa, bilmek isterim. – mrbinky3000

+0

Oh evet, işe yarıyor! Kodu kızartır ... – corazza

1

Evet, tek <audio> nesnesi, yalnızca bir seferde bir parçayı çalabilir. Bir <audio> nesne birden fazla parça bir kez olan oynayabilseydiniz, currentTime hangi değer yansıtacak: <audio> nesne ses parçasının geçerli konumunu gösteren bir currentTime niteliği olduğunu düşünün?

Is playing sound in Javascript performance heavy? bu sorunun bir üst benim çözüm bakın. (Temel olarak, aynı ses ile yinelenen <audio> etiketleri ekleyin.)

+0

Aha! Birinin kafamda bu fikri diktiğini biliyordum ... Teşekkürler;) – corazza

0

sadece şu anda FireFox ve Chrome uygulanan rağmen, gelecekte Özellikle oyun ve ses uygulamaları için tasarlanmıştır WebAudio API, kullanmalıdır tarayıcıda. Orada

Eğer herhangi bir ses birden çok kez geri oynatmak ve onunla birkaç diğer eğlenceli şeyler yapabiliriz.

bunun için iyi bir öğretici burada: Ses elemanı klonlayabilirsiniz http://www.html5rocks.com/en/tutorials/webaudio/games/

4

. Onları aynı anda birden fazla oynayabiliyor musunuz bilmiyorum, ama bir defadan daha fazla indirmeden, bir defadan daha fazla ses çalabilirsiniz.

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

Bu, krom için çalıştığını biliyorum, bu sadece ihtiyacım olan yer. İyi şanslar!

Sesi çalmak için hangi
İlgili konular