22.ApplicationDomainクラスを使う2
asファイルを分ける
FLASH-JAPANのフォーラムで頂いた回答を参考にし、いろいろ考えた結果、外部swfファイルを作成する元となるasファイルを二つに分けることにしました。
例えば、Greeter_class.asとGreeter.asという感じにし、Greeter_class.asは下のようにただの「お飾り」みたいなものです。
package {
import flash.display.Sprite;
public class Greeter_class extends Sprite {
public var xxx:Greeter;
public function Greeter_class(){
}
}
}
上の部分はたいして中身はなく、肝心の部分は以下のような感じで。
package {
import flash.display.Sprite;
import flash.text.TextField;
public class Greeter {
private var greeting:String;
public function Greeter() {
greeting = "Hello World";
}
public function greet():String {
return greeting;
}
}
}
こちら側にクラスの肝心のプロパティやメソッドを記述してます。
この二つのasファイルを用意して、Greeter_class.asをコンパイルします。
するとGreeter_class.swfができますので、これを読み込むことになります。
読み込んだswfファイル内のクラスからオブジェクトを作成
この読み込む部分がちょっと面倒だったりします。とりあえず、最低限動作するコードが以下のような感じ。
var request:URLRequest = new URLRequest("Greeter_class.swf");
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
loader.load(request , context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
function completeHandler(event:Event):void {
var myGreeterClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Greeter") as Class;
var myGreeter:Object = new myGreeterClassRef();
}
completeHandler内の var myGreeter:Object = new myGreeterClassRef(); のオブジェクトを作るところまで来れば後は従来と同じですね。
実際にはキャッシュ対策とか、ファイル読み込み失敗時の処理とか必要なんでしょうけど、とりあえずこれで外部swfファイルにあるクラスからのオブジェクト作成はOK!