tweenクラスにリスナーメソッドがついているの?
TweenFactoryで使ってるExTweenを普通のTweenにしてもaddEventListenerの動作が確認できるんだけど、これってどういうことだろう?
後でちゃんと調べよう。
Strategyパターンを習得した(と思う)
ずいぶん前に
オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座
- 作者: 牛尾剛,長瀬嘉秀
- 出版社/メーカー: 翔泳社
- 発売日: 2003/07/02
- メディア: 単行本
- 購入: 12人 クリック: 318回
- この商品を含むブログ (75件) を見る
しかしそれもこの本で終われそうだ。
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
- 作者: Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates,佐藤直生,木下哲也,有限会社福龍興業
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/12/02
- メディア: 大型本
- 購入: 14人 クリック: 362回
- この商品を含むブログ (98件) を見る
最初の数章しか読んでいないが、デザインパターのすばらしさがよくわかる。
とりあえずStrategyパターンはほぼマスターしたつもり。
インターフェイスに実装していく意味がようやくわかった。
カラーの数値変換
Colorクラスはなくなるらしいけど、まぁ作ったから公開しとく
/**
*
* 数値変換クラス
*
* @author aizu
* @version 0.1.0
*/
class jp.ojos.tools.ConvertNumber {
/**
*
* RGB値からTransformオブジェクトを作成
*
* @param RGB RGB値
* @param paintOver 塗りつぶしの判断
*/
static function ToTransform(RGB : Object, paintOver : Boolean) : Object {
var str : String;
if(isNaN(RGB)){
var rgb : String = RGB.toString();
if(rgb.indexOf("#") == 0){
if(rgb.length == 4){
str = rgb.substr(1,1) + rgb.substr(1,1) + rgb.substr(2,1) + rgb.substr(2,1) + rgb.substr(3,1) + rgb.substr(3,1);
}else if(rgb.length == 7){
str = rgb.substr(1,6);
}else{
trace("not convert(RGBtoTransform)");
return;
}
}else{
trace("not convert(RGBtoTransform)");
return;
}
}else{
str = RGB.toString(16).substr(-6,6);
}
var rb : Number = Number("0x" + str.substr(0,2));
var gb : Number = Number("0x" + str.substr(2,2));
var bb : Number = Number("0x" + str.substr(4,2));
if(paintOver){
var Transform : Object = {ra:0, rb:rb, ga:0, gb:gb, ba:0, bb:bb};
}else{
var Transform : Object = {rb:rb, gb:gb, bb:bb};
}
return Transform;
}
/**
*
* TransformオブジェクトからRGB値を作成
*
* @param Transform Transformオブジェクト
*/
static function ToRGB(Transform : Object) : Number {
var RGB : Number = Number("0x" + Transform.rb.toString(16) + Transform.gb.toString(16) + Transform.bb.toString(16));
return RGB;
}
}
他の数値変換も必要になったら足していくつもり。
MovieClip._lockroot = trueは重要
またMacromediaにやられました。
やりたかったことは外部swfを読み込んで外部swfのなかにwindowコンポーネントを配置したいという単純なものでした。
しかしそのままやっても動作しないわけです。
...と半年前ぐらいから悩んでたんですがついに解決。
答えは
MovieClip._lockroot = true
これで外部swfは読み込みswfのライブラリではなく自分自身のライブラリを参照するということでした。
続々・tweenクラスを拡張
あまり安定していないと思いますが、とりあえずまたマイナーバージョンアップ。
(というかバージョン1.xはちょっと言いすぎなので0.xにしました)
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 0.3.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 削除対象プロパティ
*/
public function deleteTween(obj : Object,
prop : String) : Void {
this[prop + "Tween"].stop();
delete this[prop + "Tween"];
}
/**
*
* 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"]["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);
};
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;
}
}
続・tweenクラスを拡張
結局あれやこれやエラーテストしているうちにこんな感じになりました。
- 対象オブジェクトのNumberクラスのプロパティおよびColorオブジェクトに与えるオブジェクトの数値をいじれる
- コールバック関数を指定しておくと毎フレームコールバック関数を呼び出す(色関係は終了フレームのみ)
- コールバック関数に与えられるオブジェクトのプロパティは
- obj : 対象オブジェクト
- prop : 対象プロパティ
- 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;
}
}
tweenクラスを拡張
パフォーマンスはあんまりよくないかもしれないが、同じことをやろうとしたら結局同じことを書くと思うのでこの際無視。
まずはイベントリスナーを登録できるようにTweenクラスを拡張。
jp.ojos.ExTween.as
import mx.transitions.Tween;
/**
*
* イベントリスナーを追加できるTweenクラス
*
* @author eyes
*/
class jp.ojos.ExTween extends Tween {
var addEventListener:Function;
var removeEventListener:Function;
private var dispatchEvent:Function;
function ExTween(obj, prop, func, begin, finish, duration, useSeconds) {
super(obj, prop, func, begin, finish, duration, useSeconds);
}}
これを使ってTween制御クラスを作成
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.0.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"];
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"]["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;
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;
}
}
こんな感じ。
すごい人が見たらまだまだだろうが、今の自分にはこれが精一杯。
ツッコミ大歓迎。
●追記
若干修正。
このままMovieClipプロパティとColorオブジェクトプロパティ以外いじれないので、その他のプロパティをいじった時はコールバックメソッドを呼び出すように修正。
private static var mcProp : Array = ["_alpha","_height","_rotation","_width","_x","_xmouse","_xscale","_y","_ymouse","_yscale"];
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);
}