「2048」というゲームのソースコードを読んでいきます
ソースには以下のサイトよりアクセスできます
animframe_polyfill.jsを読んでいく
ソースコードには以下のURLよりアクセスできます
3行目の
var vendors = ['webkit', 'moz'];
これは、ブラウザのベンダーを指定していますね。webkitはおそらく、Appleのブラウザと考えることができます。mozはもちろんmozilla FireFoxですね。
4行目から8行目までの
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||
window[vendors[x] + 'CancelRequestAnimationFrame'];
}
ここで、windowはグローバルの変数を格納するオブジェクトですね。window.requestAnimationFrameが格納されている場合はこのループは実行されません。
まずは、
window.webkitRequestAnimationFrameの内容を
window.requestAnimationFrameに代入しています。
同じく、
window.webkitCancelAnimationFrameの内容が存在すればその内容を、存在しなければ
window.webkitCancelRequestAnimationFrameの内容を
window.cancelAnimationFrameに代入しています
それぞれ関数が代入されるわけですね。
そのあと、window.requestAnimationFrameを再びループの最初でチェックすることにより、代入されているかわかります。
おそらくですが、Appleのブラウザの場合には代入されることとなり、mozなどの他のブラウザの場合は次のループで代入されることとなります。
では、次のループでは
window.requestAnimationFrameに
window.mozRequestAnimationFrameの内容が代入され、
window.calcelAnimationFrameに
window.mozCancelAnimationFrameの内容が、それが存在しなければ
window.mozCancelRequestAnimationFrameの内容が代入されます
この2回のループでも代入されない場合は
10行目から21行目まで
if (!window.requestAnimationFrame) {
window.requestAnimationFrame = function (callback) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function () {
callback(currTime + timeToCall);
},
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
}
ここで、関数が代入されることとなります。
ここでは、currTimeで現在のタイムスタンプを取得し、lastTimeは最初は0で初期化されているので、timeToCallは0を代入される。
そして、callbackには、現在の時間が代入されることとなり、即座に描画が実行される。
lastTimeには、描画が実行された時間が代入されることとなり、次にrequestAnimationFrameが呼び出されると、16秒後に描画が実行されることとなる。
つまり、このルーチンは、16秒ごとに描画を実行する仕組みを記述したものとなる。
23行目から27行目では、cancelAnimationFrameがもし設定されていなければ代入されることとなる
if (!window.cancelAnimationFrame) {
window.cancelAnimationFrame = function (id) {
clearTimeout(id);
};
}
では、次回は別のコードを読み解いて行きます。