Actionscript 3 AS3在外部swf中嵌入或导入所有类,而不单独引用每个类

Actionscript 3 AS3在外部swf中嵌入或导入所有类,而不单独引用每个类,actionscript-3,Actionscript 3,我有一个ArtLibrary.swf文件,其中有数百个使用类名导出的MovieClips。我希望能够在我正在处理的多个不同的flash文件中使用这些电影,但我不知道在使用和嵌入命令后如何正确引用它们 以下工作: [Embed(source="ArtLibrary.swf", symbol="BirdBodyColor_mc")] var BirdBodyColor_mc:Class; myMC:MovieClip = new BirdBodyColor_mc(); addChild(myMC)

我有一个ArtLibrary.swf文件,其中有数百个使用类名导出的MovieClips。我希望能够在我正在处理的多个不同的flash文件中使用这些电影,但我不知道在使用和嵌入命令后如何正确引用它们

以下工作:

[Embed(source="ArtLibrary.swf", symbol="BirdBodyColor_mc")]
var BirdBodyColor_mc:Class;

myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC);
在本例中,我不确定如何引用“master class”中的各个类


与其使用SWF,不如使用SWC。要创建SWC,只需进入Flash Pro的发布设置,进入Flash选项卡并选择“导出SWC”。SWC包含SWF和一个特殊清单,其中包含Flash需要了解的关于SWF中类的所有信息

然后,要在另一个项目中使用SWC,请转到AS3设置(也在“发布设置”的“闪存”选项卡中),转到“库路径”选项卡并添加SWC(绝对路径和相对路径均可正常工作)

请注意,这只适用于CS4或Flex(使用Flex,我相当确定您可以将SWC拖到您的项目中,但我会检查一下)

现在-如果你想加载SWF并在运行时使用它的资产,那就完全是另一回事了。为了使其正常工作,您需要处理Loader类和ApplicationDomain,以便将这些类放入适当的域中。以下是一些关于这个主题的好信息:


所以这是一个CS4太聪明而不利于自身的案例。由于您从未以编译器在编译时可以确定的方式显式引用所讨论的类,因此在SWF中不包含这些类-因此出现了错误


在Flex中,您可以通过命令行参数来解决这个问题,但CS4的情况并非如此。相反,您可以以编译器可以理解的方式显式引用至少一次要使用的类。例如,我制作了一个简单的SWC,其中包含一个符号,其类设置为“TestCircle”。在使用SWC的代码中,我有以下代码,它工作得很好:

import flash.utils.getDefinitionByName;

TestCircle;

var test:MovieClip =  new (getDefinitionByName("TestCircle") as Class)();

addChild(test);
如果您觉得有意思,可以编写一个小脚本来打开SWC(它只是一个zip文件),阅读其中的XML清单,并自动创建一个特殊的“includer”类。但正如他们所说的——我将把它作为练习留给读者


希望有帮助

所以我仍然在编写一个长的、手动创建的脚本,该脚本引用每个导入的类。假设行比嵌入方法短得多,甚至一个术语

最后,我制作了我的ArtLibrary.fla,然后将该fla库中的所有文件夹复制并粘贴到其他5个fla库中。我没有费心编译swf文件。为了我的需要,这是最有效的

非常感谢你的帮助。你的回答直截了当,非常详细

如果你喜欢你 可以写一个小脚本 打开一个SWC(它只是一个拉链 文件),读取 在内部创建一个特殊的“includer” 自动初始化。但正如他们所说- 我将把它作为练习留给学生们 读者!;-)

不用做这么复杂的事情(谢天谢地!)。include libraries编译器参数将自动包含SWC中的所有类,从而允许
getDefinitionByName
方法按预期工作

在App-config.xml文件中(或者直接作为参数传递给编译器):


路径/to/your.swc
然后,您可以像往常一样自由地使用
getDefinitionByName


HTH.

使用FlashDevelop修复此问题非常简单

右键单击项目列表中包含的swc。选择选项,然后选择“包含库(完整库)”

…您现在可以使用getDefinitionByName从swc文件中获取未引用的类。

是的

这个答案来得太晚了9年,但您可以在不使用ApplicationDomain实际创建引用的情况下完成它。因此,假设您在base_library.swf中有链接到moveiclips的类,您正在将这些类加载到主swf中。一个电影剪辑在你的主swf中有类链接“Slide2”,你有这个

    private function loadSWF():void {
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
        loader.load(new URLRequest("./lib/base_library.swf"));
    }

    private function onComplete(e:Event):void {
        trace(" ON COMPLETE LOAD ");
        var movie:* = LoaderInfo(e.currentTarget).content;

        // now try and create an instance of a slide
        var mc:MovieClip = createInstance(movie,"Slide2", "slide2");
        addChild(mc);
    }

    public function createInstance(mc:MovieClip, className:String, instName:String):MovieClip
    { 
        var cls:Class = mc.loaderInfo.applicationDomain.getDefinition(className) as Class;
        if (cls)
        {
            var instMC:MovieClip = new cls();
            instMC.name = instName;
            return instMC;
        }
        return null;
    }

“在Flex中,您可以通过命令行参数来解决这个问题”我在这里查找该命令行,但没有找到它。是哪一个?
<include-libraries>
    <library>path/to/your.swc</library>
</include-libraries>
    private function loadSWF():void {
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
        loader.load(new URLRequest("./lib/base_library.swf"));
    }

    private function onComplete(e:Event):void {
        trace(" ON COMPLETE LOAD ");
        var movie:* = LoaderInfo(e.currentTarget).content;

        // now try and create an instance of a slide
        var mc:MovieClip = createInstance(movie,"Slide2", "slide2");
        addChild(mc);
    }

    public function createInstance(mc:MovieClip, className:String, instName:String):MovieClip
    { 
        var cls:Class = mc.loaderInfo.applicationDomain.getDefinition(className) as Class;
        if (cls)
        {
            var instMC:MovieClip = new cls();
            instMC.name = instName;
            return instMC;
        }
        return null;
    }