Actionscript 3 加载外部swf时发生闪存崩溃(以重启循环结束)
我与FlashDevelop合作,有两个主要项目,都是纯AS3项目 当尝试从主项目加载第二个项目时,我会遇到各种各样的错误 主项目的主类扩展了Sprite,“要导入”项目中的主类扩展了MovieClip。查看FD中调试窗口中swf的加载情况,一切似乎都很好:Actionscript 3 加载外部swf时发生闪存崩溃(以重启循环结束),actionscript-3,flash,flash-cs4,Actionscript 3,Flash,Flash Cs4,我与FlashDevelop合作,有两个主要项目,都是纯AS3项目 当尝试从主项目加载第二个项目时,我会遇到各种各样的错误 主项目的主类扩展了Sprite,“要导入”项目中的主类扩展了MovieClip。查看FD中调试窗口中swf的加载情况,一切似乎都很好: [SWF] 'pathToSwf'\secondProject.swf - 410 626 bytes after decompression. 如果我尝试将加载的swf分配给新创建的MovieClip,则会出现强制失败: swfCont
[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时,它工作得非常好…后一个问题很奇怪,但是首先尝试将swf内容的类型更改为
Sprite
。主类并不总是扩展MovieClip
,从错误消息判断,它在这种情况下确实不扩展。后一个问题很奇怪,但首先尝试将swfContent的类型更改为Sprite
。主类并不总是扩展MovieClip
,从错误消息判断,在这种情况下它确实不会扩展。使用loader.content
上的函数(即使必须)来获取其确切的类型信息
loader.content as MovieClip
返回null
,因为loader.content
不是MovieClip
-使用as
关键字进行强制转换失败时,会自动返回null
。是否有可能加载的内容是AS2电影剪辑而不是AS3电影剪辑?在这种情况下,getQualifiedClassName
将返回“AVM1Movie”
使用loader.content上的函数(即使您必须这样做),以获取其确切的类型信息
loader.content as MovieClip
返回null
,因为loader.content
不是MovieClip
-使用as
关键字进行强制转换失败时,会自动返回null
。是否有可能加载的内容是AS2电影剪辑而不是AS3电影剪辑?在这种情况下,getQualifiedClassName
将返回“AVM1Movie”
如果您的swfContent
无法转换到MovieClip
,则它将为空。这就是当类型强制失败时,as
操作符应该如何工作的
按如下方式修改分配操作:
var swfContent :MovieClip = MovieClip(loader.content);
您可能希望将赋值包含在try…catch
块中,因为失败时会抛出错误,而不是将swfContent
设置为null,就像as
您的swfContent
如果无法转换为MovieClip
,则将为null。这就是当类型强制失败时,as
操作符应该如何工作的
按如下方式修改分配操作:
var swfContent :MovieClip = MovieClip(loader.content);
您可能希望将赋值包含在try…catch
块中,因为失败时会抛出错误,而不是将swfContent
设置为null,就像as
一样,因此问题是加载的swf的主类与加载的swf同名。这导致当flash试图执行加载的swf时,它实际上调用父主类,从而导致循环行为
为避免此问题,建议更改解决此问题的应用程序域
loader = new Loader();
var AD:ApplicationDomain = new ApplicationDomain( null );
var context:LoaderContext = new LoaderContext( false, AD );
loader.load(new URLRequest(path), context);
所以问题是我加载的swf的主类与我从中加载的swf同名。这导致当flash试图执行加载的swf时,它实际上调用父主类,从而导致循环行为
为避免此问题,建议更改解决此问题的应用程序域
loader = new Loader();
var AD:ApplicationDomain = new ApplicationDomain( null );
var context:LoaderContext = new LoaderContext( false, AD );
loader.load(new URLRequest(path), context);
谢谢你的回答!在本例中,我显式地让我的主类扩展MovieClip,因此我假设它将以这种方式工作。。。奇怪的是,当我追踪loader.content时,我得到了[objectmain]。。。有什么想法吗?但是,尝试你的建议(…作为Sprite),我直接进入了一个奇怪的循环,这个循环一直在重新启动我的应用程序…你能控制加载的SWF吗?问题可能就在那里。谢谢你的回答!在本例中,我显式地让我的主类扩展MovieClip,因此我假设它将以这种方式工作。。。奇怪的是,当我追踪loader.content时,我得到了[objectmain]。。。有什么想法吗?但是,尝试你的建议(…作为Sprite),我直接进入了一个奇怪的循环,这个循环一直在重新启动我的应用程序…你能控制加载的SWF吗?问题可能就在这里。把它当精灵来玩就成功了,但还是让我陷入了这样一种奇怪的境地,因为某种原因应用程序一直在重启。这就是我调用addChild()方法的时候。。。有什么想法吗?QualifiedClassName=Main QualifiedSuperClassName=Sprite感谢您的提示@托拜厄斯:关于重启问题——在不知道加载的SWF的情况下很难说。你有密码吗?在事件中查找任何可疑的内容。添加了或事件。添加了\u到\u STAGE
处理程序;事件中有任何提示。输入_FRAME
处理程序?这是我自己尝试加载的SWF,这是最奇怪的事情。你知道有哪种情况下SWF可以正常工作,可以自己玩,但不能加载?作为测试,我在FD中创建了两个小型AS3项目。一个只加载另一个,另一个只有两个矩形(都是在代码中创建的)。但我还是发现了r的同样问题