[ AS3 ]
外部swfの動作が異常に重い時 -getDefinitionByName- 前編 - 09/01/14 20:12 by umroom
フルフラッシュのサイトを作ってて、コンテンツ毎にswfを分割して作ることはよくあると思うんだけど(コンテンツ内のデバッグしやすいし、分担もできるしね)、コンテンツのswfを Loader で読み込むと動作が重くならん?俺だけか?マシンスペックの問題か?
メインのswf(親)にコンテンツのswf(子)をロードするだけならまだいいんだけど、子swfが孫swfをロードするとなると孫が重いのなんのって。
こういう構造のフラッシュは Progression 使うこともそれなりにあるだろうけど、プリローダー使うとその時点で親子状態のできあがり。プリローダーは便利だけど孫をロードすると既に重い。ひ孫のロードなんて考えたくもない。
今やり始めた案件がこんな状態なので、考えなきゃいけないハメになって半日アレコレ悩んだ。
救いの神は flash.utils.getDefinitionByName 。これのおかげで全て解決。書き換えとデバッグは大変だけど、ゴールが見えたってのは大きな前進だ。
どうやったかは以下に。まだ完成してないので出し惜しみしつつ、、
getDefinitionByNameって何?
色んなサイト、ブログで紹介されてるけど、クラスを new する時に変数が使えますってこと。
//これはOK var mc = new MovieClip(); //これはNG var className= "MovieClip"; var mc2 = new className;
NGなケースは色々と問題ありで、やっぱできない。
でも、クラス名に変数が使えると便利なこともあるので何とかしたい。
って時に使うのが getDefinitionByName 。
先のNGなケースをOKにすると以下の様になる。
var className = getDefinitionByName("flash.display.MovieClip") as Class;
var mc2 = new className();
パッケージも忘れず書く事。
getDefinitionByName の引数はString なので、変数を絡める事も勿論OK。
ReferenceError: Error #1065: 変数 XXXX(クラス名) は定義されていません。
とエラーが出た時は引数の間違いを調べる。
MyClass1 〜 MyClass10 が Sprite の拡張クラスとしてある時、それぞれ1つずつ new して addChildする場合を考える。
getDefinitionByName を使うと、for で回せるので以下の様になる。
for(var i:uint=1; i<=10; i++){
var className = getDefinitionByName("MyClass"+i) as Class;
var sprite = new className();
addChild( Sprite(sprite) );
}
addChild の際、Sprite でキャストしてるのは、addChild の段階で MyClassX が Sprite の拡張かどうかを判別できないため。
これだけでも可能性を感じません?
でもこれで Loader の問題が解決できんのか?って思うよね。それができるんだよ。
以下の一文だけで分かった人はこの先見なくてももうOK。
「Loader で子swfを読み込んでから、子swfのメインクラスを getDefinitionByName で親swfに addChild する。」
子swfを直接addChild するんじゃなく、親swfのライブラリの一部として扱う様なもの。
で、肝心の使い方はまた今度。だって自分の作業が終わってないんだもの。
« [ ゲーム ] バルドスカイ体験版の音が直った | ブログトップ | [ GreenSock ] TweenMax でカスタムイージングしちゃうんです »
トラックバックURL :