加载SWF并覆盖现有库符号

时间:2012-02-05 09:53:03

标签: flash actionscript-3 swfloader

我有Main.fla和SkinA.fla。两者都有MovieClip库项目:MC_BrandLogo 我正在将SkinA.swf加载到当前应用程序域中的Main.swf中,试图替换Main.swf中的类。如果Main.fla中没有库项,我可以用正确的图形实例化MC_BrandLogo。如果在Main.fla中已经存在MC_BrandLogo,那么即使我在当前应用程序域中加载了新图形,也会使用该图形。

有没有办法用动态加载来替换现有的链接影片剪辑?登记/>

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSkinLoaded);
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.load(new URLRequest("SkinA.swf"));

function onSkinLoaded(e:Event):void {
    trace("loaded Skin");
    addChild(new MC_BrandLogo());
}

编辑:没有办法覆盖我试图覆盖的图像,因为这是应用程序域的工作方式。如果父应用程序域中存在定义,则使用它们。

2 个答案:

答案 0 :(得分:2)

击败拳头。我相信JonnyReeves是正确的。关于这个主题的一个很好的讨论可以在这里找到:

Application Domains on Senocular

答案 1 :(得分:0)

据我所知,除非您希望诉诸manipulating bytecode at runtime,否则无法覆盖ApplicationDomain中的类定义。

但是,您可以将皮肤SWF加载到子应用程序域中,然后通过ApplicationDomain.getDefinition检索相应的类定义(符号);即:

private var _skinAppDomain : ApplicationDomain;

function loadSkin() : void {
    // Keep a reference to the Skin's application domain.
    _skinAppDomain = new ApplicationDomain();

    var loader:Loader = new Loader();
    var context:LoaderContext = new LoaderContext(false, _skinAppDomain);

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSkinLoaded);
    loader.load(new URLRequest("SkinA.swf"));
}

function onSkinLoaded(e:Event) : void {
    var brandLogoSymbolName : String = "MC_BrandLogo";

    // Retrieve the symbol from the Skin's Application Domain directly.
    var brandLogoClipClazz : Class = _skinAppDomain.getDefinition(brandLogoSymbolName);

    // Check we have the symbol.
    if (brandLogoClipClazz == null) {
        throw new Error("Skin SWF must include a symbol named: " + brandLogoSymbolName);
    }

    addChild(new brandLogoClipClazz());
}

要帮助调试ApplicaitonDomains中缺少的符号名称,您可以列出使用SWF Explorer包含的所有类定义(符号)。