首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定时事件和requestAnimationFrame游戏循环

问定时事件和requestAnimationFrame游戏循环
EN

Stack Overflow用户
提问于 2013-10-01 02:28:47
回答 1查看 547关注 0票数 2

我正在用JavaScript开发一个游戏,我用requestAnimationFrame设置了一个游戏循环

代码语言:javascript
复制
loop: function () {

    game.updateSomething();

    if (game.running) {
        game.tick++;
        requestAnimationFrame(game.loop);
    }
},

我的游戏有一个工作循环,我可以到处移动物体,这很好,但是如果我想限制这个循环中的一个动作,比如每秒,我该如何实现?我是否必须用new Date()记录下每一次滴答的时间,然后将其与我在上一次循环生成时计算的时间进行比较,并测试差异?如下所示:

代码语言:javascript
复制
latest: null,

loop: function () {

    var last = this.latest;
    this.latest = new Date().getTime();
    var every = 200;

    if (Math.floor(last/every) != Math.floor(this.latest/every)) {
        console.log('do something');
        game.updateSomething();
    };

    if (game.running) {
        game.tick++;
        requestAnimationFrame(game.loop);
    }
},

这看起来真的很混乱,即使我把它包装在一个函数中,当时钟周期上的时间不同时返回true,感觉就是不对劲……我试着用谷歌搜索,但我找不到任何关于这个问题的具体信息。

其他JavaScript游戏如何处理需要定期发生的、也驻留在主游戏循环中的事情?

EN

回答 1

Stack Overflow用户

发布于 2013-11-04 13:30:38

来自MDN

向回调方法传递单个参数DOMHighResTimeStamp,该参数指示计划进行重绘的时间,单位为毫秒,但最小精度为10µs。

上述时间戳可以用来测量raf调用之间的时间,这正是您需要的:

代码语言:javascript
复制
var last = sec = dev = 0,
    every = 1000;

var cycle = function (stamp) {
    if (stamp - last >= every - dev) {
        last = stamp;
        sec++;
        dev = last - sec * every;
        console.log(sec+" sec, deviation: " + dev);
    }
    requestAnimationFrame(cycle);
};

requestAnimationFrame(cycle);

控制台输出:

代码语言:javascript
复制
[13:09:55.790] "1 sec, deviation: 14"
[13:09:56.786] "2 sec, deviation: 12"
[13:09:57.782] "3 sec, deviation: 10"
[13:09:58.779] "4 sec, deviation: 9.000000000000455"
[13:09:59.777] "5 sec, deviation: 7"
[13:10:00.776] "6 sec, deviation: 6"
[13:10:01.773] "7 sec, deviation: 4"
[13:10:02.773] "8 sec, deviation: 3"
[13:10:03.773] "9 sec, deviation: 1"
[13:10:04.787] "10 sec, deviation: 15"
[13:10:05.786] "11 sec, deviation: 13"

Example fiddle。

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

https://stackoverflow.com/questions/19101214

复制
相关文章

相似问题

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