Загрузите SWF и переопределите существующие библиотечные символы - PullRequest
2 голосов
/ 05 февраля 2012

У меня есть Main.fla и SkinA.fla. Оба имеют элемент библиотеки MovieClip: MC_BrandLogo.
Я загружаю SkinA.swf в Main.swf в текущем домене приложения, пытаясь заменить класс внутри Main.swf. Если в Main.fla нет элемента библиотеки, я могу создать экземпляр MC_BrandLogo с правильной графикой. Если MC_BrandLogo уже существует в файле Main.fla, то этот рисунок используется, даже если я загрузил новый в текущем домене приложения.

Есть ли способ заменить существующие связанные фрагменты ролика динамически загруженными? < бр />

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 ]

2 голосов
/ 05 февраля 2012

побитый удар. JonnyReeves правильно, я верю. Хорошее обсуждение этой темы можно найти здесь:

Домены приложений на Senocular

0 голосов
/ 05 февраля 2012

Насколько я знаю, вы не можете перезаписать определение класса в 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 .

...