【问题标题】:Is there a javascript method that returns the state of a given Audio object?是否有返回给定音频对象状态的 javascript 方法?
【发布时间】:2015-04-27 00:36:33
【问题描述】:

我正在用 javascript 编写一个简单的益智游戏。 You can play it heresource code is here。它使用音符作为游戏片段,您可以按“播放”按钮使其播放音符。音符在演奏时也会亮起。问题是声音和不断变化的图形之间似乎存在延迟。

对于音频播放方法this.playToneRow(),我使用了一个全局变量来遍历所有的音符,然后在显示片段的方法中,this.drawNotes(),我只是抓取了那个全局变量的值来确定哪个游戏块应该亮。但我猜这不是最好的方法,因为 .play() 调用和实际声音之间似乎存在延迟。

所以我认为控制不断变化的图形的更好方法是某种告诉当前正在播放的音频对象(如果有的话)的方法,然后我可以更改相应的图像。

this.playToneRow = function()
{
    var x = 0,
        length = (this.notes.length + 2),
        myArray = this.notes;
    j = 0;
    currentSound = this.player;

    function runIteration () {
        x = myArray[j];

        setTimeout(function()
        {
            if (typeof x === 'number')
            {
                noteSound[x].play();
            }
        }, 500);

        if (j === length)
        {
            j = -1;
            currentSound = 0;
            return;
        }

        j++;

        setTimeout(runIteration, 500);
    }

    runIteration();

};

this.drawNotes = function()
{
    this.noteText = "";
    for (var i = 0; i < 12; i++)
    {
        this.noteText += noteNames[this.notes[i]];
        this.noteText += ", ";
        if (((j - 3)  === i) && (currentSound === this.player))
        {
            ctx.drawImage(this.gamePieceHi, (i * 52) + 85, 275 - (this.notes[i] * 17.7));
        }
        else
        {
            ctx.drawImage(this.gamePiece, (i * 52) + 95, 285 - (this.notes[i] * 17.7));
        }
    }
};

【问题讨论】:

标签: javascript audio methods


【解决方案1】:

似乎this.playToneRow() 从现在开始通过setTimeout() 将声音排队500 毫秒,但绘制音符的部分正在立即运行。

【讨论】:

  • 简单的解决方法是延迟每次受影响的抽奖。但是,如果您想正确执行此操作,那么拥有一个同时处理视频和音频的更新功能可能会更好。它可以为视频排队 single、非递归 requestAnimationFrame()(即使绘制可能没有那么重,并且您的目标不是恒定的最大 FPS)和音频的 play(),然后睡到下一个音符(如果存在的话)。
  • 感谢您的回复,Jared 和 Scott。我对我的代码进行了一些更改,所以现在它可以工作了,尽管我确信有更好的方法来做到这一点。我应该提一下,这对我来说都是新事物,我完全不知道自己在做什么!无论如何,我在上面包含了我更新的代码。我更改了 playToneRow() 方法,使其在数组末尾之后执行 2 次迭代,然后我添加了 if (typeof x === 'number') 条件,因此它不会尝试访问数组末尾之后。然后在drawNotes() 中,我从全局j 中减去3。这似乎有效,虽然我不完全清楚为什么!
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 2012-10-05
  • 2011-11-03
  • 2011-08-14
  • 2021-02-21
  • 1970-01-01
  • 2019-02-10
  • 2019-07-11
相关资源
最近更新 更多