AS3无法实例化加载的SWF的Document Class

时间:2010-05-03 04:43:18

标签: actionscript-3 loader document-class

我使用Loader类将一个swf加载到另一个swf中,但是当子swf完成加载并添加到显示列表时,其Document类未实例化。我有一些跟踪语句应该在创建对象时执行,但加载到父SWF时没有任何事情发生。当我自己编译子SWF时,Document Class按预期运行。

所以我想知道......如何将儿童SWF的文档类与Loader.content相关联?

使用以下Kishi的解决方案更新代码。

public class Preloader extends Sprite {
    import flash.net.*;
    import flash.display.*;
    import flash.events.*;

    // code in parent SWF's Document Class (Preloader.as)
    private var swfLoader:Loader;
    public var mainMovie:MovieClip;

    public function Preloader(){   
        swfLoader = new Loader();
        swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderDone);
        swfLoader.load(new URLRequest("mainmovie.swf"));
    }

    private function loaderDone(e:Event):void {
        // Cast Loader.content to MovieClip
        mainMovie = MovieClip(swfLoader.content);

        mainMovie.addEventListener(Event.ADDED_TO_STAGE, mainMovieAddedListener);

        addChildAt(mainMovie, 0);

    }
    private function mainMovieAddedListener(e:Event):void {
       // init() not necessary
    }
}

// MainMovie.as runs after casting swfLoader.content to MovieClip

public class MainMovie extends Sprite {

    public function MainMovie(){
        trace('MainMovie WHATTUP'); 
    }

    public function init():void {
        trace('init'); 
    }
}

干杯!

3 个答案:

答案 0 :(得分:3)

问题在于 您是如何尝试访问swf实例的。

首先,文档类实例由 Loader content 属性引用。你可以像这样引用它:

var swf:DisplayObject = swfLoader.content;

但是,即使这样,你也必须将 DisplayObject 转换为它的真实类(在本例中是 MainMovie )或动态类(例如 MovieClip ),当您尝试使用自定义属性时,它不属于 DisplayObject 本身。因此,您可以像这样调用 MainMovie.init()

var swf:MovieClip = MovieClip(swfLoader.content);
swf.init();

希望有所帮助。

答案 1 :(得分:1)

您正在将mainMovie添加到舞台,然后添加一个内置它的侦听器。电影上映后,该事件不会被触发。

答案 2 :(得分:0)

Cristi说的可能是正确的,因为你的init方法没有触发,但更奇怪的问题是你加载的子swf的构造函数 MainMovie 应该尽快解雇对象已创建。

每当我做完这样的事情时,我从来没有从加载的swf的内容创建一个新的Sprite对象。似乎你正在做的是使用像它的BitmapData这样的swf来创建Sprite mainMovie

试试这个:删除说swfLoader = null的陈述,改为说addChild(swfLoader);。如果您仍然希望事件监听器检查它是否已添加到舞台中,请在执行addChild(swfLoader);之前将其放入,当然将其放在 swfLoader 而不是 mainMovie < / em>对象:

swfLoader.addEventListener(Event.ADDED_TO_STAGE, mainMovieAddedListener);
addChild(swfLoader);

看看你得到了什么。 [你也可以粘贴试图访问init时得到的确切错误吗?]

得不