我有一个ArtLibrary.swf文件,其中有数百个使用类名导出的MovieClip。我希望能够在我正在使用的多个不同的Flash文件中使用这些电影,但我不知道在使用和嵌入命令后如何正确引用它们。
以下作品:
[Embed(source="ArtLibrary.swf", symbol="BirdBodyColor_mc")]
var BirdBodyColor_mc:Class;
myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC);
在这个例子中,我不确定如何引用“master class”中的各个类。
[Embed(source="ArtLibrary.swf")]
var MasterClass:Class;
myMC:MovieClip = new BirdBodyColor_mc();
addChild(myMC.BirdBodyColor_mc);
答案 0 :(得分:4)
不使用SWF,最好使用SWC。要创建SWC,只需进入Flash Pro的发布设置,然后转到Flash选项卡并选择“导出SWC”。 SWC包含SWF和特殊清单,其中包含Flash需要了解的有关SWF中类的所有信息。
然后,要在另一个项目中使用SWC,您可以转到AS3设置(也在发布设置的Flash选项卡中),前往“库路径”选项卡并添加SWC(绝对路径和相对路径都可正常工作)。 / p>
请注意,这只适用于CS4或Flex(使用Flex我非常确定您可以将SWC拖到项目中,但我会检查它。)
现在 - 如果你想加载SWF并在运行时使用它的资产,那就完全不同了。为了使其正常工作,您需要使用Loader类和ApplicationDomain,以便将类放入适当的域。以下是关于这个主题的一些好消息:
http://www.kirupa.com/forum/showpost.php?p=2123134&postcount=366
答案 1 :(得分:4)
所以这是CS4过于聪明的一个例子,因为它本身就是好事。由于您并非明确地以某种方式引用所讨论的类,编译器可以在编译时确定它不包括SWF中的那些类 - 因此错误。
在Flex中,您可以使用命令行参数解决此问题,但CS4的情况并非如此。相反,您可以以编译器可以理解的方式显式引用您想要使用的类至少一次。例如,我创建了一个简单的SWC,其中包含一个符号,其类设置为“TestCircle”。在使用SWC的代码中,我有以下代码,它运行得很好:
import flash.utils.getDefinitionByName;
TestCircle;
var test:MovieClip = new (getDefinitionByName("TestCircle") as Class)();
addChild(test);
如果你觉得自己喜欢花哨,你可以编写一个小脚本来破解SWC(它只是一个zip文件),阅读里面的XML清单并自动创建一个特殊的“includer”类。但正如他们所说 - 我将把它作为读者的练习! ; - )
希望有所帮助!
答案 2 :(得分:3)
如果你想要想象你 可以写一个小脚本 破解SWC(它只是一个拉链 文件),读取XML清单 在里面创造一个特殊的“包含者” 自动上课。但正如他们所说 - 我会把它作为练习 读者! ; - )
无需做任何如此复杂的事情(谢天谢地!)。 include-libraries编译器参数将自动包含SWC中的所有类,允许getDefinitionByName
方法按预期工作。
在App-config.xml文件中(或者直接作为参数传递给编译器):
<include-libraries>
<library>path/to/your.swc</library>
</include-libraries>
然后您可以正常使用getDefinitionByName
。
HTH。
答案 3 :(得分:2)
使用FlashDevelop这很容易修复。
右键单击项目列表中包含的swc。选择选项,然后“包含库(完整库)”。
..您现在可以使用getDefinitionByName从swc文件中获取未引用的类。
答案 4 :(得分:0)
所以我仍然坚持使用一个长的,手动创建的脚本来编写引用每个导入类的脚本。当然,线条比嵌入方法短得多,一个术语甚至更短。
最后,我制作了我的ArtLibrary.fla,然后将该fla文库中的所有文件夹复制并粘贴到我的其他5个文件中。我没有打扰编译swf文件。对于我最有效的需求。
非常感谢所有的帮助。你的答案很简单,非常详细。
答案 5 :(得分:0)
是的
这个答案来得太晚了9年,但是您可以在不使用ApplicationDomain实际创建参考的情况下完成它。因此,假设在base_library.swf中有链接到moveiclips的类,您正在将这些类加载到主swf中。一个影片剪辑具有类链接“ Slide2”,在您的主swf中有此
private function loadSWF():void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("./lib/base_library.swf"));
}
private function onComplete(e:Event):void {
trace(" ON COMPLETE LOAD ");
var movie:* = LoaderInfo(e.currentTarget).content;
// now try and create an instance of a slide
var mc:MovieClip = createInstance(movie,"Slide2", "slide2");
addChild(mc);
}
public function createInstance(mc:MovieClip, className:String, instName:String):MovieClip
{
var cls:Class = mc.loaderInfo.applicationDomain.getDefinition(className) as Class;
if (cls)
{
var instMC:MovieClip = new cls();
instMC.name = instName;
return instMC;
}
return null;
}