2013-09-30 64 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