はじめまして。AS3を勉強中のochiaiです。
main.swf から大量の画像をもつ image.swf 内の画像をロードしたいのですが、
なかなか上手くいきません。
Flex Builder 3.0 (AS3)を使っています。
image.swf に埋め込み画像をもつクラス CImages をつくり、
main.swf でswfをロードしてクラス内の関数にアクセスする
ことで画像を読み込もうと思っています。
main.swf内 外部SWFをロードするクラス
package util
{
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class CExtObjLoader extends EventDispatcher
{
public function CExtObjLoader(){}
public function Load( swfPath:String ):void
{
m_urlReq = new URLRequest( swfPath );
m_loader = new Loader();
var loaderInfo:LoaderInfo = m_loader.contentLoaderInfo;
loaderInfo.addEventListener( Event.COMPLETE, H_EveLoadComp );
loaderInfo.addEventListener( IOErrorEvent.IO_ERROR, H_EveIO_Error );
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
m_loader.load( m_urlReq, context );
}
public function GetObj( name:String ) : Object
{
try {
return m_loader.contentLoaderInfo.applicationDomain.getDefinition( name );
}
catch( error:Error ) {
throw new IllegalOperationError( "[CExtObjLoader.GetObj()] " + name + " not found" );
}
return null;
}
public function H_EveLoadComp( eve:Event ):void { dispatchEvent( new Event( CExtObjLoader.EVE_LOADED ) ); }
public function H_EveIO_Error( eve:Event ):void { dispatchEvent( new Event( CExtObjLoader.EVE_IO_ERROR ) ); }
public static const EVE_LOADED:String = "loaded";
public static const EVE_IO_ERROR:String = "IO_Error";
private var m_loader:Loader;
private var m_urlReq:URLRequest;
}
}
main.swf内 image.swfの画像を使いたいクラスの一部
private var m_pObjLoader:CExtObjLoader;
private function Init():void {
m_pObjLoader = new CExtObjLoader();
m_pObjLoader.addEventListener( CExtObjLoader.EVE_LOADED, InitDataBase );
m_pObjLoader.Load( "image.swf" );
}
private function InitDataBase(eve:Event):void {
var extClass:Class = m_pObjLoader.GetObj( "CImages" ) as Class;
var extClassRef:Object = new extClass();
var imageClass:Class = extClassRef.GetFaceImage000();
m_recievedFace = new imageClass as Bitmap;
}
image.swf のmxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
private var m_image:CImages = new CImages();
]]>
</mx:Script>
</mx:Application>
image.swf のCImages.as
package
{
public class CImages
{
public function CImages(){}
public function GetFaceImage000():Class
{ return m_faceImage_000; }
public function GetFaceImage001():Class
{ return m_faceImage_001; }
[Embed( source="face_000.gif" )]
private var m_faceImage_000:Class;
[Embed( source="face_001.gif" )]
private var m_faceImage_001:Class;
}
}
ロード完了のイベントは実行されますが、CExtObjLoader の GetObj関数でCImagesクラスの取得に失敗してしまいます。