首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我需要时间间隔非常精确的时候,有比setInterval更好的解决方案吗?

当我需要时间间隔非常精确的时候,有比setInterval更好的解决方案吗?
EN

Stack Overflow用户
提问于 2017-08-08 01:45:33
回答 4查看 475关注 0票数 1

我正在构建一个类似于吉他英雄的浏览器游戏。它的工作方式是setInterval被设置为每16个音符执行一次,这取决于速度,通常是100到150毫秒。它所执行的函数只是检查是否有一个注释需要根据用户的按键进行检查。

但我一直在阅读关于setInterval如何会受到漂移的影响,而且可能不太准确。对于一首持续3-4分钟并需要100毫秒精度的歌曲(如果计时机制稍微偏离,这可能会让用户感到非常沮丧),这似乎不是最好的解决方案。

那么,还有更精确的替代方案吗?T

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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,那么将这个分数加到用户的分数中。祝好运。

票数 1
EN

Stack Overflow用户

发布于 2017-08-08 01:56:24

同意,setInterval有一些问题,比如它不关心回调是否还在运行,并且没有那么灵活。

您可以实现自己的方法,如下所示:

代码语言:javascript
复制
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。如果从回调调用中出现异常,则间隔调用将停止,异常将被抛出。

你可以这样使用它:

代码语言:javascript
复制
interval(function(){
    // Code block goes here
}, 1000, 10);

它在间隔或10秒内执行一段代码5次,您可以在两者之间执行一些操作。

票数 1
EN

Stack Overflow用户

发布于 2017-08-08 01:50:45

你可以在歌曲的开头缓存滴答声,从那以后得到滴答的数量,看是否有音符存在。

返回1970/01/01年度以来的毫秒数:

代码语言:javascript
复制
var d = new Date();
var n = d.getTime();

N的结果可以是:1502156888172

来自:gettime.asp

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45558074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档