前回同様、青い線が等速直線運動での経過時間(フレーム数)に対する移動距離を示している。これに重ね合わせるsin関数が赤い線で書かれている。重ねあわされた結果が、緑の線。接線の傾きが速度を意味しているので、起点と終点で傾きがほぼ水平(=ゼロ)であることからも、ゆっくりとスタートし、ゆっくりと止まることが読み取れるだろう。
これを実装したのが、以下のコード。前の投稿で紹介した親関数の派生クラスである。
package com.toritoriworks.utils {
public class BothEndsEasing extends Easing {
public function BothEndsEasing(start:Number, end:Number, frame:int, easing:Number) {
super(start, end, frame);
var e:Number = easing <> 1) ? 1 : easing);
var w:Number = 2 * Math.PI / (frame-1);
var a:Number = e * _vx / Math.sin(w);
for(var i:int = 0;i < frame;i++) {
_Asin.push(a * Math.sin(w * i));
}
}
}
}
最初の引数が、起点の座標、第2引数が終点の座標、第3引数が終点に至るまでのフレーム数、最後の引数が、イージングの強さになる。イージングの強さは、0以上1以下の数値で指定する。0ならば、イージング効果なしとなる。それ以外の値を入れた場合、0から1近い方の値に読み替えられる。次のコードは、起点0、終点100で、終点まで24フレームで移動する。最後の引数が1なので、この実装でのイージング効果は最大になっている。
var myEasing = new BothEndsEasing(0,100,24,1);
addEventListener(EVENT.ENTER_FRAME, frameHandler);
function frameHandler(event:Event):void {
myMovieClip.x = myEasing.forward();
}
動作は、こんな感じになる。