1

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

所以我想知道......如何将子 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'); 
    }
}

干杯!

4

3 回答 3

3

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

首先,文档类实例由Loadercontent属性引用。你会这样引用它:

var swf:DisplayObject = swfLoader.content;

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

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

希望有帮助。

于 2010-05-03T17:06:11.537 回答
1

您将 mainMovie 添加到舞台,然后添加一个侦听器来启动它。该事件不会被触发,因为它是在电影上台后添加的。

于 2010-05-03T09:17:48.593 回答
0

Cristi 所说的可能是对的,因为您的 init 方法没有触发,但更奇怪的问题是您加载的子 swf 的构造函数MainMovie应该在创建该对象后立即触发。

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

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

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

看看你会得到什么。[您还可以粘贴尝试访问 init 时遇到的确切错误吗?]

得不

于 2010-05-03T10:32:01.040 回答