当音乐在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)
}
}
}
它只会随机记录部分音符。
你知道为什么吗?
答案 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
数组必须按升序保存开始时间。