我是一名新手游戏开发者。目前我正在为js13kgames比赛制作游戏,因此游戏应该很小,这就是为什么我不使用任何现代流行的框架。
在开发我的无限游戏循环时,我发现了几篇文章和建议来实现它。现在它看起来像这样:
self.gameLoop = function () {
self.dt = 0;
var now;
var lastTime = timestamp();
var fpsmeter = new FPSMeter({decimals: 0, graph: true, theme: 'dark', left: '5px'});
function frame () {
fpsmeter.tickStart();
now = window.performance.now();
// first variant - delta is increasing..
self.dt = self.dt + Math.min(1, (now-lastTime)/1000);
// second variant - delta is stable..
self.dt = (now - lastTime)/16;
self.dt = (self.dt > 10) ? 10 : self.dt;
self.clearRect();
self.createWeapons();
self.createTargets();
self.update('weapons');
self.render('weapons');
self.update('targets');
self.render('targets');
self.ticks++;
lastTime = now;
fpsmeter.tick();
requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
};
所以问题出在
self.dt
上。我最终发现第一种变量不适合我的游戏,因为它会无限增加,武器速度也会随之增加(例如:this.position.x += (Math.cos(this.angle) * this.speed) * self.dt;
)。第二种变量看起来更合适,但它是否符合这种循环的要求(http://codeincomplete.com/posts/2013/12/4/javascript_game_foundations_the_game_loop/)呢?
requestAnimationFrame
只是安排一个新的循环,它不会立即触发该循环。其余代码确实得到执行。;-) - markErequestAnimationFrame()
,以保持稳定的 60fps。 - Patrick W. McMahonrequestAnimationFrame
只是给浏览器一个运行循环内代码的最佳时间的许可。循环代码在浏览器方便的时候运行,而不是在代码中使用requestAnimationFrame
的那个点。它在循环中的位置是任意的,markE 将其放置在循环的第一行是完全可以的。事实上,这可能是最好的位置,因为它清楚地指示了循环函数的目的和工作方式。 - d13