AS3,在SWF中加载为自定义类型

时间:2009-10-12 14:33:08

标签: actionscript-3 actionscript casting flash

这里的基本问题。通常在AS3中,您通过Loader加载SWF,而您获得的是某种类型为“Loader”的伪MovieClip。

假设SWF是使用自定义类型的基类发布的,那么在阳光下有没有神圣的方式将这个加载的SWF强制转换为扩展MovieClip而不是Loader的自定义类型?没有数据丢失?

或者,假设你不能,你甚至可以从扩展Loader本身的自定义类型转换它吗?

3 个答案:

答案 0 :(得分:5)

您可以这样做:

存根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;

    }
}

“main”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");
}

答案 1 :(得分:3)

根据对this article in the LiveDocs的评论,您可以将Loader.content强制转换为MovieClip并以此方式访问它。

但是,有一些限制。例如,SWF本身必须是AS3 SWF文件,并且正在加载的SWF和正在加载的SWF应该共享相同的沙箱。

答案 2 :(得分:1)

是的,loader.content让您可以访问所加载的内容。你应该能够简单地把它当作你想要的那样。

或者,您可以选择扩展Loader,它已经扩展了DisplayObjectContainer,因此您将开始使用MovieClip的大部分功能。在这种情况下,编写它以便您可以简单地调用MyCustomClass.load(此处为swf)并且它应该执行您需要的操作。

我希望有所帮助!