是否可以在预加载器启动之前加载非Document类?

时间:2011-02-28 13:06:25

标签: actionscript-3 actionscript preloader

public class Framework extends MovieClip
{
    var _loadingSystem:LoadingSystem;

    public function Framework() 
    {
        _loadingSystem = new LoadingSystem(this);
        loaderInfo.addEventListener(ProgressEvent.PROGRESS,progressHandler);
        loaderInfo.addEventListener(Event.COMPLETE, completeListener);
    }

...

public class LoadingSystem extends MovieClip
{

    public function LoadingSystem(parent:DisplayObjectContainer) 
    {
        parent.addChild(this);

        myLogo.buttonMode = true;
        myLogo.addEventListener(MouseEvent.CLICK, gotoMySite); 
    }

正如您所看到的,Framework是我的Doc类,它正在创建_loadingSystem,它基本上是一个包含预加载器图形的动画片段。当我调试时,我收到以下错误“TypeError:错误#1009:无法访问空对象引用的属性或方法。”指向myLogo.buttonMode = true;

据我所知,这是由于在Framework中创建之前没有完全加载LoadingSystem。我有什么方法可以做这个工作吗?我已经尝试为Event.ADDED添加监听器,但它没有用。

附加信息:3帧FLA,第一个为空,有一个停止,第二个持有AssetHolder movieclip,第三个为应用程序。我在发布设置中设置了第二帧导出,在资源中未选中导出第二帧的所有复选框,这在我更改第二帧设置的导出之前都有效,除非它没有预加载文件的50%。

2 个答案:

答案 0 :(得分:0)

我认为发生的事情是:

文档类总是在第一帧中加载,因为它代表你的swf根类,因此必须在第一帧中。现在,因为您将所有其他类导出到第2帧,我想,LoadingSystem只存在于第2帧,但您尝试在文档类Framework的构造函数中实例化它。

你可以尝试的是,在Framework中创建一个方法“初始化”,并从第2帧的时间轴调用它。在那个方法中你可以做这些东西,你现在在Framework的构造函数中做。

答案 1 :(得分:0)

如果myLogo是舞台上的精灵/动画片段,则在LoadingSystem添加stage之前它不会存在。

现在你的第一反应应该是“但是我用parent.addChild(this)将它添加到舞台上!”。您没有考虑的是,在调用构造函数时,文档类不在舞台上。 Flash基本上执行如下:

docClass = new DocumentClass();
stage.addChild(docClass);

这意味着文档类的stage属性将为null,直到构造函数完成后 。这也意味着在构造函数期间添加的任何子项都无法访问舞台或舞台上的对象,直到 docClass添加到舞台后。

有一个简单的解决方法;听取ADDED_TO_STAGE事件。

public function LoadingSystem(parent:DisplayObjectContainer) 
{
  parent.addChild(this);
  addEventListener(Event.ADDED_TO_STAGE, initialize);
}

private function initialize(e:Event):void
{
  removeEventListener(Event.ADDED_TO_STAGE, initialize);
  addEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
  //attach stage listeners etc
  myLogo.buttonMode = true;
  myLogo.addEventListener(MouseEvent.CLICK, gotoMySite);
}

private function uninitialize(e:Event):void
{
  removeEventListener(Event.REMOVED_FROM_STAGE, uninitialize);
  addEventListener(Event.ADDED_TO_STAGE, initialize);
  //detach stage listeners etc.
}