8

我在一个 fla 中有一堆图形资产,MovieClips 链接到一些类。我将 fla 导出为 swc ,然后使用“合并到代码”选项将其添加到我的库中。

一切都很好,我可以创建我的 MovieClips 的实例,只需像这样调用他们的类。

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

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

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

您能想出一个解决方案,我可以像在示例 2 中那样通过调用 getDefinitionByName() 来简单地获取类,而不必求助于示例 3 解决方案。

4

2 回答 2

11

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

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

var newMc:GraphicAsset;

在您的 SWF 中某处被从执行的主路径引用,那么类定义GraphicAsset将包含在最终的 swf 中。然后你可以打电话...

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

完全来自其他地方,它会按您的预期工作。

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

出于这个原因,您经常会发现在“库 swf”中定义了一个名为“MyLibraryManifest”的类,然后从该 swf 的主影片剪辑中引用。然后,“清单”类将如下所示:

class MyLibraryManifest {

   private var a:GraphicAsset;
   private var b:SomeClass;
   private var c:SomeOtherClass;

   //... and so on...

}

[编辑] 您可以使用编译器的-includesor-include-libraries选项来mxmlc强制链接器包含一个或多个单独的类(或整个 swc),而不应用我上面描述的“修剪优化”。

有关 mxmlc 命令行选项的说明,请参见 adobe 的站点

这些选项也可以在配置文件中指定,允许您控制 flex 和/或 Flash IDE 如何在后台调用编译器。

祝你好运!

于 2010-11-05T05:13:56.160 回答
1

使用 FlashDevelop 很容易解决这个问题。

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

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

于 2012-02-21T08:13:15.393 回答