我正在使用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时它完全正常......
答案 0 :(得分:1)
在loader.content
上使用getQualifiedClassName和getQualifiedSuperclassName函数(如果必须,甚至是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);