在我的项目中,我使用捆绑了资源的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的嵌入源?
答案 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
),您应该很好。