嵌入使用mxmlc创建的swf中的符号

时间:2012-03-07 13:03:14

标签: actionscript-3 flash bytecode

在我的项目中,我使用捆绑了资源的swfs。这些包是从另一个实用程序应用程序创建的。应用程序创建一个Package.as文件,其中[Embed]标签将所有资源放入同一目录并运行mxmlc来编译bundle swf。

捆绑的瑞士法郎就像魅力一样。我可以实例化资产。

但是我想实现另一个实用程序来编辑这些包(添加和删除资源) 这是问题所在。由于此bundle.swf不是从Flash创建的,因此无法使用:

[Embed ( source="oldbundle.swf", symbol="Package_res1" ) ]  // ( "Package_res1" is class name of resource in bundle")

创建新的swf。 mxmlc返回符号未找到的错误。

对于bytearray资产,我找到了一个解决方案。我将bytearrays写入磁盘,然后使用这些文件进行嵌入。但是,对于从Flash swf添加到原始包中的符号的矢量图形,我无法做同样的事情。如果我在磁盘上写bitmapdatas我将失去矢量(不确定它是否是一个单词:))。 SVG不是替代闪存符号的完整选项。

使用as3swf,我检查了捆绑swf并看到了SymbolClass标记。所有资产都在那里定义。我不知道为什么嵌入标签找不到符号。与bundled.swf符号和Flash swf符号的区别在于,一个扩展SpriteAsset(一个flex框架对象),另一个扩展sprite

如何使用旧的swf作为新swf的嵌入源?

2 个答案:

答案 0 :(得分:0)

您的符号需要公开。

这是一个例子。首先,原来的SWF,我们称之为Bundle.swf。

// Bundle.as
package
{

import flash.display.*;

public class Bundle extends Sprite
{
    public function Bundle()
    {
        var image:DisplayObject = new Image();
        addChild(image);
    }
}

}

这是定义Image的地方:

// Image.as
package
{

import flash.display.*;

[Embed(source='image.jpg')]
public class Image extends Bitmap
{
}

}   

现在,如果你编译Bundle.as并打开Bundle.swf,就会看到你的图像。

接下来,我们想在新的SWF中重用它,我们称之为Application.swf。

// Application.as
package
{

import flash.display.*;

public class Application extends Sprite
{
    [Embed(source='Bundle.swf', symbol='Image')]
    private var imageClass:Class;

    public function Application()
    {
        var image:DisplayObject = new imageClass();
        addChild(image);
    }
}

}

编译Application.as并打开Application.swf。你会再次看到这个图像。

它有效,因为Image是公开的。

答案 1 :(得分:0)

您还可以通过提取mxmlc自动生成的类的名称,使其与成员变量一起使用。例如,这里再次使用相同的Bundle类:

// Bundle.as
package
{

import flash.display.*;

public class Bundle extends Sprite
{
    [Embed(source='image.jpg')]
    private var imageClass:Class;

    public function Bundle()
    {
        var image:DisplayObject = new imageClass();
        addChild(image);
    }
}

}

现在,如果您使用-keep编译它:

mxmlc Bundle.as -keep

您可以在Bundle_imageClass.as目录中的generated文件中找到生成的代码,其中包含以下内容:

package 
{

import mx.core.BitmapAsset;

[ExcludeClass]
[Embed(_resolvedSource="/Users/manish/Code/test/image.jpg", _column="6", source="image.jpg", exportSymbol="Bundle_imageClass", _line="9", _file="/Users/manish/Code/test/Bundle.as")]

public class Bundle_imageClass extends mx.core.BitmapAsset 
{
    public function Bundle_imageClass() 
    { 
        super(); 
    }

}

}

寻找exportSymbol。这是嵌入其他SWF的符号名称。

现在是Application类:

// Application.as
package
{

import flash.display.*;

public class Application extends Sprite
{
    [Embed(source='Bundle.swf', symbol='Bundle_imageClass')]
    private var imageClass:Class;

    public function Application()
    {
        var image:DisplayObject = new imageClass();
        addChild(image);
    }
}

}

在生成的代码中使用您在exportSymbol中找到的确切值(在本例中为Bundle_imageClass),您应该很好。