2016-09-06 3 views
-2

Я пытаюсь воспроизвести случайный звуковой файл с помощью howler.js, а затем повторно выбрать другой случайный файл, сверхурочный. У меня есть игра и цикл, но с одним и тем же файлом каждый раз, когда он петли. Единственный случайный выбор - при начальной загрузке.Случайное число каждый раз на контуре javascript

Это то, что у меня есть:

var number = Math.floor((Math.random() * 3) + 1); 
    var sound1 = new Howl({ 
     src: ['audio/'+number+'.wav'], 
     autoplay: false, 
     loop: false, 
     volume: 1.0, 
    onend: function() { 
    sound1.play() 
    } 
    }); 

sound1.play() 

Это радостно играет один из 3-х случайных WAV файлов из папки аудио, но только выбирает случайным образом при загрузке. Тот же файл затем бесконечно петлится.

Довольно новичок в javascript, поэтому любая помощь оценивается. Благодарю.

+1

ну, в конце вы снова играете звук, не меняя число –

+0

Не могли бы вы направить меня в сторону, как изменить число в конце, пожалуйста? Ive пробовал генератор случайных чисел внутри функции onend, но не работает – dee

+0

'number = Math.floor ((Math.random() * 3) + 1);' снова в 'onend'. – Li357

ответ

0

Как насчет этого?

var sounds = []; 

function playRandom() { 
    // play a random member of sounds 
    sounds[Math.floor(Math.random() * sounds.length) + 1].play(); 
} 

// load all the sounds ahead of time  
var numberOfSounds = 3; 
for (var i = 0; i < numberOfSounds; i++) { 
    sounds.push(new Howl({ 
    src: ['audio/' + i + '.wav'], 
    autoplay: false, 
    loop: false, 
    volume: 1.0, 
    onend: function() { 
     // when one sound ends, play a new random one 
     playRandom(); 
    }, 
    })); 
} 

// kick things off with the first random sound  
playRandom(); 

UPDATE

Ответ комментарий ниже, вот один из способов, чтобы играть каждый звук четыре раза многократно, прежде чем перейти к следующему случайному звуку:

var sounds = []; 

function playRepeatedly(sound, howManyTimes, callback) { 
    // this is similar to using `onend` when you create the sound 
    sound.once('end', function() { 
    // if there are more repetitions to go 
    if (howManyTimes > 1) { 
     // play one less time 
     playRepeatedly(sound, howManyTimes - 1, callback); 
    } else { 
     // if we're all done, call the callback 
     callback(); 
    } 
    }); 

    sound.play(); 
} 

function playRandom() { 
    // pick a random sound 
    var sound = sounds[Math.floor(Math.random() * sounds.length) + 1]; 

    // play it 4 times and then play a new random sound 
    playRepeatedly(sound, 4, function() { 
    // this is the callback, which just plays a new random sound 
    playRandom(); 
    }); 
} 

// load all the sounds ahead of time  
var numberOfSounds = 3; 
for (var i = 0; i < numberOfSounds; i++) { 
    sounds.push(new Howl({ 
    src: ['audio/' + i + '.wav'], 
    autoplay: false, 
    loop: false, 
    volume: 1.0, // no more `onend` here 
    })); 
} 

// kick things off with the first random sound  
playRandom(); 
+0

Thats отлично работает! Теперь, чтобы узнать, что он делает! Cheers – dee

+0

@dee Есть ли какая-то часть, с которой у вас возникли проблемы с пониманием проблемы? – smarx

+0

Из интереса. Можете ли вы петли в цикле. Например, например, возможно ли воспроизвести файл 4 раза, прежде чем перейти к следующему случайному выбору? – dee

0

Я никогда не использовал howler.js, но вы сможете просто называть его снова onend. Просто создайте функцию, которая вызывается, когда звук перестает играть:

function playSound(number) { 
    var num = generateRandomNumber(number); 
    var sound1 = new Howl({ 
     src: ['audio/' + num + '.wav'], 
     autoplay: false, 
     loop: false, 
     volume: 1.0, 
     onend: function() { 
      playSound(num) 
     } 
    }); 

    sound1.play() 
} 

function generateRandomNumber(number) { 
    var num = Math.floor((Math.random() * 3) + 1); 
    // if it's the same number as in the previous round, get a new number 
    while (number == num) { 
     return generateRandomNumber(number); 
    } 
    return num; 
} 
+0

Улыбается, выглядит интересно .... думаю, я вижу, что он делает. но это ничего не играет. – dee

+0

Вы должны вызвать функцию ... @dee – baao

+0

aaaah ..... да. Спасибо. – dee

0

Вам нужно обновить значение номер и изменить src атрибут Howl ins или просто создать новый. Нечто подобное должно работать:

function createHowl() { 
    var number = Math.floor((Math.random() * 3) + 1); 
    return new Howl({ 
      src:  ['audio/' + number + '.wav'], 
      autoplay: false, 
      loop:  false, 
      volume: 1.0, 
      onend: function() {createHowl().play()} 
    }); 
} 

createHowl().play(); 

Обратите внимание, что есть 33% шанс, что он будет играть один и тот же звук, два раза подряд.

+0

Спасибо RobG. Это фантастически набухает. – dee

0

сначала, вам нужно проверить на сервере. Я использовал chrome49. мой тестовый код следующим образом:

var obj = new Options(); 
    var sound1 = new Howl(new Options()); 
    sound1.play(); 
    function Options() 
    { 
     var number = Math.floor((Math.random() * 3) + 1); 
     this.src = ['audio/'+number+'.wav']; 
     this.autoplay=false; 
     this.loop=false; 
     this.volume=1.0; 
     this.onend = function(e) 
     {  
      new Howl(new Options()).play(); 
     } 
    } 

если ошибка браузера «Uncaught (обещанию) DOMException: Невозможно декодировать аудио данные», Ваш формат файла неверен.

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