【问题标题】:AS3, loading in a SWF as a custom typeAS3,将 SWF 作为自定义类型加载
【发布时间】:2009-10-12 14:33:08
【问题描述】:
这里的基本问题。通常在 AS3 中,您通过 Loader 加载 SWF,您得到的是某种“Loader”类型的伪 MovieClip。
假设 SWF 是使用自定义类型的基类发布的,是否有任何神圣的方法可以将此加载的 SWF 转换为扩展 MovieClip 而不是 Loader 的自定义类型?没有数据丢失?
或者,假设你不能,你甚至可以从扩展 Loader 本身的自定义类型转换它吗?
【问题讨论】:
标签:
actionscript-3
actionscript
casting
flash
【解决方案1】:
你可以这样做:
存根 swf 中的代码:
package {
import flash.display.MovieClip;
public class Stub extends MovieClip implements IStub {
public function Stub() {
trace("Stub::ctor");
}
public function traceIt(value:String):void {
trace("Stub::traceIt " + value);
}
}
}
我正在使用一个接口,但这不是绝对必要的。
package {
public interface IStub {
function traceIt(value:String):void;
}
}
“主”swf 中的代码。
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT,handleInit);
loader.load(new URLRequest("Stub.swf"));
function handleInit(e:Event):void {
var stub:Stub = loader.content as Stub;
// or, using an interface
// var stub:IStub = loader.content as IStub;
stub.traceIt("testing");
}
【解决方案2】:
根据this article in the LiveDocs 上的 cmets,您可以将 Loader.content 投射到 MovieClip 并以这种方式访问它。
但是,有一些限制。例如,SWF 本身必须是一个 AS3 SWF 文件,并且执行加载的 SWF 和正在加载的 SWF 应该共享同一个沙箱。
【解决方案3】:
是的,loader.content 让您可以访问已加载的任何内容。您应该能够简单地将其转换为您想要的任何内容。
或者,您可以选择扩展 Loader,它已经扩展了 DisplayObjectContainer,因此您将拥有 MovieClip 的大部分功能。在这种情况下,编写它以便您可以简单地调用 MyCustomClass.load(swf here),它应该可以满足您的需要。
希望对你有帮助!