在
AS3中
,我们可以使用
[Embed(source="asset.swf", symbol="symbol")]
private var symbolClass:Class;
var symbol:MovieClip = new symbolClass();
从艺术中嵌入一个符号
的SWF
在什么可能是一个代码构建
的SWF
。
这是伟大的,但如果你要嵌入整个
SWF
?
[Embed(source="asset.swf")]
private var assetClass:Class;
var asset:MovieClip = new assetClass();
看起来像它应该做的伎俩,但你不能在资产中获得的任何信息。 这是一个真正的痛苦,因为这是非常令人费解的原因。 我想起了解决这个问题,在过去的工作,并愉快地设法挖掘一个长期被遗忘的宝藏在我的代码库,我想我会分享(已经迅速重构它以使用AS3-信号,自然)。
package com.alecmce.util
{
import org.osflash.signals.Signal;
import mx.core.MovieClipAsset;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.MovieClip;
import flash.events.Event;
public class UnpackEmbed
{
private var _ready:Signal;
private var _asset:MovieClipAsset;
private var _content:MovieClip;
public function UnpackEmbed(assetClass:Class)
{
_asset = new assetClass();
_ready = new Signal(UnpackEmbed);
var loader:Loader = Loader(_asset.getChildAt(0));
var info:LoaderInfo = loader.contentLoaderInfo;
info.addEventListener(Event.COMPLETE, onLoadComplete);
}
private function onLoadComplete(event:Event):void
{
var info:LoaderInfo = LoaderInfo(event.target);
info.removeEventListener(Event.COMPLETE, onLoadComplete);
_content = MovieClip(info.loader.content);
_ready.dispatch(this);
}
public function get content():MovieClip
{
return _content;
}
public function get ready():Signal
{
return _ready;
}
public function get asset():MovieClipAsset
{
return _asset;
}
}
}
当您嵌入的SWF以这种方式,然后实例化它,闪存莫名其妙密谋建立一个
MovieClipAsset
用
装载机
内,这将是'加载'已嵌入的内容。
内容不是立即可用(也可能是有时候,我也遇到过的情况下它不是),所以你必须等待
Event.COMPLETE
被解雇之前,您可以访问它。
此类公开,通知您当内容准备就绪的信号。
它可能可以更严格,例如,包括
在isComplete
标志,但它提供我的目的,以下面的方式使用时:
[Embed(source="asset.swf")]
private var assetClass:Class;
asset = new UnpackEmbed(assetClass);
asset.ready.addOnce(onAssetReady);
private function onAssetReady(asset:UnpackEmbed):void
{
// now we can access the asset.content!
}

