如何循环访问音频对象数组
How to cycle through an array of Audio objects
我最近开始学习 Javascript,我正在开发我的第一款网络嵌入式游戏,这是一款使用十二音序列音乐基本原理的音乐益智游戏。我的游戏基本完成了,you can find it here。但是我在音频方面遇到了问题。我确实设法让它在用户解决难题时播放声音,但我无法让它真正播放出现在游戏板上的音符。
这是我所做的:我创建了一个包含 12 个音频对象的数组,其中包含从 C 到 B 的每个音符。然后我创建了一个名为 "playToneRow()" 的方法来播放它们,顺序由数值数组 ToneRow.notes[]。这是代码:
this.playToneRow = function()
{
for (var i in this.notes)
{
noteSound[this.notes[i]].play();
}
};
但是这种方法只播放音列的最后一个音符。现在我应该提一下,我对 Javascript 的了解是从我在网上找到的各种教程拼凑而成的,而且我相当确定我公认的基本编码技能存在重大差距。但我认为问题是我没有在声音之间放置任何 space,所以它试图一次播放所有声音,但它没有足够的通道所以它只播放了最后一个.然后我尝试了这个:
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 文件都在加载,因为如果我更改音调行,它会播放不同的音符。所以它确实可以访问所有音频文件;只需让它全部播放(并以正确的顺序)即可。
谢谢!
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
是对象还是数组
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)
我最近开始学习 Javascript,我正在开发我的第一款网络嵌入式游戏,这是一款使用十二音序列音乐基本原理的音乐益智游戏。我的游戏基本完成了,you can find it here。但是我在音频方面遇到了问题。我确实设法让它在用户解决难题时播放声音,但我无法让它真正播放出现在游戏板上的音符。
这是我所做的:我创建了一个包含 12 个音频对象的数组,其中包含从 C 到 B 的每个音符。然后我创建了一个名为 "playToneRow()" 的方法来播放它们,顺序由数值数组 ToneRow.notes[]。这是代码:
this.playToneRow = function()
{
for (var i in this.notes)
{
noteSound[this.notes[i]].play();
}
};
但是这种方法只播放音列的最后一个音符。现在我应该提一下,我对 Javascript 的了解是从我在网上找到的各种教程拼凑而成的,而且我相当确定我公认的基本编码技能存在重大差距。但我认为问题是我没有在声音之间放置任何 space,所以它试图一次播放所有声音,但它没有足够的通道所以它只播放了最后一个.然后我尝试了这个:
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 文件都在加载,因为如果我更改音调行,它会播放不同的音符。所以它确实可以访问所有音频文件;只需让它全部播放(并以正确的顺序)即可。
谢谢!
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
是对象还是数组
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)