AS3S.ORG

ACTIONSCRIPT 3.0 SOURCES

org.as3s.Tween Ver2.0の使い方(5) カスタムイージング関数

org.as3s.Tween Ver2.0ではイージング関数として独自に作成した関数を利用することができます。
また使い方(3)で紹介したように、持続時間を設定しないイージング関数を作成することができるため、従来のTweenライブラリよりも柔軟な拡張が可能です。

カスタムイージング関数

カスタムイージング関数は、Function closureで記述する必要があります。

public function func():void {
    trace(this);
};

ではなく、

public var func:Function = function():void {
    trace(this);
};

という記述方法のことです。(参考:メソッドクロージャとバインドメソッド

カスタムイージング関数内では、thisはTweenクラスで使用されるTweenParamオブジェクトを指し、次のパラメータが使用されます。
this.init: Tween開始時の初期値
this.begin: 各Tween開始時の初期値(複数Tweenを設定した場合はそれぞれの初期値)
this.value: Tween中の現在の値
this.end: 各Tweenの目標値
this.change: 各Tweenの変化量
this.complete: 各Tweenが終了したかどうかのBoolean

例)Tweenクラスで用意されている単純なイージング(Tween.easing)の実装

public static var uniform:Function = function(t:Number, b:Number, c:Number, d:Number, v:Number = 1):Number {
            if (v*c<0) v = -v;
            var distance:Number = this.end - this.value;
            if (v>0 && v>distance || v<0 && v<distance) {
                this.complete = true;
                return this.end;
            } else {
                return this.value + v;
            }
        };

上記のように、カスタムイージング関数内ではTween中の毎フレームの値を返すようにし、Tweenが完了した場合にはthis.completeをtrueにします。

また、Tween.accelerate関数のように、現在の速度といった独自のパラメータを持たせることもできます。
例)Tweenクラスで用意されている等加速度イージング(Tween.accelerate)の実装

public static var accelerate:Function = function(t:Number, b:Number, c:Number, d:Number, a:Number = 1, iv:Number = 0):Number {
            if (a*c<0) a = -a;
            this.v = this.v!=null ? this.v + a : iv + a;
            var distance:Number = this.end - this.value;
            if (this.v>0 && this.v>distance || this.v<0 && this.v<distance) {
                this.complete = true;
                return this.end;
            } else {
                return this.value + this.v;
            }
        };

動作サンプル

以下のサンプルは、少しトリッキーな例ですが、上記のTween.easing関数をベースに目標値が刻々と変化するようなカスタムイージング関数を定義して、マウスカーソルに追随するアニメーションを作成しています。

package {
    import fl.motion.easing.*;
   
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.*;
    import flash.geom.ColorTransform;
   
    import org.as3s.Tween;
   
    [SWF(width='700',height='300',backgroundColor='0xeeeeee',frameRate='60')]
    public class TweenSample5 extends Sprite {
       
        private var tween:Tween;
        private var sp:Sprite;
       
        public function TweenSample5() {
           
            //Target Object
            sp = new Sprite();
            sp.graphics.beginFill(0x333333);
            sp.graphics.drawRect(-25, -25, 50, 50);
            sp.graphics.endFill();
            addChild(sp);
           
            //Mouse Event
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
           
        }
       
        private function onMouseMove(event:Event):void {
            Tween.start(sp, {}, {scaleX:1, scaleY:1, alpha:0.5}, Tween.easing);
            Tween.start(sp, {COMPLETE:onTweenComplete}, {x:stage.mouseX}, followEasing, 0, [stage, "mouseX", 0.1]);
            Tween.start(sp, {COMPLETE:onTweenComplete}, {y:stage.mouseY}, followEasing, 0, [stage, "mouseY", 0.1]);
        }
       
        private function onTweenComplete(event:Event):void {
            if (sp.x==stage.mouseX && sp.y==stage.mouseY) {
                Tween.start(sp, {}, {scaleX:1.5, scaleY:1.5, alpha:1}, Tween.easing);
            }
        }
       
        //Custom Easing Function
        private var followEasing:Function = function(t:Number, b:Number, c:Number, d:Number, target:Object, key:String, fraction:Number = 0.5, threshold:Number = 0.05):Number {
            this.end = target[key];
            var distance:Number = this.end - this.value;
            var v:Number = distance*fraction;
            if ((v<0 ? -v : v) <threshold) {
                this.complete = true;
                return this.end;
            } else {
                return this.value + v;
            }
        };
       
    }
}

Written by admin

August 4th, 2008 at 10:23 pm

Posted in Tween

2 Responses to 'org.as3s.Tween Ver2.0の使い方(5) カスタムイージング関数'

Subscribe to comments with RSS or TrackBack to 'org.as3s.Tween Ver2.0の使い方(5) カスタムイージング関数'.

  1. はじめまして。いつも愛読させていただいています。
    さっそくTweenライブラリをダウンロードして使わせていただきました。
    まだ少ししか触っていないのですが、Filter Tweenに超絶的に感動しました。
    他のTween機能も試させていただきますね。
    いつも貴重な情報・素晴らしいライブラリをありがとうございます。

    shinro

    20 Aug 08 at 11:23 am

  2. しばらくblogを書く暇がなくてコメントに気づくのが遅くなりました。
    こんなマイナーなTweenライブラリを使っていただきありがとうございます。

    admin

    17 Oct 08 at 10:40 pm

Leave a Reply