package flare.animate.interpolate { import flare.util.Arrays; /** * Interpolator for numeric Array values. Each value * contained in the array should be a numeric (Number or * int) value. */ public class ArrayInterpolator extends Interpolator { private var _start:Array; private var _end:Array; private var _cur:Array; /** * Creates a new ArrayInterpolator. * @param target the object whose property is being interpolated * @param property the property to interpolate * @param start the starting array of values to interpolate from * @param end the target array to interpolate to. This should be an * array of numerical values. */ public function ArrayInterpolator(target:Object, property:String, start:Object, end:Object) { super(target, property, start, end); } /** * Initializes this interpolator. * @param start the starting value of the interpolation * @param end the target value of the interpolation */ protected override function init(start:Object, end:Object) : void { _end = end as Array; if (!end) throw new Error("Target array is null!"); if (_start && _start.length != _end.length) _start = null; _start = Arrays.copy(start as Array, _start); if (_start.length != _end.length) throw new Error("Array dimensions don't match"); var cur:Array = _prop.getValue(_target) as Array; if (cur == end) cur = null; _cur = Arrays.copy(_start, cur); } /** * Calculate and set an interpolated property value. * @param f the interpolation fraction (typically between 0 and 1) */ public override function interpolate(f:Number) : void { for (var i:uint=0; i<_cur.length; ++i) { _cur[i] = _start[i] + f*(_end[i] - _start[i]); } _prop.setValue(_target, _cur); } } // end of class ArrayInterpolator }