2011-02-28 55 views
0
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); 
    } 

...是否可以在preloader启动之前加载非文档类?

public class LoadingSystem extends MovieClip 
{ 

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

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

正如你所看到的,框架是我的文档类,它是创建_loadingSystem这基本上是一个包含预加载图形动画片段。当我调试时出现以下错误“TypeError:Error#1009:Can not access a property or method of an null object reference。”指向myLogo.buttonMode = true;

据我所知,这是由于在Framework中创建之前,LoadingSystem未完全加载。有什么办法让我做这项工作?我曾尝试为Event.ADDED添加监听器,但它不起作用。

附加信息:3帧FLA,第一个空的停止,第二个持有AssetHolder动画片段,第三个为应用程序。我已经在发布设置中的第二帧设置上导出,在第二帧上导出的所有复选框未在资产中被选中,并且在我更改第二帧设置上的导出之前这一切都工作,除非它不预先加载文件的50%。

回答

0

我认为发生的事情是这样的:

文档类总是加载在第一帧,因为它代表着你的SWF文件的根类,因此必须有在第一帧。现在,由于您将所有其他类导出到第2帧,因此我会想象,加载系统仅存在于第2帧开始,但您尝试在文档类Framework的构造函数中实例化它。

你可以尝试的是,在Framework中创建一个“初始化”方法,并从第2帧的时间线中调用该方法。在该方法中,您将执行这些操作,您目前在Framework的构造函数中执行该操作。

0

如果myLogo是舞台上的精灵/动画片段,它将不会存在,直到LoadingSystem被添加到stage

现在你的第一反应应该是“但是我把它加到舞台上parent.addChild(this)!”。你没有考虑到的是文档类不在调用构造函数的阶段。闪存基本上执行这样的:

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. 
} 
相关问题