[Progression 4]SceneLoader
今まで使う機会がなかったのでスルーしていたSceneLoaderクラス
基本的には他のProgressionのSWFを読み込んでそのままシーンの遷移が使えるというものですが、なんかわかりやすい解説が見つからなかったし、いくつか注意点もあるのでまとめてみる。
ProgressionによるFlashコンテンツ開発ガイドブックにもサンプルとなるコードはありますが、少し違う形で説明します。
まずは、親SWF(読み込み元)のシーン。

上記図のようにSceneObjectクラスを継承した普通のシーンとSceneLoaderを継承した外部SWFを読み込んで展開するSampleScene3とします。
自分の場合は、シーン関連のクラスはすべて「〜Scene」と命名するので、継承クラスが異なってもそれに従う形にしています。
(命名に関してはそれぞれの思想・宗教により異なるかと思いますので、それらに沿って適当につけてください!)
上記の書籍ではClassSceneLoaderとかいうクラス名が個人的にダメだったのかもしれない。
(最終的には理解できたのでこのエントリーがあるわけですが)
まずは、SceneLoaderクラスを継承するSampleScene3のサンプルコード。
package scenes { import flash.net.URLRequest; import jp.progression.commands.display.RemoveChild; import jp.progression.commands.net.LoadScene; import jp.progression.commands.tweens.DoTweener; import jp.progression.scenes.SceneLoader; public class SampleScene3 extends SceneLoader { private var CHILD_SWF:String = 'child.swf'; public function SampleScene3(name:String=null, initObject:Object=null) { super(name, initObject); title = "シーンタイトル"; } protected override function atScenePreLoad():void { addCommand( new LoadScene(new URLRequest(CHILD_SWF), this, null, { // ここではprogressイベントだけ利用しています。 // completeなど、他のイベントも設定できますよ onProgress: function() { var percent:Number = (this.bytesLoaded / this.bytesTotal) * 100; trace("percent : " + percent); } }) ); } protected override function atScenePostUnload():void { unload(); } } }
次に子SWF(ロードされるSWF)に関して。
(例ではchild.swf)
まず、Progressionのプロジェクトパネルでデフォルトのままプロジェクトを作成してしまうと、index.asは以下のようなコードになります。
public class Index extends CastDocument { /** * 新しい Index インスタンスを作成します。 */ public function Index() { // 自動的に作成される Progression インスタンスの初期設定を行います。 // 生成されたインスタンスにアクセスする場合には manager プロパティを参照してください。 super( "index", IndexScene, new WebConfig() ); } /** * SWF ファイルの読み込みが完了し、stage 及び loaderInfo にアクセス可能になった場合に送出されます。 */ override protected function atReady():void { // 開発者用に Progression の動作状況を出力します。 //Debugger.addTarget( manager ); // 外部同期機能を有効化します。 manager.sync = true; // 最初のシーンに移動します。 manager.goto( manager.syncedSceneId ); } }
親SWFも子SWFも上記と同じコードだと子SWFを読み込んだときにエラーとなり正常に動作しません。
原因は2つあり、ひとつはクラス名の重複です。
SceneLoaderではApplicationDomainの指定ができないため、親SWFと子SWFで同名のクラスがある場合、親SWFのクラスが利用されてしまいます。(ApplicationDomainに関してはこちらを参照ください)
次にManagerIDの指定の重複です。
上記サンプルコードの場合だとsuperの箇所にある”index”にあたります。
これも親SWFと重複してはいけません。
その他、子SWFはCastDocumentクラスを利用している必要があります。
(これはプロジェクトパネルで作成すればデフォルトでCastDocumentクラスを継承しているので、普通はあまり問題ないです)
ということで修正したデフォルトのクラスは下記。
public class Sample3 extends CastDocument { /** * 新しい Index インスタンスを作成します。 */ public function Sample3() { // 自動的に作成される Progression インスタンスの初期設定を行います。 // 生成されたインスタンスにアクセスする場合には manager プロパティを参照してください。 super( "sample3", Sample3Index, new WebConfig() ); } /** * SWF ファイルの読み込みが完了し、stage 及び loaderInfo にアクセス可能になった場合に送出されます。 */ override protected function atReady():void { // 開発者用に Progression の動作状況を出力します。 //Debugger.addTarget( manager ); // 外部同期機能を有効化します。 manager.sync = true; // 最初のシーンに移動します。 manager.goto( manager.syncedSceneId ); } }
あとは、クラスの重複などに注意しながら普通に子SWFの制作を進めるだけです。
当然、子SWFの下にさらにaddSceneすることもできますし、子SWFは単体でも動作します。