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:
Ray Greenwell
2007-03-06 00:56:17 +00:00
parent 1be723cbd5
commit 83f2851ed1
+101
View File
@@ -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;
}
}