此文件
http://www.iguanademos.com/Jare/docs/html5/Lessons/Lesson2/js/GameLoopManager.js
以下是代码:
// ----------------------------------------
// GameLoopManager
// By Javier Arevalo
var GameLoopManager = new function() {
this.lastTime = 0;
this.gameTick = null;
this.prevElapsed = 0;
this.prevElapsed2 = 0;
我理解变量的声明, 它们用于记录帧之间的时间。
this.run = function(gameTick) {
var prevTick = this.gameTick;
this.gameTick = gameTick;
if (this.lastTime == 0)
{
// Once started, the loop never stops.
// But this function is called to change tick functions.
// Avoid requesting multiple frames per frame.
var bindThis = this;
requestAnimationFrame(function() { bindThis.tick(); } );
this.lastTime = 0;
}
}
我不明白为什么他使用var bindThis = this
this.stop = function() {
this.run(null);
}
此函数将gameTick设置为null,打破this.tick函数中的循环。
this.tick = function () {
if (this.gameTick != null)
{
var bindThis = this;
requestAnimationFrame(function() { bindThis.tick(); } );
}
else
{
this.lastTime = 0;
return;
}
var timeNow = Date.now();
var elapsed = timeNow - this.lastTime;
if (elapsed > 0)
{
if (this.lastTime != 0)
{
if (elapsed > 1000) // Cap max elapsed time to 1 second to avoid death spiral
elapsed = 1000;
// Hackish fps smoothing
var smoothElapsed = (elapsed + this.prevElapsed + this.prevElapsed2)/3;
this.gameTick(0.001*smoothElapsed);
this.prevElapsed2 = this.prevElapsed;
this.prevElapsed = elapsed;
}
this.lastTime = timeNow;
}
}
}
这些代码大部分是我不明白的,我可以看到他正在记录帧之间经过的时间,但其余的代码对我来说都不见了。
在网站上他使用单词“singleton”,用于阻止程序尝试两次更新同一帧?
我对javascript语法有一些经验,但单身的概念以及这个文件的一般目标/功能对我来说都没有了。
为什么需要上面的代码而不只是调用
requestAnimationFrame(function(){});
答案 0 :(得分:0)
他使用bindThis的原因是他将一个方法传递给下一行的匿名函数。如果他只使用this.tick()
,this
将被定义为requestAnimationFrame
的上下文。他可以使用call
或apply
来实现同样的目标。
单身人士只是一次实例化的课程。这是一个实践问题,而不是语法问题 - javascript不知道单身是什么。通过将其称为“Singleton”,他只是在传达这是一个仅实例化一次的类,并且需要它的所有内容都将引用相同的实例。