如何循环访问音频对象数组

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)