我正在尝试在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>
我觉得我只是“没有得到”某些东西......任何线索?
答案 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中的所有类和资产都以这种方式加载。可能不是你想要的,但它对我有用。