ローディング処理で悩んでいたが、やっと解決。
AS2の時は普通に1フレーム目(シーン1とか)にローディングのスクリプトを書いて、gotoAndStop(2)で2フレーム目に飛ばす方法で1つのFlash内でローディングを行っていた。タイムラインベースで処理をしていたからできた技。
しかし、AS3を始めてからはクラス定義をして.asファイルで何でもやろうとしているため、ローディングはプリローダswfを用意して読み込ませる方法や、自分自身をローダーと最小限のコンテンツに抑え、別途外部のSWFや画像を子としてロードしてやる方法で対応していた。
で、どうしてもちょっと重めのコンテンツを1つのSWFで実装しなければならなかったため、悩んだ末、ある方法を思いついた。
まずは、Flash自体のドキュメントクラス定義はここでは設定しない。
そして、1フレーム目にローディングのスクリプトを書いてしまう。
ローディングが完了したらgotoAndStop(2) で2フレーム目に。(ここはAS2の時と一緒)
this.stop();
var info : LoaderInfo = root.loaderInfo;
info.addEventListener(ProgressEvent.PROGRESS, updateLoadingBar);
info.addEventListener(Event.COMPLETE, displayContent);
function updateLoadingBar(event){
// ローディングバーを動かす処理
}
function displayContent(event){
this.gotoAndStop(2);
}
続いて、2フレーム目にはコンテンツを配置。この時、ばらばらに配置するのではなく、すべてのコンテンツをMovieClipとしてラップし、リンケージのクラスで、Flash自体に定義する予定だったクラスを割り当てる。
重要なのは「1フレーム目に書き出し」のチェックを外すこと。これをしないと、文字通り1フレーム目に書き出されるため、ローディングバーの表示タイミングが遅れ、表示と同時にローディング終了という意味のない結果に・・・。
あとは通常通りにasファイルにスクリプトを記述するだけでよい。
他のクラスの読み込みなども、多分、問題ないはず。
っていうか、良く見たらAS2の時とやり方としては同じだった。
だとすると、みんな当たり前にこの方法でやっているってこと?実は今さらな感じかも。
書いていて気付いたが、1フレーム目のローディング中のスクリプトも、別にFlash内に書かなくてもFlash自体のドキュメントクラス定義のas(コンテンツとは別のas)に記述しても良いかも。全てasで管理した方が分かりやすいかな?後でやってみよう。