2012-02-05 9 views
2

私はMain.flaとSkinA.flaを持っています。どちらにもMovieClipライブラリ項目:MC_BrandLogoがあります。
Main.swf内のクラスを置き換えようとしている現在のアプリケーションドメインのMain.swfにSkinA.swfをロードしています。 Main.flaにライブラリアイテムがない場合は、正しいグラフィックでMC_BrandLogoをインスタンス化できます。 MC_BrandLogoが既にMain.flaに存在する場合、現在のアプリケーションドメインに新しいものをロードしても、そのグラフィックが使用されます。

リンクされた既存のムービークリップを動的に置き換える方法はありますか?

SWFを読み込んで既存のライブラリシンボルを上書きする

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()); 
} 

EDITED:これはどのようにアプリケーションドメインの作品ですので、私は上書きしようとしていた画像を上書きする方法は、ありません。定義が親アプリケーション・ドメインに存在する場合は、それらが使用されます。

答えて

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()); 
} 

あなたがSWF Explorerを使用して含まれているすべてのクラス定義(シンボル)を一覧表示することができますApplicaitonDomainsにデバッグ不足しているシンボル名を支援します。

+0

誰かが、これが動作していることを確認することはできますか?私はそれを試して、私はそれを動作させることはできません。 – plam4u

+0

私はこの質問を閉じるためにはうまくいかないが、私はこの回答を受け入れるつもりだ。 – plam4u

2

パンチに殴られます。 JonnyReevesが正しいと私は信じています。このトピックに関する優れた議論はここで見つけることができます:

Application Domains on Senocular

+0

Senocularの記事は素晴らしいリファレンスです。私はそれを私の答え、ウェスに含めるべきだった! – JonnyReeves

+0

確かに、このトピックに関するAdobes自身の情報よりもはるかに混乱しないでしょう。私はあなたがそれの要点を釘付けだと思う​​。 – WesLastLevel

+0

@JonnyReeves、あなたの方法を試しましたが、動作しません。
1)ApplicationDomainには「getDefinitionByName」ではなく「getDefinition」がありません
2)_skinAppDomain.getDefinitionを使用すると、MC_BrandLogoにnullが返され、SkinA.swfにリンクされていると確信しています。ローダー全体を追加するとロゴが正しく表示されます
3)loader.content.loaderInfo.applicationDomain.getDefinition(brandLogoSymbolName)as Class; null以外の定義を取得していますが、Mainのロゴのプレースホルダです。 – plam4u

関連する問題