続・tweenクラスを拡張

結局あれやこれやエラーテストしているうちにこんな感じになりました。

  • 対象オブジェクトのNumberクラスのプロパティおよびColorオブジェクトに与えるオブジェクトの数値をいじれる
  • コールバック関数を指定しておくと毎フレームコールバック関数を呼び出す(色関係は終了フレームのみ)
  • コールバック関数に与えられるオブジェクトのプロパティは
    1. obj : 対象オブジェクト
    2. prop : 対象プロパティ
    3. finish : 最終フレームにtrueを格納(以外はfalse)

ソースコード

import jp.ojos.ExTween;
import mx.events.EventDispatcher;

/**
*
* Tweenクラス制御クラス
*
* @author aizu
* @param obj Tween対象ムービークリップ
* @param prop 変化対象プロパティ
* @param func イージング関数
* @param begin 変化対象プロパティの初期値
* @param finish 変化対象プロパティの最終値
* @param duration 変化所要時間(/秒)
* @param delay 変化開始までの所要時間(/秒)
* @param callBack コールバック関する設定
* @param tween Tweenクラス本体
* @param colorProp 色構造体が持っているプロパティ指定用
* @version 1.2.0
*
*
*
* Example
*
* ステージに"ring_mc"と名前をつけたインスタンスを配置し
* 1フレーム目に下記のスクリプトを記述
*
* import jp.ojos.TweenFactory;
* import mx.transitions.easing.*;
*
* var tf : TweenFactory = new TweenFactory(ring_mc,
* ["_x","_y","ra","rb","ga","gb","ba","bb"],
* [Strong.easeOut,Elastic.easeOut,Regular.easeIn,Regular.easeIn,Regular.easeIn,Regular.easeIn,Regular.easeIn,Regular.easeIn,Regular.easeIn],
* undefined,
* [400,300,0,255,0,150,0,50],
* [3,1,1,1,1,1,1,1],
* [0,0,0,0,0,0,0,0],
* {ref:this, func:"callTest"});
* tf.createTween();
* tf.changeTween(ring_mc,["rb"],undefined,undefined,[10],[1],[1],undefined);
* function callTest(evt : Object) : Void{
* trace(evt.obj +"."+ evt.prop + " = " + evt.obj[evt.prop] );
* }
*
*
*/
class jp.ojos.TweenFactory {

private var obj : Object;
private var prop : Object;
private var func : Object;
private var begin : Object;
private var finish : Object;
private var duration : Object;
private var delay : Object;
private var callBack : Object;

private var tween : ExTween;
private static var colorProp : Array = ["ra","rb","ga","gb","ba","bb"];
private static var mcProp : Array = ["_alpha","_height","_rotation","_width","_x","_xmouse","_xscale","_y","_ymouse","_yscale"];

function TweenFactory(obj : Object,
prop : Object,
func : Object,
begin : Object,
finish : Object,
duration : Object,
delay : Object,
callBack : Object) {
this.obj = obj;
this.prop = prop;
this.func = func;
this.begin = begin;
this.finish = finish;
this.duration = duration;
this.delay = delay;
this.callBack = callBack;
}

/**
*
* Tween動作設定
*
* @param obj Tween対象ムービークリップ
* @param prop 変化対象プロパティ
* @param func イージング関数
* @param begin 変化対象プロパティの初期値
* @param finish 変化対象プロパティの最終値
* @param duration 変化所要時間(/秒)
* @param delay 変化開始までの所要時間(/秒)
* @param callBack コールバック関する設定
*/

public function createTween(obj : Object,
prop : Object,
func : Object,
begin : Object,
finish : Object,
duration : Object,
delay : Object,
callBack : Object) : Void {

this.obj = ( obj == undefined ) ? this.obj : obj;
this.prop = ( prop == undefined ) ? this.prop : prop;
this.func = ( func == undefined ) ? this.func : func;
this.begin = ( begin == undefined ) ? this.begin : begin;
this.finish = ( finish == undefined ) ? this.finish : finish;
this.duration = ( duration == undefined ) ? this.duration : duration;
this.delay = ( delay == undefined ) ? this.delay : delay;
this.callBack = ( callBack == undefined ) ? this.callBack : callBack;

createColor(this.obj);

//alert
if(this.prop.length != this.finish.length){
trace("prop.length is not corresponding to finish.length.");
}

for(var i : Number = 0;i < this.prop.length;i++){
var pr : String = this.prop[i];
var fu : Function = ( this.func[i] == undefined ) ? this.func[0] : this.func[i];
var be : Number = ( this.begin[i] == undefined ) ? this.obj[pr] : this.begin[i];
var fi : Number = this.finish[i];
var du : Number = ( this.duration[i] == undefined ) ? this.duration[0] : this.duration[i];
var de : Number = ( this.delay[i] == undefined ) ? this.delay[0] : this.delay[i];

/*
trace("this.obj : " + this.obj);
trace("pr : " + pr);
trace("fu : " + fu);
trace("be : " + be);
trace("fi : " + fi);
trace("du : " + du);
trace("de : " + de + "\n\n");
*
*/


if(this[pr + "IntervalID"] != undefined){
deleteInterval(this[pr + "IntervalID"]);
}
this[pr + "IntervalID"] = setInterval(this, "buildTween", de * 1000,
this.obj, pr, fu, be, fi, du, this.callBack);
}
}

/**
*
* Tween動作設定(割り込み用)
*
* @param obj Tween対象ムービークリップ
* @param prop 変化対象プロパティ
* @param func イージング関数
* @param begin 変化対象プロパティの初期値
* @param finish 変化対象プロパティの最終値
* @param duration 変化所要時間(/秒)
* @param delay 変化開始までの所要時間(/秒)
* @param callBack コールバック関する設定
*/

public function changeTween(obj : Object,
prop : Object,
func : Object,
begin : Object,
finish : Object,
duration : Object,
delay : Object,
callBack : Object) : Void {

obj = ( obj == undefined ) ? this.obj : obj;
callBack = ( callBack == undefined ) ? this.callBack : callBack;

//alert
if(prop.length != finish.length){
trace("prop.length is not corresponding to finish.length.");
}

for(var i : Number = 0;i < prop.length;i++){
var pr : String = prop[i];
var fu : Function = ( func[i] == undefined ) ? func[0] : func[i];
var be : Number = ( begin[i] == undefined ) ? obj[pr] : begin[i];
var fi : Number = finish[i];
var du : Number = ( duration[i] == undefined ) ? duration[0] : duration[i];
var de : Number = ( delay[i] == undefined ) ? delay[0] : delay[i];

for(var j : Number = 0;j < this.prop.length;j++){
if(this.prop[j] == pr){
this.prop[j] = pr;
this.func[j] = fu;
this.begin[j] = be;
this.finish[j] = fi;
this.duration[j] = du;
this.delay[j] = de;
}
}

/*
trace("obj : " + obj);
trace("pr : " + pr);
trace("fu : " + fu);
trace("be : " + be);
trace("fi : " + fi);
trace("du : " + du);
trace("de : " + de + "\n\n");
*
*/

if(this[pr + "IntervalID"] != undefined){
deleteInterval(this[pr + "IntervalID"]);
}
this[pr + "IntervalID"] = setInterval(this, "buildTween", de * 1000,
obj, pr, fu, be, fi, du, callBack);
}
}

/**
*
* Tween作成
*
* @param obj Tween対象ムービークリップ
* @param prop 変化対象プロパティ
* @param func イージング関数
* @param begin 変化対象プロパティの初期値
* @param finish 変化対象プロパティの最終値
* @param duration 変化所要時間(/秒)
* @param callBack コールバック関する設定
*/

private function buildTween(obj : Object,
prop : String,
func : Function,
begin : Number,
finish : Number,
duration : Number,
callBack : Object) : Void {
deleteInterval(this[prop + "IntervalID"]);

this[prop + "Tween"] = new ExTween(obj, prop, func, begin, finish, duration, true);
this[prop + "Tween"]["obj"] = obj;
this[prop + "Tween"]["prop"] = prop;
this[prop + "Tween"]["prop"] = prop;
this[prop + "Tween"]["callBack"] = callBack;


EventDispatcher.initialize(this[prop + "Tween"]);
this[prop + "Tween"].onMotionFinished = function(){
var lo:Object = new Object();
lo.target = this;
lo.type = callBack.func;
lo.obj = obj;
lo.prop = prop;
lo.finish = true;
this.dispatchEvent(lo);
};

for(var i : Number = 0;i < mcProp.length;i++){
if(prop != mcProp[i]){
this[prop + "Tween"].onMotionChanged = function(){
var lo:Object = new Object();
lo.target = this;
lo.type = callBack.func;
lo.obj = obj;
lo.prop = prop;
lo.finish = false;
this.dispatchEvent(lo);
};
}
}

this[prop + "Tween"].addEventListener(callBack.func,callBack.ref);

changeColor(obj, prop);
}

/**
*
* 色変化を反映させる
*
* @param obj Tween対象ムービークリップ
* @param prop 変化対象プロパティ
*/

private function changeColor(obj : Object,
prop : String) : Void{
for(var i : Number = 0;i < colorProp.length;i++){
if(prop == colorProp[i]){
this[prop + "Tween"][obj._name + "Color"] = this[obj._name + "Color"];
this[prop + "Tween"].onMotionChanged = function(){
var colorObj : Object = new Object;
colorObj[prop] = this.position;
this[obj._name + "Color"].setTransform(colorObj);
};
}
}
}

/**
*
* Colorクラス作成
*
* @param obj Tween対象ムービークリップ
*/

private function createColor(obj : Object) : Void
{
if(this[obj._name + "Color"] == undefined){
this[obj._name + "Color"] = new Color(obj);
}
var colorObj : Object = this[obj._name + "Color"].getTransform();
for(var i : String in colorObj){
obj[i] = colorObj[i];

}
}

/*
*
* 各Interval関数の破棄
*
* @param intervalID
*/

private function deleteInterval(intervalID : Number) : Void
{
clearInterval(intervalID);
delete intervalID;
}
}