我在使用 Flash 和 Flex 时遇到了一个非常奇怪的问题。在某些情况下,如果同时加载了另一个 SWF,则在运行时(使用 Loader)加载的 SWF 中的影片剪辑似乎无法实例化。这是重现错误的程序的完整代码。它是通过Ensemble Tofino使用 mxmlc 编译的:
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.system.*;
public class DynamicLoading extends Sprite
{
private var testAppDomain:ApplicationDomain;
public function DynamicLoading()
{
var request:URLRequest = new URLRequest("http://localhost/content/test.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTestLoadComplete);
loader.load(request);
}
private function onTestLoadComplete(e:Event):void
{
var loaderInfo:LoaderInfo = LoaderInfo(e.target);
testAppDomain = loaderInfo.applicationDomain;
// To get the error, uncomment these lines...
//var request:URLRequest = new URLRequest("http://localhost/content/tiny.swf");
//var loader:Loader = new Loader();
//loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTinyLoadComplete);
//loader.load(request);
// ...and comment this one:
onTinyLoadComplete();
}
private function onTinyLoadComplete(e:Event = null):void
{
var spriteClass:Class = Class(testAppDomain.getDefinition("TopSymbol"));
var sprite:Sprite = Sprite(new spriteClass());
sprite.x = sprite.y = 200;
addChild(sprite);
}
}
}
如上所示,将第二个加载操作注释掉后,代码就可以工作了。但是,如果未注释第二个加载操作并且 onTinyLoadComplete在第二个 SWF 加载后运行,则包含的行将new spriteClass()
失败,并出现以下异常:
TypeError:错误 #1034:类型强制失败:无法将 flash.display::MovieClip@2dc8ba1 转换为 SubSymbol。 在 flash.display::Sprite/constructChildren() 在 flash.display::Sprite() 在 flash.display::MovieClip() 在 TopSymbol() 在 DynamicLoading/onTinyLoadComplete()[C:\Users\...\TestFlash\DynamicLoading.as:38]
test.swf 和 tiny.swf 是在 Flash CS4 中创建的。test.swf 包含两个符号,都为 ActionScript 导出,一个称为 TopSymbol,一个称为 SubSymbol。SubSymbol 包含一个简单的图形(涂鸦),TopSymbol 包含一个 SubSymbol 的实例。tiny.swf 不包含任何内容;这是发布一个新的、空的 ActionScript 3 项目的结果。
如果我修改 test.swf 以便不为 ActionScript 导出 SubSymbol,错误就会消失,但在我们的实际项目中,我们需要能够动态加载包含其他导出 sprite 类作为子项的 sprite 类。
关于造成这种情况或如何解决的任何想法?
编辑:一些人建议 tiny.swf 可能包含一个与 test.swf 或父级 (DynamicLoading.swf) 中的类同名的类。它不是。如上所述,我自己创建了 tiny.swf,只需发布一个全新的空 Flash CS4 项目。以下是swfdump -D
在 tiny.swf 上运行时的完整输出:
[标题] 文件版本:10 [HEADER] 文件是 zlib 压缩的。比率:41% [标题] 文件大小:1343 [标题] 帧率:30.000000 [标题] 帧数:1 [标题] 影片宽度:550.00 [HEADER] 影片高度:400.00 [045] 4 文件属性 as3 符号类 [04d] 1284 元数据 [009] 3 背景颜色 (ff/ff/ff) [056] 11 场景描述 [001] 0 显示帧 1 (00:00:00,000) [000] 0 结束