如何在文档类中加载具有访问阶段的外部swf?

时间:2016-12-06 14:57:44

标签: actionscript-3 flash

我有一个主SWF加载其他swfs。所有内容都可以正常使用主swf内的代码( sketch ):

var loader:Loader = new Loader();
stage.addChild(loader);
loader.load(new URLRequest('external.swf'));

但是,在尝试加载使用文档类的外部swf时,它对stage对象有访问错误。更清楚的是,将在要加载的swf出版物中配置文档类:

Classe de documento Main

Main.as内,拥有舞台访问代码的类:

package {
    import flash.display.MovieClip;
    public class Main extends MovieClip {
        public function Main() {
            // access stage
            trace(stage);
            trace(stage.stageWidth);
        }
    }
}

当主swf尝试加载外部swf时,会发生错误:

null
TypeError: Error #1009: Cannot access a property or method of a null object reference.

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

不要在加载的swf的构造函数中引用stage。请改为订阅Event.ADDED_TO_STAGE

package {
    import flash.display.MovieClip;
    public class Main extends MovieClip {
        public function Main() {
            trace("1 stage="+stage); // null, if this swf is loaded
            addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }
        protected function onAddedToStage(event:Event):void
        {
            trace("2 stage="+stage); // object
        }           
    }
}

更新:如果您无法修改加载的swf,则可以在加载程序swf中覆盖其主类定义。如果加载的swf的Main类包含重要和/或不断变化的逻辑,则可能产生不希望的后果。

  1. loader swf中定义Main类,在你加载的swf中的同一个包中。
  2. 在Main构造函数中使用ADDED_TO_STAGE编写正确的操作以正确访问阶段。
  3. 将此Main编译到您的加载器swf中:只需在主swf的代码中添加Main;(这也可以使用flash builder中的编译器参数来完成,但为什么要这么做)
  4. 这样就可以完全替换Main的定义。