我最近开始学习Javascript,我正在开发我的第一个网络嵌入式游戏,这是一款使用十二音串行音乐基本原理的音乐益智游戏。我的游戏大部分已完成,you can find it here。但是我的音频有问题。当用户解决谜题时,我确实设法让它播放声音,但是我无法通过游戏板上出现的音符来实现它。
这就是我所做的:我创建了一个包含12个音频对象的数组,其中包含从C到B的每个音符。然后我创建了一个名为“playToneRow()”的方法,通过它们全部播放,顺序由数字决定array ToneRow.notes []。这是代码:
this.playToneRow = function()
{
for (var i in this.notes)
{
noteSound[this.notes[i]].play();
}
};
但是这种方法只播放音调行的最后一个音符。现在我应该提一下,我对Javascript的了解已经从我在网上发现的各种教程中拼凑而成,而且我相当确定在我公认的基本编码技能方面存在重大差距。但我认为问题在于我没有在声音之间放置任何空间,所以它试图一次播放它们,但它没有足够的频道所以它只播放了最后一个。所以我试过这个:
this.playToneRow = function()
{
var x = 0;
for (var i in this.notes)
{
x = this.notes[i];
setTimeout(function()
{
noteSound[x].play();
}, 700);
}
};
现在我真的不确定我是否正确使用了setTimeout(),但我猜不是,因为它再一次只播放了最后一个音符。我知道所有12个wav文件都被加载了,因为如果我改变了音调行,它会发出不同的音符。所以它可以访问所有音频文件;只需要让它全部播放(并按照正确的顺序)。
谢谢!
答案 0 :(得分:0)
for
并不真正关心您的setTimeout
,请尝试:
this.playToneRow = function()
{
var x = 0,
length = 0,
j = 0;
for (var i in this.notes)
{
length += 1;
}
function runIteration () {
x = this.notes[j];
setTimeout(function()
{
noteSound[x].play();
}, 700);
if (j === length) return;
j += 1;
setTimeout(runIteration, 700);
}
runIteration();
};
希望这样做。我已经看了你的code,但它有点复杂,所以我无法确定this.notes
是对象还是数组
答案 1 :(得分:0)
http://jsfiddle.net/kgvgcsg3/14/
var notes = [{'0':'tone1'},{'1':'tone2'}]
var playToneRow = function(i)
{
setTimeout(function()
{
//notes[i].play(); goes here
console.log(notes[i])
if (i < notes.length-1){
i++;
playToneRow(i)
}
}, 700);
};
playToneRow(0)