使更新循环与Phaser中的音乐和笔记同步

时间:2018-03-04 11:27:24

标签: phaser-framework

当音乐在Phaser中播放一段时间时,我正试图制作一些音符,但是当我在控制台中记录“击中时间”时,它只会出现。

我有一个“笔记”的对象,关键是我希望笔记显示的时间:

{
  1377: {
    jam: 1,
    duration: 0.40
  }
}

有1464个音符。

但是,在更新循环中,如果我这样做:

update () {
  if (music && music.currentTime) {
    if (notes[music.currentTime]) {
      console.log('notes[music.currentTime].jam', notes[music.currentTime].jam)
    }
  }
}

它只会随机记录部分音符。

你知道为什么吗?

1 个答案:

答案 0 :(得分:2)

这可能是因为music.currentTime每次更新都会增加~16 ms,因此它可以跳过notes对象中的特定时间键。除此之外,我认为时间也可以是浮点值,因此它与notes变量中的键不完全匹配。

实现所需内容的另一种方法是将notes变量的格式更改为数组,以便稍后以不同的方式访问它:

var notes = [    
    ...
    {'start': 1377, 'jam': 1, 'duration': 0.40},
    {'start': 2456, 'jam': 1, 'duration': 0.30},
    ...
];

// Index of the first note that will be played.
// Will be incremented by 1 or more with some update() calls,
// depending on the time that passed.
var nextNote = 0;

function update() {
    // Process all notes that are now in the past
    // compared to the current time of the playing music,
    // but skip notes that have been already played before.
    while (music && nextNote < notes.length && notes[nextNote].start <= music.currentTime) {
        console.log(notes[nextNote]);
        nextNote += 1;
    }
}

要使此方法起作用,notes数组必须按升序保存开始时间。