TweenLite 3

by umhr
TweenLiteと同様のイージングを作る場合の例を作成。
基本構造を示すことを優先しているので、実際に使う上での使いやすさや描画やメモリ最適化等は考慮していません。
♥0 | Line 149 | Modified 2016-01-15 12:48:10 | MIT License
play

ActionScript3 source code

/**
 * Copyright umhr ( http://wonderfl.net/user/umhr )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/EQnu
 */

package
{
    import com.greensock.easing.Cubic;
    import com.greensock.easing.Linear;
    import com.greensock.easing.Quad;
    import com.greensock.TweenLite;
    import flash.display.DisplayObject;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    /**
     * TweenLiteと同様のイージングを作る場合の例を作成。
     * 基本構造を示すことを優先しているので、実際に使う上での使いやすさや
     * 描画やメモリ最適化等は考慮していません。
     * ...
     * @author umhr
     */
    [SWF(width = 465, height = 465, backgroundColor = 0xFFFFFF, frameRate = 30)]
    public class TweenLite3 extends Sprite 
    {
        private var _red:Shape = new Shape();
        private var _maruRed:Shape = new Shape();
        private var _green:Shape = new Shape();
        private var _maruGreen:Shape = new Shape();
        private var _blue:Shape = new Shape();
        private var _maruBlue:Shape = new Shape();
        
        private var _timerLinear:Timer;
        private var _timerQuad:Timer;
        private var _timerCubic:Timer;
        public function TweenLite3() 
        {
            // 赤の四角を描く
            _red.graphics.beginFill(0xFF0000);
            _red.graphics.drawRect( -20, -20, 40, 40);
            _red.graphics.endFill();
            _red.y = 50;
            // 表示オブジェクトに登録
            addChild(_red);
            // 赤の円を描く
            _maruRed.graphics.beginFill(0xFF0000);
            _maruRed.graphics.drawCircle(0, 0, 20);
            _maruRed.graphics.endFill();
            _maruRed.y = 100;
            // 表示オブジェクトに登録
            addChild(_maruRed);
            
            // 緑の四角を描く
            _green.graphics.beginFill(0x00FF00);
            _green.graphics.drawRect( -20, -20, 40, 40);
            _green.graphics.endFill();
            _green.y = 200;
            addChild(_green);
            _maruGreen.graphics.beginFill(0x00FF00);
            _maruGreen.graphics.drawCircle(0, 0, 20);
            _maruGreen.graphics.endFill();
            _maruGreen.y = 250;
            addChild(_maruGreen);
            
            // 青の四角を描く
            _blue.graphics.beginFill(0x0000FF);
            _blue.graphics.drawRect( -20, -20, 40, 40);
            _blue.graphics.endFill();
            _blue.y = 350;
            addChild(_blue);
            _maruBlue.graphics.beginFill(0x0000FF);
            _maruBlue.graphics.drawCircle(0, 0, 20);
            _maruBlue.graphics.endFill();
            _maruBlue.y = 400;
            addChild(_maruBlue);
            
            // ステージ上をクリックしたら実行されるイベントを登録。
            // Flashのスタンダードなイベント登録方法。
            stage.addEventListener(MouseEvent.CLICK, stage_click);
        }
        
        private function stage_click(e:MouseEvent):void 
        {
            _red.x = _green.x = _blue.x = 0;
            _maruRed.x = _maruGreen.x = _maruBlue.x = 0;
            
            // Linear
            new TweenLite(_red, 2, { "x":465, ease:Linear.easeOut } ).play();
            originalTweenLinear(_maruRed, 2, 465);
            
            // Quad.easeOut
            new TweenLite(_green, 2, { "x":465, ease:Quad.easeOut } ).play();
            originalTweenQuad(_maruGreen, 2, 465);
            
            // Cubic.easeOut
            new TweenLite(_blue, 2, { "x":465, ease:Cubic.easeOut } ).play();
            originalTweenCubic(_maruBlue, 2, 465);
        }
        
        private var _toXLinear:Number;
        private var _toXQuad:Number;
        private var _toXCubic:Number;
        
        // Linear
        private function originalTweenLinear(target:DisplayObject, time:Number, toX:Number):void {
            _toXLinear = toX;
            // ミリ秒単位で指定したタイマーイベント間の遅延 30fpsの場合、1000/30 = 33.3ミリ秒
            var delay:Number = 1000 / stage.frameRate;
            // 繰り返しの回数を指定します。継続時間とフレームレートから求める。
            var repeatCount:int = Math.ceil(time * stage.frameRate);
            
            _timerLinear = new Timer(delay, repeatCount);
            _timerLinear.addEventListener(TimerEvent.TIMER, timerLinear_timer);
            _timerLinear.start();
        }
        
        private function timerLinear_timer(e:TimerEvent):void 
        {
            // 現在の繰り返しは何回目か。
            var t:Number = _timerLinear.currentCount;
            // 出発地の x
            var b:Number = 0;
            // 目的地の x
            var c:Number = _toXLinear;
            // 指定した繰り返し回数。
            var d:Number = _timerLinear.repeatCount;
            
            _maruRed.x = easeLinear(t, b, c, d);
            
            // 最後だった場合、イベントをリムーブして、timerもGCへ
            if (_timerLinear.currentCount == _timerLinear.repeatCount) {
                _timerLinear.removeEventListener(TimerEvent.TIMER, timerLinear_timer);
                _timerLinear = null;
                return;
            }
        }
        
        // Quad
        private function originalTweenQuad(target:DisplayObject, time:Number, toX:Number):void {
            _toXQuad = toX;
            var delay:Number = 1000 / stage.frameRate;
            var repeatCount:int = Math.ceil(time * stage.frameRate);
            _timerQuad = new Timer(delay, repeatCount);
            _timerQuad.addEventListener(TimerEvent.TIMER, timerQuad_timer);
            _timerQuad.start();
        }
        
        private function timerQuad_timer(e:TimerEvent):void 
        {
            var t:Number = _timerQuad.currentCount;
            var b:Number = 0;
            var c:Number = _toXLinear;
            var d:Number = _timerQuad.repeatCount;
            _maruGreen.x = easeOutQuad(t, b, c, d);
            if (_timerQuad.currentCount == _timerQuad.repeatCount) {
                _timerQuad.removeEventListener(TimerEvent.TIMER, timerQuad_timer);
                _timerQuad = null;
                return;
            }
        }
        
        // Cubic
        private function originalTweenCubic(target:DisplayObject, time:Number, toX:Number):void {
            _toXCubic = toX;
            var delay:Number = 1000 / stage.frameRate;
            var repeatCount:int = Math.ceil(time * stage.frameRate);
            _timerCubic = new Timer(delay, repeatCount);
            _timerCubic.addEventListener(TimerEvent.TIMER, timerCubic_timer);
            _timerCubic.start();
        }
        
        private function timerCubic_timer(e:TimerEvent):void 
        {
            var t:Number = _timerCubic.currentCount;
            var b:Number = 0;
            var c:Number = _toXLinear;
            var d:Number = _timerCubic.repeatCount;
            _maruBlue.x = easeOutCubic(t, b, c, d);
            if (_timerCubic.currentCount == _timerCubic.repeatCount) {
                _timerCubic.removeEventListener(TimerEvent.TIMER, timerCubic_timer);
                _timerCubic = null;
                return;
            }
        }
        
        
        /**
         * 
         * @param    t    現在時間
         * @param    b    開始点
         * @param    c    終了点
         * @param    d    全体の時間
         * @return
         */
        public static function easeLinear (t:Number, b:Number, c:Number, d:Number):Number
        {
            return c*t/d + b;
        }
        
        private static function easeOutQuad (t:Number, b:Number, c:Number, d:Number):Number
        {
            return -c * (t /= d) * (t - 2) + b;
        }
        
        public static function easeOutCubic (t:Number, b:Number, c:Number, d:Number):Number
        {
            return c*((t=t/d-1)*t*t + 1) + b;
        }
        
    }
}