2012-04-30 2 views
8

Я делаю игру, в которой часто играют звуки. Я заметил, что звук не будет воспроизводиться снова во время его воспроизведения. Например, игрок сталкивается со стеной, воспроизводится звук «удар». Но если игрок сталкивается с одной стеной, а затем быстро сталкивается с другой стеной, воспроизводится только один звук «удар», и я считаю, что это происходит, потому что первый звук не закончился. Это правда? Как мне избежать этого? Я подумал о поджимать звуку три раза, всегда играет другую копию этого звука, но это, кажется, довольно глупо ...В HTML5 я могу воспроизводить один и тот же звук более одного раза в одно и то же время?

РЕШИТЬ:

Оказывается, я был прав ... Вам нужно поджать несколько версий звука, а затем циклически воспроизводить их.

код:

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> может воспроизводить только один трек за раз. Учтите, что объект <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

Вы можете клонировать элемент аудио. Я не знаю, можете ли вы играть их более одного раза одновременно, но вот как вы можете воспроизводить звук более одного раза, не загружая его более одного раза.

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

Я знаю, что это работает для хрома, это единственное место, в котором я нуждался. Удачи!

Смежные вопросы