使用SWC - getDefinitionByName问题

时间:2010-11-05 04:42:29

标签: flash actionscript-3 swc

我在fla中有一堆图形资源,MovieClip链接到某些类。我将fla导出为swc,我将其添加到我的库中,并选择“Merged into Code”。

一切都很棒,我可以创建我的MovieClip的实例,只需调用它们的类。

     //example 1
     var newMc:BaseClass = new GraphicAsset();

现在,如果我想执行以下操作,Flash会抛出错误,GraphicsAssetClass为null!

    //example 2
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

我能让上述线路工作的唯一方法就是这样做

    //example 3
    var newMc:GraphicAsset;
    var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

    //then I'm able to do this 
    var newMc:BaseClass = new GraphicsAssetClass();

你能想到一个解决方案,我可以通过调用getDefinitionByName()简单地获取类 就像我在例2中所做的那样,无需借助示例3解决方案。

2 个答案:

答案 0 :(得分:11)

问题是编译器会排除代码中未直接引用的任何类 somewhere 。这是编译器应用设计的优化。

正常的解决方法与您在“示例3”中的显示方式完全相同。但重要的是要注意两条线不必在同一个地方。只要

var newMc:GraphicAsset;

是SWF中从主要执行路径引用的某个地方,然后GraphicAsset的类定义将包含在最终的swf中。然后你可以打电话......

var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;

从其他地方完全,它会像你期望的那样工作。

seaprate SWFs 中找到两行甚至是可能的(并且很常见)。在这种情况下,一个swf会在运行时加载另一个swf。通常, loader swf将是使用getDefinitionByName("SomeClass)的那个,加载的 swf将是定义class SomeClass的swf,并使用{{ 1}},以确保将类构建到swf中。

因此,您经常会在“库swf”中找到一个名为“MyLibraryManifest”的类,然后从该swf的主影片剪辑中引用。那么“清单”类就像这样:

var a:SomeClass;

[edit]您可以对class MyLibraryManifest { private var a:GraphicAsset; private var b:SomeClass; private var c:SomeOtherClass; //... and so on... } 编译器使用-includes-include-libraries选项,强制链接器包含一个或多个单独的类(或整个swc),应用我上面描述的“修剪优化”。

see adobe's site用于解释mxmlc命令行选项。

选项也可以是specified in a config file,允许您控制Flex和/或Flash IDE在幕后调用编译器的方式。

祝你好运!

答案 1 :(得分:1)

使用FlashDevelop这很容易修复。

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

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