Adapt mx.effects.easing or Tweener functions to be used for paths.

git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@367 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
Ray Greenwell
2007-12-10 00:30:16 +00:00
parent fdd85f3c2b
commit a918c3e9e8
@@ -0,0 +1,70 @@
//
// $Id: LinePath.as 359 2007-12-03 21:08:33Z dhoover $
package com.threerings.flash.path {
import flash.display.DisplayObject;
/**
* Adapts mx.effects.easing or Tweener functions for use as a Path.
*/
public class EasingPath extends Path
{
/**
* @param destX the destination x coordinate
* @param destY the destination y coordinate
* @param duration the duration of the path, in milliseconds.
* @param xfunc a Function to provide x coordinates. Signature:
* function (t :Number, b :Number, c :Number, d :Number) :Number
* t = elapsed time
* b = initial position
* c = total change in position
* d = duration
* @param yfunc a Function to provide y coordinates. If omitted, the xfunc is used.
* @param startX the starting x coordinate. If omitted, the DisplayObject's current coordinate
* is used.
* @param startY the starting y coordinate. If omitted, the DisplayObject's current coordinate
* is used.
*/
public function EasingPath (
target :DisplayObject, destX :Number, destY :Number, duration :int,
xfunc :Function, yfunc :Function = null, startX :Number = NaN, startY :Number = NaN)
{
if (isNaN(startX)) {
startX = target.x;
}
if (isNaN(startY)) {
startY = target.y;
}
if (yfunc == null) {
yfunc = xfunc;
}
_duration = duration;
_startX = startX;
_startY = startY;
_deltaX = destX - startX;
_deltaY = destY - startY;
_xfunc = xfunc;
_yfunc = yfunc;
init(target);
}
override protected function tick (curStamp :int) :int
{
var t :Number = curStamp - _startStamp;
_target.x = _xfunc(t, _startX, _deltaX, _duration);
_target.y = _yfunc(t, _startY, _deltaY, _duration);
// return the number of milliseconds before we're done
return _duration - t;
}
protected var _xfunc :Function;
protected var _yfunc :Function;
protected var _startX :Number;
protected var _startY :Number;
protected var _deltaX :Number;
protected var _deltaY :Number;
protected var _duration :int;
}
}