外部swfからクラスを呼び出す

画像が固定(更新なし)のスライドショー的なものを作っていて、外部swfにひとまとめにして、そこから画像を取り出そうと考えてみた。

画像はphoto.swfに入れて、そのライブラリのプロパティでリンケージを設定して「photo0」のようにクラス名をつけておく。それで書き出すだけ。
で、取り出しはSWFをロードするクラスに書きます。
package {
import flash.events.EventDispatcher;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.net.URLRequest;
import flash.events.Event;
import flash.system.LoaderContext;
import flash.system.ApplicationDomain;
import flash.events.ProgressEvent;
public class SwfLoader extends Loader {
var flg_play:Boolean;
var func_complete:Function;
private var cont:LoaderContext;
//コンストラクタ
function SwfLoader(url:String,isPlay:Boolean,func_comp:Function = null) {
flg_play = isPlay;
func_complete = func_comp;
//各種イベント定義
this.contentLoaderInfo.addEventListener(Event.INIT,onInit_swf);
this.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded_swf);
this.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadProgress_swf);
//for URL
var urlReq:URLRequest = new URLRequest(url);
cont = new LoaderContext();
cont.applicationDomain = ApplicationDomain.currentDomain;
this.load( urlReq, cont);
}
//—–Event.INIT
function onInit_swf(evt:Event):void {
//ロード中は再生しないよう停止
var info:LoaderInfo = LoaderInfo(evt.target);
var mc:MovieClip = info.content as MovieClip;
mc.stop();
}
//swf:ロード継続
private function onLoadProgress_swf(e:ProgressEvent):void {
//継続イベント:送信(ProgressEvent.PROGRESSを引き継ぐ)
dispatchEvent(e);
}
//—–Event.COMPLETE
function onLoaded_swf(evt:Event):void {
try {
//指定関数の呼び出し(LoaderInfo.contentを渡す)
var info:LoaderInfo = LoaderInfo(evt.target);
var mc:MovieClip = info.content as MovieClip;
//再生の有無
if (flg_play) {
mc.play();
} else {
mc.stop();
}
if (func_complete != null) {
func_complete(mc);
}
} catch (err:TypeError) {
trace(err.message);
}
}
public function getImage():Loader {
return this;
}
public function checkClass(ClassName:String):Class {
var cl:Class;
//アプリケーションドメインに指定したクラスがあるか
if (cont.applicationDomain.hasDefinition(ClassName)) {
//取得したクラスをClass型変数に代入
cl = cont.applicationDomain.getDefinition(ClassName) as Class;
trace(“外部SWFファイルから”+ClassName+”クラスをインポートしました”);
} else {
trace(“外部SWFファイルには”+ClassName+”クラスは存在しません”);
}
return cl;
}
}
}

本体側では、こんな感じにswfをロードして・・・

import SwfLoader;
var swf_content:SwfLoader;
//画像用swf:ロード
function loadContent_img():void {
var url:String = “photo.swf”;
var flg_play:Boolean = false;
swf_content = new SwfLoader(url,flg_play);
swf_content.addEventListener(ProgressEvent.PROGRESS, checkLoad_font);
this.addChildAt(swf_content,1);
}
SwfLoaderのcheckClass()という関数を使って、外部swfからBitmapDataを取得します。
//ビットマップ取得
function getBitmap_img(no:int):Bitmap {
var name_bmp:String = “photo” + String(no);
var imgClass:Class = swf_content.checkClass(name_bmp);
if (imgClass != null) {
var img:BitmapData = new imgClass(stage.stageWidth,stage.stageHeight);
var bmp:Bitmap = new Bitmap(img);
}
return bmp;
}

納品先での画像差し替えが不要で、定期的に一括更新かけるような場合は便利かも。作例はこちら

下記のサイトを参考にさせていただきました。