Base class for animations that all get updated simultaneously each frame.
git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@163 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
package com.threerings.flash {
|
||||
|
||||
import flash.display.DisplayObject;
|
||||
|
||||
import flash.events.TimerEvent;
|
||||
|
||||
import flash.utils.getTimer; // func import
|
||||
import flash.utils.Timer;
|
||||
|
||||
public class Animation
|
||||
{
|
||||
public function Animation ()
|
||||
{
|
||||
}
|
||||
|
||||
public function start () :void
|
||||
{
|
||||
addAnimation(this);
|
||||
}
|
||||
|
||||
public function stop () :void
|
||||
{
|
||||
removeAnimation(this);
|
||||
// didStop();
|
||||
}
|
||||
|
||||
/**
|
||||
* The primary working method for your animation.
|
||||
*/
|
||||
protected function enterFrame () :void
|
||||
{
|
||||
// do your business here
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the specified anim to the list of active anims.
|
||||
*/
|
||||
protected static function addAnimation (anim :Animation) :void
|
||||
{
|
||||
// add it
|
||||
_anims.push(anim);
|
||||
|
||||
// set up the timer
|
||||
if (!_timer) {
|
||||
_timer = new Timer(10); // 10ms: will be limited by frame rate
|
||||
_timer.addEventListener(TimerEvent.TIMER, frameHandler);
|
||||
}
|
||||
_timer.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified anim.
|
||||
*/
|
||||
protected static function removeAnimation (anim :Animation) :void
|
||||
{
|
||||
var dex :int = _anims.indexOf(anim);
|
||||
if (dex != -1) {
|
||||
_anims.splice(dex, 1);
|
||||
|
||||
} else {
|
||||
Log.getLog(Animation).warning("Removing unknown Animation: " + anim);
|
||||
}
|
||||
|
||||
if (_anims.length == 0) {
|
||||
_timer.reset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle our timer event.
|
||||
*/
|
||||
protected static function frameHandler (event :TimerEvent) :void
|
||||
{
|
||||
_now = getTimer();
|
||||
var an :Animation;
|
||||
for (var ii :int = _anims.length - 1; ii >= 0; ii--) {
|
||||
an = Animation(_anims[ii]);
|
||||
if (isNaN(an._start)) {
|
||||
an._start = _now;
|
||||
// an.didStart();
|
||||
}
|
||||
an.enterFrame();
|
||||
}
|
||||
|
||||
// and instruct the flash player to update the display list (now!)
|
||||
event.updateAfterEvent();
|
||||
}
|
||||
|
||||
/** Our own personal start stamp. */
|
||||
protected var _start :Number = NaN;
|
||||
|
||||
/** The current timestamp, accessable to all animations. */
|
||||
protected static var _now :Number;
|
||||
|
||||
/** All the currently running animations. */
|
||||
protected static var _anims :Array = [];
|
||||
|
||||
/** The timer we use to manage our animations. */
|
||||
protected static var _timer :Timer;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user