2013-03-11 101 views
-3

我在Adobe Flash Professional CS5中構建項目(使用ActionScript 3.0)。舞臺何時加載?

在其中一個類中,我想根據場景的大小向場景添加一些對象。

我使用構造函數中的以下代碼:

stageWidthint = stage.stageWidth; 
stageHeightint = stage.stageHeight; 
startMenu.x = stageWidthint/2; 
startMenu.y = ((stageHeightint/2) - 40); 
instructionsMenu.x = stageWidthint/2; 
instructionsMenu.y = ((stageHeightint/2) + 2); 
highscoreMenu.x = stageWidthint/2; 
highscoreMenu.y = ((stageHeightint/2) + 44); 
quitMenu.x = stageWidthint/2; 
quitMenu.y = ((stageHeightint/2) + 86); 
this.addChild(startMenu); 
this.addChild(instructionsMenu); 
this.addChild(highscoreMenu); 
this.addChild(quitMenu); 

我得到的stage空引用。經過快速搜索,我發現當時尚未加載stage。不過,我想把這些孩子加入課堂。舞臺什麼時候加載?如何解決這個問題,並在遊戲開始時仍顯示所有內容?

+0

Event.ADDED_TO_STAGE – 2013-03-11 20:17:20

+0

好的,謝謝,這解決了我的問題。我將所有這些東西放在事件處理程序調用的方法中。但是,什麼時候加載完成?這是幾秒鐘或什麼事情? – Joetjah 2013-03-11 20:24:27

+0

Downvoter,關心發表評論? – Joetjah 2013-03-12 14:44:03

回答

1

在構造函數中使用ADDED_TO_STAGE事件。

public function ConstructorName():void 
{ 
    addEventListener(Event.ADDED_TO_STAGE,onAddedToStage); 
} 

private function onAddedToStage(e:Event):void 
{ 
     removeEventListener(Event.ADDED_TO_STAGE,onAddedToStage); 
     // add init code here 
} 
+0

你知道舞臺完成加載的時候嗎?在階段實際加載之前,但在代碼開始運行之後,哪些類型的東西被執行? – Joetjah 2013-03-12 14:44:45

+0

當你的主類收到ADDED_TO_STAGE時,舞臺完成加載,我並不真正瞭解flash播放器的內部結構以及之前的操作。但是您並不需要這些知識,只要注意,對於不在舞臺上並且在收到ADDED_TO_STAGE事件之前的顯示對象,舞臺成員將爲空。 – 2013-03-12 14:59:11

+0

好的,我明白了。我希望通過拆分我的構造函數來提高性能,但似乎沒有人知道在其中可以做些什麼。似乎我必須通過試驗和錯誤來找到它;) – Joetjah 2013-03-12 15:00:58

1

我不知道使用的場景時,是如何工作的,但你可以嘗試:

package { 
    import flash.display.*; 
    import flash.events.*; 


    public class Test extends MovieClip { 


    public function Test() { 
     if (stage) { 
     init(); 
     } else { 
     addEventListener(Event.ADDED_TO_STAGE, init); 
     } 
    } 

    protected function init(event:Event = null):void { 
     trace("init"); 
     if (event) { removeEventListener(Event.ADDED_TO_STAGE, init) }; 
     //your code here 
    } 
    } 
} 
1

Stage對象不是全局可用。
擴展MovieClip的類將具有屬性「stage」(小寫)
在您的類的實例已添加到舞臺之前,「stage」屬性爲null。
這就是爲什麼我們要監聽ADD_TO_STAGE事件。

stage = null其中的一個將在構造函數IE中作爲參數傳遞到舞臺中:var xxx:MyClass = new MyClass(s​​tage); 這就是說,如果創建實例的類已經有階段的引用。

我想補充說,在你的自定義類中的訪問階段不是一個好的面向對象的實踐,因爲類應該只關心自己。我會建議重寫寬度setter/getters。這是因爲尺寸可以改變,例如風景到人像旋轉。