Progression 外部SWF素材を親SWFのSceneObject内で呼出す

このエントリーをはてなブックマークに追加

Progressionにて外部SWFから素材の呼出しついて

コンパイル時間の短縮、デバッグのしやすさという点で
なるたけSWFを分けたく...
ユーザビリティ的な方向ではないですw

そんなMVCとかあんまわかってない僕が通ります。

親SWFで、SceneObjectをもち、
表示するものは、読み込んだ外部SWFから取り出して表示させるということをやってみます。

本当は子SWFが、親がもつSceneにSceneを追加していったりすればよいかもというところなんだけど、、、
ん~試行錯誤をちょっとしてみたがたが、
親に読み込まれている場合は、親と協調し、読み込まれていない場合は、単体テストができる
というような流れを考えたときに、ちょっとイイ感じにまとまらなかった....追調査

ということで、

+39さんのブログエントリー apeirophobia: progression検証 #2 シーンの階層化
にあるtaka:nium氏のコメント

ただ、ある程度開発しやすさを考慮した場合にはシーン構造自体は親が全て管理した方がオススメですね。

の、メッセージに後押しされ、
シーン構造は親で管理、見た目を部分は外部から取り出すというやりかたにして、やってみることにする。

基本的にはLoaderContext の指定と、getDefinitionByNameを用いるというおなじみのやり方で
外部SWFを読み込む→外部SWF内の素材を表示に入れるというProgression Sceneを作成。

外部SWFの読込みには LoadChild を使用する。

Actionscript:
  1. package {
  2.    
  3.     import flash.display.Sprite;
  4.     import flash.net.*;
  5.     import flash.utils.*;
  6.     import flash.system.ApplicationDomain;
  7.     import flash.system.LoaderContext;
  8.    
  9.     import jp.progression.casts.*;
  10.     import jp.progression.commands.*;
  11.     import jp.progression.events.*;
  12.     import jp.progression.loader.*;
  13.     import jp.progression.*;
  14.     import jp.progression.scenes.*;
  15.    
  16.     public class MyLoadSWFScene extends SceneObject {
  17.        
  18.         var swfHolder:Sprite;
  19.        
  20.         public function MyLoadSWFScene() {
  21.            
  22.             name = "loadSwfScene";
  23.  
  24.             /*
  25.             * このSecenは親SWFのどこかで使われているScene
  26.             */
  27.            
  28.         }
  29.        
  30.         protected override function _onLoad():void {
  31.            
  32.             //読込用のSpriteを作成
  33.             swfHolder = new Sprite();
  34.            
  35.             //LoadChildで読込
  36.             var o:LoadChild = new LoadChild(swfHolder, new URLRequest("externalSwfFile.swf"))
  37.            
  38.             //LoadChild.context にLoaderContextを設定
  39.             var context:LoaderContext = new LoaderContext();
  40.             context.applicationDomain = ApplicationDomain.currentDomain;
  41.             o.context = context;
  42.            
  43.             o.loader.onCastLoadStart = function():void {
  44.                 this.addCommand(
  45.                     new Trace( "onCastLoadStart" )
  46.                 );
  47.             };
  48.  
  49.             o.loader.onCastLoadComplete = function():void {
  50.                 this.addCommand(
  51.                     new Trace( "onCastLoadComplete" )
  52.                 );
  53.             };
  54.  
  55.             addCommand(
  56.                 o
  57.             );
  58.         }
  59.        
  60.         private var myAsset:CastSprite;
  61.         protected override function _onInit():void {
  62.            
  63.             //getDefinitionByNameを用いて外部SWF内のClassを指定
  64.             //外部SWFの素材にはCastSpriteなどのClassを当てておきます
  65.             var Cl:Class = getDefinitionByName("externalSwfFile.swf が持つClassフルパスを文字列で指定") as Class;
  66.             myAsset = new Cl() as CastSprite;
  67.            
  68.             addCommand(
  69.                 new AddChild(progression.container, myAsset)    //  表示に入れる
  70.             );
  71.            
  72.         }
  73.        
  74.         protected override function _onGoto():void {
  75.             addCommand(
  76.                 new RemoveChild(progression.container, myAsset)
  77.             );
  78.         }
  79.     }
  80. }

話しは戻るけれど、やはり
親との協調、単体テストのことを考えたり、
getDefinitionByName つかうのかぁ...と考えてみると、
なんとか子SWFで、Sceneと見た目モノ制御していきたいもの…;;





blog.quq.jp




Profile
quq.jp / クックジェイピー

東京で働くFlashなどインタフェース系デベロッパー。Adobe AIR アプリ ”ブログパーツデスクトップ” 、iPhone アプリ ”twitOneday” などを開発。
詳しくはこちら

Contact
twtitter @quqjp

作ったもの
ブログパーツデスクトップ
twitOneday
ポータブル Wi-Fi info