2013-09-30 42 views
2

我工作在JavaScript中的游戏,我有​​游戏循环设置:定时事件和requestAnimationFrame游戏循环

loop: function() { 

    game.updateSomething(); 

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

我的游戏有一个工作循环,我能走动的物体,这是很好的,但是如果我想限制这个循环内的一个动作,例如每一秒,我该如何做到这一点?我是否需要注意与new Date()每次打勾的时间,然后将其与前一代循环生成的计算时间进行比较,然后测试差异?就像这样:

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游戏如何处理需要定期发生的事情,这些事情也存在于主游戏循环中?

回答

0

MDN

回调方法传递一个参数,一个 DOMHighResTimeStamp,其指示时间,以毫秒为单位而与 的10微秒,在该重绘预定的最小精度发生 。

上述时间戳可以用来衡量英国皇家空军调用之间的时间,你需要的东西:

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); 

控制台输出:

[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