【问题标题】:Force compile-time linking of all classes in a SWC强制 SWC 中所有类的编译时链接
【发布时间】:2010-06-08 03:06:27
【问题描述】:

使用 Flash CS4,我正在制作一个包含十几种声音和几首音乐曲目的游戏。为了减少发布/编译时间,我将声音和音乐移到了(外部)SWC 中,该 SWC 位于项目的“库路径”中。这可行,但有一点需要注意......

在我将资产外部化之前,我一直动态地通过使用getDefinitionByName 获取它们的类来实例化嵌入声音的Sound 对象。

// something like...
var soundSubClass:Class = Class(getDefinitionByName(soundClassName));
var mySound:Sound = new soundSubClass();

但是现在它们位于外部 SWC 中,我需要对这些类进行“具体”引用才能像这样加载它们,否则它们不会包含在已发布的 SWF 中,并且会出现运行时错误当getDefinitionByName 试图获取一个不存在的类时。

所以,我的问题:在 Flash Professional CS4 中,有没有办法强制包含库的资源,无论它们是否是静态链接的?

FlashDevelop 有一个编译器选项“SWC 包含库”,这正是我想要的,并且与“SWC 库”选项不同。 “SWC 包含库”选项的描述是“将 SWC 文件中的所有类链接到生成的应用程序 SWF 文件,无论是否使用它们。”

(另外,对我来说,重要的是所有资产都包含在一个已编译的 SWF 中。在运行时链接不是我所追求的。)

【问题讨论】:

    标签: apache-flex flash actionscript-3 swc


    【解决方案1】:

    不幸的是,我不这么认为。我希望这在 CS5 中得到修复,但我不会打赌......

    当前(加重)标准是在您的 SWC 中有一个清单类,它引用库其余部分中的所有根类:

    public class MyLibManifest {
        public static function manifest():void {
             var class1:Class = Class1;
             var class2:Class = Class2;
             // etc...
        }
    }
    

    然后,在您的主 .fla 中某处...

    import com.mylibrary.MyLibManifest;
    
    ...
    
    var myLibrary:Class = MyLibManifest;
    

    【讨论】:

    • 啊,混蛋。你所描述的是我现在做事的一个很好的结构化版本,但它仍然不能让我开心。无论如何,我很快就会接受你的回答(除非有人告诉我我想听什么)。干杯
    • 你不需要声明一个变量;将类作为简单语句引用为“Class1;”就足够了,而不是“var class1:Class = Class1;”。
    【解决方案2】:

    在 Flash CS4/CS5 中,默认情况下无法将每个类都拉入并嵌入到 SWC 中,但您可以通过以下方式做到这一点:

    Flash 开发

    如您所知,该程序的项目属性具有区分以下各项的编译器选项:

    • SWC 库:“将 SWC 文件链接到生成的间隙 SWF 文件。编译器仅链接那些所需的 SWC 文件的类。”
    • SWC 包含库:“将 SWC 文件中的所有类链接到生成的应用程序 SWF 文件,无论它们是否被使用。”

    第二个选项“SWC 包含库”可能很有用,因为如果您只是将 FLA 原样编译为 SWC,然后将该 SWC 和您的其他 SWC 作为 SWC 包含库放入 FlashDevelop,它应该编译/合并它们整合到一个 SWF 中,您可以按照自己的意愿工作。

    FlashDevelop 还可以简单地帮助您在 SWC 中构建硬编码的类列表,因为如果您在 SWC 中链接为 SWC 库,它将显示在项目资源管理器中,并且您可以看到所有类的列表SWC 中的课程。您也可以右键单击每个类并选择“插入文档”,它将插入完整的类名。如果你这样做,然后按分号回车,你将得到你的第一类参考。将鼠标悬停在项目设置中的班级列表上,并对列表中的每个班级重复此操作。只需几分钟就可以为数百个课程执行此操作,这使得创建这样的列表更容易。如果这个东西可以让你一次插入多个,那会更快,但似乎没有。

    您说无缘无故不感兴趣的唯一其他选择是运行时共享库​​ (RSL)。单独加载文件真的没什么大不了的,但前提是您正确处理加载过程和可能发生的任何错误。它会给您的项目增加一些复杂性,并且可能需要一些额外的思考,但我会认真考虑将其作为一种选择。有关详细信息,请参阅www.senocular.com/flash/tutorials/contentdomains/?page=2 的“应用程序域继承”部分。

    【讨论】:

    • 当时,该项目的资产已牢牢嵌入 Flash 创作环境(动画、合成树等),因此使用 FlashDevelop 并不实用。另外,我是在 Mac 上开发的。 :(
    • 我不想使用 RSL 的主要原因是因为我希望最终产品是一个单一的 swf 文件,以使分销商更容易安装。不知道这是一个多么好的理由,但当时对我来说单个文件的想法似乎更优雅。
    【解决方案3】:

    我可能遗漏了一些东西,但这不是使用 -include-libraries 而不是编译器的 library-path 选项的情况吗,这就是 adobe doc 关于该选项的说明

    将 SWC 文件中的所有类链接到生成的应用程序 SWF 文件,无论它们是否被使用。

    将此选项与仅包含那些在编译时引用的类的库路径选项进行对比。

    Adobe Documentation

    我对这一切都不熟悉,所以当你在火焰中击落我时要温柔:)

    【讨论】:

    • 这个问题是关于 Flash CS4,而不是 Flex。 :)(如果只有!)
    【解决方案4】:

    您可以在 ActionScript 属性中提供 assets.swc 文件的路径,该路径应该可以在运行时工作并加载资产。

    【讨论】:

    • 确实,这就是我目前的设置方式,但它不包括已发布 swf 中的类/资产,除非它们具有指向它们的静态(“具体”)链接.
    【解决方案5】:

    在 flex 中,当您可以访问编译器选项时,您可以使用:-include YourClass 强制从 swc 链接该类,即使它没有从主 swf 引用。

    但我不知道你是否可以从 flash cs4 更改编译器选项...

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2022-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2014-04-08
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多