投稿日:2008-02-27 Wed
オブジェクトとか配列とかは参照型にななりるってのは、前回書きました。var a:Object = new Object();
とすると、aには出来上がったオブジェクトそのものが格納されるのではなく、メモリのどこにオブジェクトがあるかを指すようになります。まあ前回も書きましたがWindowsでいうショートカットみたいなもんですかね。
では、
a = new Object();
a = new Object();
と連続でオブジェクトを作ったら・・・・・
aは出来上がったオブジェクトのショートカットを指してるので、aは後で作ったオブジェクトのショートカットが格納されてます。
じゃあ前に作られたオブジェクト本体は?
Windowsとかで言うとショートカットはいくら変更したり削除しても本体は残ってます。
オブジェクトも同じで、本体は残ったままです。しかもaは後のオブジェクトを指しているので、プログラマからみたら、前に作られたオブジェクト本体は行方不明状態です。
ただActionScriotには、ガベージコレクション機能というものが備わっています。
使わなくなったメモリ領域を自動で消していってくれる機能で大変ありがたい機能です。
この機能のおかげか、実際メモリとか気にしないで何度も同じオブジェクトとか配列とか使ってるソースも多々見られるのも感じるところです。
ムービークリップローダーを一つ作って使いまわすとかじゃなく、毎回新規にローダー作ってjpeg読み込ませるとか・・・・
思い当たる人もいるんじゃないでしょうか。
さて、ここで前に書いたTweenクラスに話が戻りますが
import mx.transitions.Tween;
var myTween:Tween
_mc.onPress = function()
{
myTween = new Tween (this, "_x", None.easeOut, this._x, this._x + 50, 10, false);
}
これでステージに「_mc」ってインスタンス名のついたムービークリップがあれば、_mcをクリックする度に、_mcの座標が右に10フレームかけて50ピクセル移動するスクリプトの出来上がりです。
ここで注目すべきは、_mcをクリックする度に、Tweenクラスが作られている事です。
瞬間的に10回クリックすると10個のTweenクラスが作られてしまう訳です。
ガベージコレクションで、そのうち消えていくかもしれませんが、このTweenクラスは10フレームかけて_mcを動かそうとするクラスです。ここが問題です。
10回クリックすると、作られた10個のオブジェクトが、それぞれ_mcを動かそうとしてしまう訳です。
これが大問題で、いくつも同じ動きをしようとして競合するので、動作そのものクリックすればするほど、どんどん重くなっていきます。
じゃあ、どうすればいいのか?
Tweenクラスは、一つだけを作り、そのTweenクラスで制御すればいいです。
クリック時にTweenクラスを作ると毎回作ることになるので、予めTweenクラスを作り、クリック時に必要なTweenクラスのプロパティを設定し、動かすメソッドを呼び出します。
import mx.transitions.Tween;
var myTween:Tween = new Tween (_mc, "_x", None.easeOut, this._x, this._x, 0, false);
_mc.onPress = function ()
{
myTween.stop ();
myTween.obj = this;
myTween.prop = "_x";
myTween.func = mx.transitions.easing.None.easeOut;
myTween.begin = this._x;
myTween.finish = this._x + 50;
myTween.duration = 10;
myTween.useSeconds = false;
myTween.start ();
};
こんな感じですかね。
予めTweenクラスを制作。最初作った時は実際は動かさないので0フレームかけて同じX座標値へ移動としています。
クラス制作時に与えている設定値は、後で変更できます。
Tweenクラスのstart()メソッドで動作開始、stop()で動作停止です。
これだと、何回クリックしても一つのTweenクラスしか関係しないので重くなったりしないです。
△ PAGE UP