加载外部swf时闪存崩溃(在重启循环中结束)

时间:2010-06-30 10:42:34

标签: actionscript-3 flash flash-cs4

我正在使用FlashDevelop并有两个主要项目,都是纯AS3项目。

当我尝试从我的主项目加载我的第二个项目时,我会遇到各种错误。

主项目的Main类扩展了Sprite,“待导入”项目中的Main类扩展了MovieClip。看看FD中调试窗口中swf的加载一切似乎都很好:

[SWF] 'pathToSwf'\secondProject.swf - 410 626 bytes after decompression.

如果我尝试将加载的swf分配给新创建的MovieClip,我会遇到强制失败:

swfContent = loader.content; // =>
Type Coercion failed: cannot convert Main@46c0201 to flash.display.MovieClip.

所以,像这样对所加载的内容进行类型转换:

swfContent = loader.content as MovieClip;

删除了该错误,但当我尝试调用addChild时,我会陷入下一个坑:

Error #2007: Parameter child must be non-null.

试图解决这个问题我试图将加载程序直接添加到我要显示外部swf的容器中。这是真正有趣的问题开始的时候:

targetContainer.addChild(loader);

我的主应用程序现在挂起,在永无止境的循环中重新启动。我不知道为什么......

所以我的问题确实如此。如何加载我的外部swf,然后再次为空。 当我自己运行外部swf时它完全正常......

4 个答案:

答案 0 :(得分:1)

loader.content上使用getQualifiedClassNamegetQualifiedSuperclassName函数(如果必须,甚至是describeType)来获取其确切的类型信息。

loader.content as MovieClip返回null,因为loader.content不是MovieClip - 当as关键字失败时,null关键字无效地返回getQualifiedClassName。加载的内容是否有可能是AS2影片剪辑而不是AS3影片剪辑?在这种情况下,"AVM1Movie"将返回{{1}}。

答案 1 :(得分:0)

后一个问题很奇怪,但首先尝试将swfContent的类型更改为Sprite。主类并不总是扩展MovieClip,并且从错误消息判断它在这种情况下确实不会。

答案 2 :(得分:0)

如果swfContent无法投放到MovieClip,则as将为空。这就是var swfContent :MovieClip = MovieClip(loader.content); 运算符在类型强制失败时应该如何工作的方式。

修改你的作业操作:

try...catch

您可能希望在swfContent块中包含赋值,因为如果失败则会抛出错误,而不是as被设置为null,与{{1}}一样。< / p>

答案 3 :(得分:0)

所以问题是我加载的swf的主类与我加载的swf同名。这导致当flash尝试执行加载的swf时,它实际上调用了父MAIN类,这导致了循环行为。

要避免此DHuntrods建议更改解决问题的应用程序域。

loader = new Loader();
var AD:ApplicationDomain = new ApplicationDomain( null );
var context:LoaderContext = new LoaderContext( false, AD );
loader.load(new URLRequest(path), context);