• HOME
  • BLOG
  • Flash
  • Progression 外部SWF素材を親SWFのSceneObject内で呼出す

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 を使用する。

[as]
package {

import flash.display.Sprite;
import flash.net.*;
import flash.utils.*;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;

import jp.progression.casts.*;
import jp.progression.commands.*;
import jp.progression.events.*;
import jp.progression.loader.*;
import jp.progression.*;
import jp.progression.scenes.*;

public class MyLoadSWFScene extends SceneObject {

var swfHolder:Sprite;

public function MyLoadSWFScene() {

name = “loadSwfScene”;

/*
* このSecenは親SWFのどこかで使われているScene
*/

}

protected override function _onLoad():void {

//読込用のSpriteを作成
swfHolder = new Sprite();

//LoadChildで読込
var o:LoadChild = new LoadChild(swfHolder, new URLRequest(“externalSwfFile.swf”))

//LoadChild.context にLoaderContextを設定
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
o.context = context;

o.loader.onCastLoadStart = function():void {
this.addCommand(
new Trace( “onCastLoadStart” )
);
};

o.loader.onCastLoadComplete = function():void {
this.addCommand(
new Trace( “onCastLoadComplete” )
);
};

addCommand(
o
);
}

private var myAsset:CastSprite;
protected override function _onInit():void {

//getDefinitionByNameを用いて外部SWF内のClassを指定
//外部SWFの素材にはCastSpriteなどのClassを当てておきます
var Cl:Class = getDefinitionByName(“externalSwfFile.swf が持つClassフルパスを文字列で指定”) as Class;
myAsset = new Cl() as CastSprite;

addCommand(
new AddChild(progression.container, myAsset) // 表示に入れる
);

}

protected override function _onGoto():void {
addCommand(
new RemoveChild(progression.container, myAsset)
);
}
}
}
[/as]

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