游戏循环requestAnimFrame(javascript / canvas)

时间:2011-05-03 01:11:19

标签: javascript loops canvas

我正在努力解决这个问题似乎没有多少参考。

我使用的是Google编写的requestAnimFrame:

requestAnimFrame = (function() {
  return window.requestAnimationFrame ||
     window.webkitRequestAnimationFrame ||
     window.mozRequestAnimationFrame ||
     window.oRequestAnimationFrame ||
     window.msRequestAnimationFrame ||
     function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
       window.setTimeout(callback, 1000/60);
     };
})();

我有一个功能“init”来设置我的游戏。然后调用update,这是调用渲染绘制到画布的游戏循环。如果忽略requestAnimFrame - 每个单独的部分都可以正常工作。一旦我调用requestAnimFrame,我就会得到“太多的递归”错误或者FF只是崩溃。

我在update()中的代码如下:

game.update = function()
{
    stats.update();
    fps.innerHTML = stats.getFPS();

// Render objects
game.render();
// Continue game loop
requestAnimFrame(game.update());
}

stats.update只更新FPS计数器。所以你可以看到,这个功能并没有做很多。我的game.render函数只是在画布上绘制了一堆瓷砖,效果很好。

有什么建议吗?

谢谢!

克里斯

1 个答案:

答案 0 :(得分:22)

您需要传递函数,而不是调用函数的结果。换句话说,改变这个:

requestAnimFrame(game.update());

对此:

requestAnimFrame(game.update);

目前的方式将进入game.update,做其事,然后尝试评估表达式:

requestAnimFrame(game.update())

为了评估它,首先需要评估requestAnimFrame的参数:

game.update()

这只是一个函数回调自身,导致无限递归,直到堆栈溢出/过多的递归错误。它永远不会调用requestAnimFrame,因为它总是在评估内部参数。