2012-12-02 04:04:10 +08:00
|
|
|
(function() {
|
2012-08-04 15:23:56 +08:00
|
|
|
/**
|
2012-12-02 04:04:10 +08:00
|
|
|
* Stage constructor. A stage is used to contain multiple layers and handle
|
|
|
|
* animations
|
|
|
|
* @constructor
|
|
|
|
* @param {Function} func function executed on each animation frame
|
|
|
|
* @param {Kinetic.Node} [node] node to be redrawn. Specifying a node will improve
|
|
|
|
* draw performance. This can be a shape, a group, a layer, or the stage.
|
2012-08-04 15:23:56 +08:00
|
|
|
*/
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Animation = function(func, node) {
|
|
|
|
this.func = func;
|
|
|
|
this.node = node;
|
|
|
|
this.id = Kinetic.Animation.animIdCounter++;
|
2012-12-12 14:34:58 +08:00
|
|
|
this.frame = {
|
|
|
|
time: 0,
|
|
|
|
timeDiff: 0,
|
|
|
|
lastTime: new Date().getTime()
|
|
|
|
};
|
2012-12-02 04:04:10 +08:00
|
|
|
};
|
|
|
|
/*
|
|
|
|
* Animation methods
|
2012-08-04 15:23:56 +08:00
|
|
|
*/
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Animation.prototype = {
|
|
|
|
/**
|
|
|
|
* start animation
|
|
|
|
* @name start
|
|
|
|
* @methodOf Kinetic.Animation.prototype
|
|
|
|
*/
|
|
|
|
start: function() {
|
|
|
|
this.stop();
|
2012-12-12 14:34:58 +08:00
|
|
|
this.frame.timeDiff = 0;
|
|
|
|
this.frame.lastTime = new Date().getTime();
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Animation._addAnimation(this);
|
|
|
|
Kinetic.Animation._handleAnimation();
|
|
|
|
},
|
|
|
|
/**
|
|
|
|
* stop animation
|
|
|
|
* @name stop
|
|
|
|
* @methodOf Kinetic.Animation.prototype
|
|
|
|
*/
|
|
|
|
stop: function() {
|
|
|
|
Kinetic.Animation._removeAnimation(this);
|
2012-12-12 14:34:58 +08:00
|
|
|
},
|
|
|
|
_updateFrameObject: function() {
|
|
|
|
var time = new Date().getTime();
|
|
|
|
this.frame.timeDiff = time - this.frame.lastTime;
|
|
|
|
this.frame.lastTime = time;
|
|
|
|
this.frame.time += this.frame.timeDiff;
|
|
|
|
this.frame.frameRate = 1000 / this.frame.timeDiff;
|
2012-12-02 04:04:10 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
Kinetic.Animation.animations = [];
|
|
|
|
Kinetic.Animation.animIdCounter = 0;
|
|
|
|
Kinetic.Animation.animRunning = false;
|
2012-11-04 02:16:33 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Animation.fixedRequestAnimFrame = function(callback) {
|
|
|
|
window.setTimeout(callback, 1000 / 60);
|
|
|
|
};
|
2012-11-04 02:16:33 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Animation._addAnimation = function(anim) {
|
|
|
|
this.animations.push(anim);
|
|
|
|
};
|
|
|
|
Kinetic.Animation._removeAnimation = function(anim) {
|
|
|
|
var id = anim.id;
|
|
|
|
var animations = this.animations;
|
|
|
|
for(var n = 0; n < animations.length; n++) {
|
|
|
|
if(animations[n].id === id) {
|
|
|
|
this.animations.splice(n, 1);
|
|
|
|
break;
|
|
|
|
}
|
2012-07-04 14:00:52 +08:00
|
|
|
}
|
2012-12-02 04:04:10 +08:00
|
|
|
};
|
2012-12-12 14:34:58 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
Kinetic.Animation._runFrames = function() {
|
|
|
|
var nodes = {};
|
|
|
|
/*
|
|
|
|
* loop through all animations and execute animation
|
|
|
|
* function. if the animation object has specified node,
|
|
|
|
* we can add the node to the nodes hash to eliminate
|
|
|
|
* drawing the same node multiple times. The node property
|
|
|
|
* can be the stage itself or a layer
|
|
|
|
*/
|
|
|
|
for(var n = 0; n < this.animations.length; n++) {
|
|
|
|
var anim = this.animations[n];
|
2012-12-12 14:34:58 +08:00
|
|
|
anim._updateFrameObject();
|
2012-12-02 04:04:10 +08:00
|
|
|
if(anim.node && anim.node._id !== undefined) {
|
|
|
|
nodes[anim.node._id] = anim.node;
|
|
|
|
}
|
|
|
|
// if animation object has a function, execute it
|
|
|
|
if(anim.func) {
|
2012-12-12 14:34:58 +08:00
|
|
|
anim.func(anim.frame);
|
2012-12-02 04:04:10 +08:00
|
|
|
}
|
2012-07-04 14:00:52 +08:00
|
|
|
}
|
2012-08-01 14:23:00 +08:00
|
|
|
|
2012-12-02 04:04:10 +08:00
|
|
|
for(var key in nodes) {
|
|
|
|
nodes[key].draw();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Kinetic.Animation._animationLoop = function() {
|
|
|
|
if(this.animations.length > 0) {
|
|
|
|
this._runFrames();
|
|
|
|
var that = this;
|
|
|
|
Kinetic.Animation.requestAnimFrame(function() {
|
|
|
|
that._animationLoop();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
this.animRunning = false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
Kinetic.Animation._handleAnimation = function() {
|
2012-07-04 14:00:52 +08:00
|
|
|
var that = this;
|
2012-12-02 04:04:10 +08:00
|
|
|
if(!this.animRunning) {
|
|
|
|
this.animRunning = true;
|
2012-07-04 14:00:52 +08:00
|
|
|
that._animationLoop();
|
2012-12-02 04:04:10 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
Kinetic.Animation.requestAnimFrame = function(callback) {
|
|
|
|
var raf = Kinetic.DD && Kinetic.DD.moving ? this.fixedRequestAnimFrame : window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || Kinetic.Animation.fixedRequestAnimFrame;
|
|
|
|
|
|
|
|
raf(callback);
|
|
|
|
};
|
|
|
|
})();
|