Flex中的SWC“链接”

时间:2010-03-09 21:14:52

标签: flex flash actionscript-3 actionscript flex3

我正在尝试在Flash / Flex中创建一个非常简单的应用程序,它会加载嵌入swf本身的图像然后显示它。问题是我正在尝试仅使用命令行(mxmlc和compc)并且不使用@Embed,并且惨遭失败。

我有一个非常简单的Main.as:

package
{
    import flash.display.*;
    import flash.utils.*;

    public class Main extends Sprite
    {
        public function Main () : void 
        {
            var pDef:Class = getDefinitionByName("icon_big.png") as Class;
            var _image:BitmapData = new pDef(0, 0);

            var pSprite:Sprite = new Sprite();          
            pSprite.graphics.beginBitmapFill(_image);
            pSprite.graphics.drawRect(0, 0, _image.width, _image.height);
            pSprite.graphics.endFill();

            addChild(pSprite);
        }   
    }
}

如果我使用Flash IDE将icon_big.png添加到库中,这可以正常工作,但我无法从命令行中弄清楚如何操作。

我正在使用compc将png放在swc中:

compc --include-file icon_big.png icon_big.png -output assets.swc

这会生成一个17 kb assets.swf,略大于icon_big.png。然后我尝试编译并链接Main.as:

mxmlc -include-libraries+=assets.swc Main.as

这会生成一个944字节的Main.swf,它显然不包含资产,并且在运行时失败。

根据我发现的mxmlc文档,-include-libraries应该链接到每个类,包括那些没有直接被代码引用的类(就像这里的情况一样,因为我从代码中获取类),并且不出所料在运行时失败。

请注意,在Flash项目中使用时,这个相同的代码(或者更确切地说,非常等效的代码)也可以工作 - 我不是要修复代码,而是在命令行中如何在内部执行Flash操作。< / p>

我觉得我只是“没有得到”某些东西......任何线索?

4 个答案:

答案 0 :(得分:0)

我建议你从swftools.org下载swftools。一旦你拥有它们,运行:

    swfdump -D assets.swf

特别注意与SWF标记相关的输出值76(0x4C),称为SYMBOLCLASS

以下是导出类的示例,名为IntegerMemberBySlot:

[04c]        24 SYMBOLCLASS
                    exports 0001 as "IntegerMemberBySlot"

您从assets.swf导出了哪些符号?

答案 1 :(得分:0)

在使用mxmlc进行编译时,您是否尝试将资源路径添加到源路径参数?

-source-path ./PATH/TO/ASSET

答案 2 :(得分:0)

我认为您需要将PNG嵌入到类中,然后将该类编译为SWC。我不认为你可以将PNG直接放入SWC,就像你想要的那样,但我可能是错的。

答案 3 :(得分:0)

我有类似的情况(大项目,资源swc与图形资产),无论我尝试什么,我都不能让Flex包含不直接从项目引用的资产和类(我想包括不同的皮肤,然后在运行时实例化适当的一个,具体取决于配置。)

最后,我找到了一种解决方法,而不是静态转换,切换到运行时共享库​​(RSL)。基本上,flex在运行应用程序本身之前解开了swc,并在运行时加载和链接包含的swf。 swf中的所有类和资产都以这种方式加载。可能不是你想要的,但它对我有用。