如何遍历一组Audio对象

时间:2015-04-26 01:02:46

标签: javascript arrays audio

我最近开始学习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文件都被加载了,因为如果我改变了音调行,它会发出不同的音符。所以它可以访问所有音频文件;只需要让它全部播放(并按照正确的顺序)。

谢谢!

2 个答案:

答案 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)
相关问题