muse.animate.engine :: 动画引擎
这个思路是一直有的,但是自己的能力不到,一直写不出来。这次总算是基本实现了自己的想法。
但是IE下的效率实在太低了。
muse.animate.engine : 整个页面,看做是一个动画舞台
muse.animate.engine.$FPS : 动画的帧速率
muse.animate.engine.$INTERVAL : 时间线
muse.animate.engine.$FUNCTIONS : 时间线上的动画
muse.animate.engine.add : 添加一个动画
add方法将函数绑定到指定对象上,然后push到$FUNCTIONS里。
每个interval周期,都会将$FUNCTIONS里的函数轮流执行一次。函数执行完毕有两个判断条件:一个是函数出错,将被捕获;另一个是函数返回true。所以,只要将函数返回true,就可以告知引擎动画完成,可以移除。
if(typeof muse == 'undefined') muse = { animate : {} };
muse.animate.engine = {
$FPS : 100,
$HANDLE : null,
$FUNCTIONS : [],
add : function(obj, callback){
this.$FUNCTIONS.push(function(index){ return callback.call(obj, index); });
if(!this.isRunning) this.$INTERVAL();
},
$INTERVAL : function(){
var _ = this;
_.$HANDLE = setInterval(
function(){
var l = _.$FUNCTIONS.length;
if(l < 1){
clearInterval(_.$HANDLE);
_.$HANDLE = null;
_.isRunning = false;
return;
};
var i = 0, crash = false;
_.isRunning = true;
while(i < l){
try{ crash = !!_.$FUNCTIONS[i].call(_, i); }
catch(e) { crash = true; }
if(crash){
_.$FUNCTIONS[i] = null;
_.$FUNCTIONS.splice(i, 1);
l--;
} else {
i++;
}
}
}, Math.round(1000 / _.$FPS)
);
},
isRunning : false
}
var i = 0;
window.onload = function(){
var start = new Date();
var div = document.getElementById('a');
var f = function(index){ div.innerHTML = ++i + (' | i > 50 = ' + (i > 50) + ' :: ' + (new Date() - start) + '<br />'); return i > 50; }
muse.animate.engine.add(null, f);
}
浙公网安备 33010602011771号