【问题标题】:AS3 trouble instantiating Document Class of loaded SWFAS3 实例化加载的 SWF 的文档类时遇到问题
【发布时间】:2011-02-14 21:59:12
【问题描述】:

我正在使用 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'); 
    }
}

干杯!

【问题讨论】:

    标签: actionscript-3 loader document-class


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 时遇到的确切错误吗?]

      debu

      【讨论】:

        【解决方案3】:

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

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

        var swf:DisplayObject = swfLoader.content;
        

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

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

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多