サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

StarlingフレームワークのJuggler.tween()メソッド

ID: FN1301004 Platform: All Version: CS6/ActionScript 3.0 Runtime: Flash Player 11/AIR 3.0

Jugglerクラス
パッケージ starling.animation
継承 Juggler → Object
tween()メソッド
文法 public function tween(target:Object, time:Number, properties:Object):void
概要 Tweenインスタンスをつくって、トゥイーンするプロパティを定めたうえで、参照するjugglerオブジェクトに加える。Tweenインスタンスは、Tweenクラスの中で使い回される。
引数

target:Object − トゥイーンさせるオブジェクト。

time:Number − トゥイーンにかける秒数。

properties:Object − トゥイーンの内容をプロパティで定めたObjectインスタンス。Tweenインスタンスのプロパティおよびトゥイーンするオブジェクトのプロパティが指定できる。

戻り値 なし。

説明

StarlingフレームワークのTweenクラスでオブジェクトをトゥイーンするには、まずTweenインスタンスをつくり、つぎにトゥイーンの中身を定め、そのうえでインスタンスをJugglerオブジェクトに加えます(「StarlingフレームワークのTweenクラスを使ったアニメーション」参照)。Juggler.tween()メソッドを使えば、これら3つの手順がまとめて行えます。

Jugglerオブジェクト.tween(対象オブジェクト, 秒数, 設定オブジェクト)

初めのふたつの引数はTween()コンストラクタと同じ、トゥイーンさせるオブジェクトとアニメーションにかける秒数です。Tween()コンストラクタの第3引数に渡すトランジション(イージング)も含めて、トゥイーンの内容はObjectインスタンスのプロパティとして定め、そのインスタンスをJuggler.tween()メソッドの第3引数に渡します。

第3引数のObjectインスタンスには、Tweenオブジェクトのプロパティとトゥイーンするオブジェクトのプロパティが定められます。たとえば、つぎのスクリプトでは、transitionとdelayはTweenインスタンスに定めるプロパティです(Tween.transitionおよびTween.delay)。それに対して、xはトゥイーンするオブジェクトのプロパティで、Tween.animate()メソッドの引数に渡すのと同じ処理になります。

juggler.tween(object, 2.0, {
  transition:Transitions.EASE_IN_OUT,
  delay:20,
  x:50
});

Juggler.tween()メソッドを用いると、TweenインスタンスはTweenクラスの中で使い回されます。ですから、Tween()コンストラクタで新たなインスタンスをつくってトゥイーンするより、Juggler.tween()メソッドで定めた方が、メモリの消費は抑えられ、処理を速めることにもつながります。


StarlingフレームワークのTweenクラスを使ったアニメーション」のスクリプト002では、つぎのようにトゥイーンを定めました。Tween()コンストラクタでインスタンスをつくってから、トゥイーンを設定し、Juggler.add()メソッドでインスタンスをJugglerオブジェクトに加えています。

var myTween:Tween = new Tween(myQuad, duration, myTransition);
myTween.moveTo(positionX, myQuad.y);
Starling.juggler.add(myTween);
myTween.onComplete = nextTween;

Juggler.tween()メソッドを使うと、同じトゥイーンがつぎのように定められます。Juggler.add()メソッドは呼出すことなく、トゥイーンの設定もObjectインスタンスにプロパティを加えて、メソッドの引数に渡せば済みます。

Starling.juggler.tween(myQuad, duration, {
  transition:myTransition,
  x:positionX,
  y:myQuad.y,
  onComplete:nextTween
});


実装

Juggler.tween()メソッドの実装をみてみましょう。Jugglerクラスに、メソッドは以下のように定められています。

まず、使い回すTweenインスタンス(tween)をTweenクラスから(fromPool()メソッドで)得ます。つぎに、メソッドの第3引数で受取ったObjectインスタンス(properties)からプロパティ(property)を取出して、トゥイーンに定めます。プロパティがTweenクラスに備わっていれば、Tweenオブジェクトのプロパティに値を加えます。そうではなく、トゥイーンするオブジェクト(target)のプロパティなら、Tween.animate()メソッドの引数に渡しています。そのうえで、Tweenオブジェクトは、Juggler.add()メソッドでJugglerオブジェクトに加えられます。

public function tween(target:Object, time:Number, properties:Object):void {
  var tween:Tween = Tween.starling_internal::fromPool(target, time);
  for (var property:String in properties) {
    var value:Object = properties[property];
    if (tween.hasOwnProperty(property))
      tween[property] = value;
    else if (target.hasOwnProperty(property))
      tween.animate(property, value as Number);
    else
      throw new ArgumentError("Invalid property: " + property);
  }
  tween.addEventListener(Event.REMOVE_FROM_JUGGLER, onPooledTweenComplete);
  add(tween);
}

private function onPooledTweenComplete(event:Event):void {
  Tween.starling_internal::toPool(event.target as Tween);
}

なお、Tweenインスタンスは、トゥイーンアニメーションを終えてEvent.REMOVE_FROM_JUGGLERイベントが起こったときに、Tweenクラスに(toPool()メソッドで)使い回しのオブジェクトとして戻されます。

TweenクラスのfromPool()とtoPool()は、つくったインスタンスを蓄えて、使い回すためのメソッドです。Tweenクラスには、以下のように定められています[*1]。使い回すTweenインスタンスは、静的プロパティ(sTweenPool)として宣言されたTweenベース型のVectorオブジェクトに納められます。

fromPool()メソッドは、静的プロパティ(sTweenPool)のVectorオブジェクトにインスタンスがあるかを確かめ、あればひとつ取出した上で、Tween.reset()メソッドにより初期化して返します。なければ、Tween()コンストラクタでつくった新たなインスタンスを返します。

toPool()メソッドは、Tweenインスタンスのおもなプロパティをすべてnullにして消し去り、イベントリスナーも除いたうえで(EventDispatcher.removeEventListeners()メソッドの呼出し)、静的プロパティ(sTweenPool)のVectorオブジェクトに加えます。プロパティにnullを与えるのは、オブジェクトへの参照を断って、ガベージコレクションを促すためです[*2]

private static var sTweenPool:Vector.<Tween> = new <Tween>[];

starling_internal static function fromPool(target:Object, time:Number, transition:Object="linear"):Tween {
  if (sTweenPool.length) return sTweenPool.pop().reset(target, time, transition);
  else return new Tween(target, time, transition);
}

starling_internal static function toPool(tween:Tween):void {
  tween.mOnStart = tween.mOnUpdate = tween.mOnRepeat = tween.mOnComplete = null;
  tween.mOnStartArgs = tween.mOnUpdateArgs = tween.mOnRepeatArgs = tween.mOnCompleteArgs = null;
  tween.mTarget = null;
  tween.mTransitionFunc = null;
  tween.removeEventListeners();
  sTweenPool.push(tween);
}

[*1] starling_internalは、starling.coreパッケージに定められた名前空間です。決まった他のクラスからのみ参照できるように設けられた非ドキュメントの名前空間です。将来のバージョンのStarlingでは除かれる可能性があります。

[*2] toPool()メソッドには、つぎのようなコメントが添えられています。

オブジェクトへの参照をリセットして、ガベージコレクションが妨げられないようにする。 (reset any object-references, to make sure we don't prevent any garbage collection)

参考

[Starling Framework Reference] > [Juggler]


作成者: 野中文雄
作成日: 2013年1月16日


Copyright © 2001-2013 Fumio Nonaka.  All rights reserved.