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

时间:2009-06-21 04:30:41

标签: actionscript-3

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

以下作品:

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

myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC);

在这个例子中,我不确定如何引用“master class”中的各个类。

[Embed(source="ArtLibrary.swf")]
var MasterClass:Class;

myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC.BirdBodyColor_mc);

6 个答案:

答案 0 :(得分:4)

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

然后,要在另一个项目中使用SWC,您可以转到AS3设置(也在发布设置的Flash选项卡中),前往“库路径”选项卡并添加SWC(绝对路径和相对路径都可正常工作)。 / p>

请注意,这只适用于CS4或Flex(使用Flex我非常确定您可以将SWC拖到项目中,但我会检查它。)

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

http://www.kirupa.com/forum/showpost.php?p=2123134&postcount=366

答案 1 :(得分:4)

所以这是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”类。但正如他们所说 - 我将把它作为读者的练习! ; - )

希望有所帮助!

答案 2 :(得分:3)

  

如果你想要想象你   可以写一个小脚本   破解SWC(它只是一个拉链   文件),读取XML清单   在里面创造一个特殊的“包含者”   自动上课。但正如他们所说 -   我会把它作为练习   读者! ; - )

无需做任何如此复杂的事情(谢天谢地!)。 include-libraries编译器参数将自动包含SWC中的所有类,允许getDefinitionByName方法按预期工作。

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

<include-libraries>
    <library>path/to/your.swc</library>
</include-libraries>

然后您可以正常使用getDefinitionByName

HTH。

答案 3 :(得分:2)

使用FlashDevelop这很容易修复。

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

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

答案 4 :(得分:0)

所以我仍然坚持使用一个长的,手动创建的脚本来编写引用每个导入类的脚本。当然,线条比嵌入方法短得多,一个术语甚至更短。

最后,我制作了我的ArtLibrary.fla,然后将该fla文库中的所有文件夹复制并粘贴到我的其他5个文件中。我没有打扰编译swf文件。对于我最有效的需求。

非常感谢所有的帮助。你的答案很简单,非常详细。

答案 5 :(得分:0)

是的

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

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