2011-02-28 70 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. 
} 
相關問題