我正在构建一个类似于吉他英雄的浏览器游戏。它的工作方式是setInterval被设置为每16个音符执行一次,这取决于速度,通常是100到150毫秒。它所执行的函数只是检查是否有一个注释需要根据用户的按键进行检查。
但我一直在阅读关于setInterval如何会受到漂移的影响,而且可能不太准确。对于一首持续3-4分钟并需要100毫秒精度的歌曲(如果计时机制稍微偏离,这可能会让用户感到非常沮丧),这似乎不是最好的解决方案。
那么,还有更精确的替代方案吗?T
发布于 2017-08-08 01:51:26
在绝对时间内计算一切可能是个更好的主意。因此,有一个var starttime = Date.now();,然后计算每一个音符应该是var expected_note_time = starttime+beat_interval*beat_number。然后,您可以在keypress上添加一个侦听器,然后记录按键被击中的确切时间。如果是abs(time_pressed-expected_note_time) < ALLOWED_MISTAKE_VARIANCE,那么将这个分数加到用户的分数中。祝好运。
发布于 2017-08-08 01:56:24
同意,setInterval有一些问题,比如它不关心回调是否还在运行,并且没有那么灵活。
您可以实现自己的方法,如下所示:
function interval(func, wait, times){
var interv = function(w, t){
return function(){
if(typeof t === "undefined" || t-- > 0){
setTimeout(interv, w);
try{
func.call(null);
}
catch(e){
t = 0;
throw e.toString();
}
}
};
}(wait, times);
setTimeout(interv, wait);
};这个函数有一个名为interv的内部函数,它通过setTimeout自动调用,interv内部是一个闭包,它检查重复时间、调用回调并通过setTimeout再次调用interv。如果从回调调用中出现异常,则间隔调用将停止,异常将被抛出。
你可以这样使用它:
interval(function(){
// Code block goes here
}, 1000, 10);它在间隔或10秒内执行一段代码5次,您可以在两者之间执行一些操作。
发布于 2017-08-08 01:50:45
你可以在歌曲的开头缓存滴答声,从那以后得到滴答的数量,看是否有音符存在。
返回1970/01/01年度以来的毫秒数:
var d = new Date();
var n = d.getTime();N的结果可以是:1502156888172
来自:gettime.asp
https://stackoverflow.com/questions/45558074
复制相似问题