2012-07-19 77 views
0

我在Flash Professional CS5.5中使用AS3創建遊戲。舞臺變爲空

在這個遊戲中,我有一個「再次」按鈕,以便玩家可以重置關卡並從新開始。 我現在的問題是:

點擊「再次」後,舞臺變爲空。

我在「ResetLevel」方法中做的所有事情是,我將某些元素的x和y位置重新設置爲0,從動畫片段中刪除一些項目,但不會從顯示列表中刪除所有項目。所以背景,hud,飛機不會從動畫片段中刪除。這裏是我的顯示列表的草圖。所述可拆卸的物品有時爲零,有時他們是30個或更多個項目(取決於播放時間,等等)

Displaylist: 

stage 
|-- Game movieclip 
    |--LevelBackground 
    |--Removeable item 
    |--Removeable item 
    |--Removeable item 
    |--Plane 
    |--HUD 

但是,消除了「可拆卸items」和設置的位置座標後levelbackground和平面的階段是空值。

也許有人可以幫我指點我解決這個問題的方法。

編輯:

的「ResetLevel」 - 方法將「遊戲影片剪輯」和階段內被稱爲將從「遊戲影片剪輯」來訪問了。所以當我重置關卡時,我不會從顯示列表中刪除「遊戲動畫片段」。我只刪除了一些元素,即動畫片段包含的動畫片段。

這裏從「遊戲MovieClip類」一些僞(GameMC):

public class GameMC extends Sprite { 

    //Some properties here 

    public function GameMC() { 
     //Some code here 

     //--Events-- 
     this.addEventListener(Event.ADDED_TO_STAGE, Init, false, 0, true); 
     this.addEventListener(Event.REMOVED_FROM_STAGE, Removed, false, 0, true); 
    } 

    private function Init(e:Event) { 
     this.removeEventListener(Event.ADDED_TO_STAGE, Init); 
     //Some Code here 
    } 

    private function ResetLevel() { 
     //Some Code here, too 
     if(removeItemArray.length > 0) { 
      for(i = 0; i < removeItemArray.length; i++) { 
       currentRemoveableItem = removeItemArray[i]; 
       this.removeChild(currentRemoveableItem); 
       removeItemArray.splice(i, 1); 
      } 
     } 
     level.x = 0; 
     level.y = 0; 

     trace(stage); //Will output null 
    } 
} 
+0

從[文檔](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/如果一個顯示對象沒有被添加到顯示列表中,它的stage屬性被設置爲null。「 – Engineer 2012-07-19 10:59:24

+0

我知道,但是我並沒有移除」遊戲動畫片段(flash movie/display/DisplayObject.html#stage) - >「' 「從我的顯示列表中,在這個動畫片段內,我嘗試訪問stage.stageWidth。在「遊戲動畫片段」內部,我使用了「ADDED_TO_STAGE」和「REMOVED_FROM_STAGE」。 – WolvDev 2012-07-19 11:10:29

+0

GameMC是否有附加到您放置在舞臺上的圖書館物品的機會?如果是這樣,那麼如果你的時間線跳到一個沒有出現的幀,它將自動從舞臺上移除。 – weltraumpirat 2012-07-19 17:08:21

回答

0

現在我以前的階段存儲到屬性和訪問此:

public class GameMC extends Sprite { 

    //Some properties here 
    private var stagevar:Stage; 

    public function GameMC() { 
     //Some code here 

     //--Events-- 
     this.addEventListener(Event.ADDED_TO_STAGE, Init, false, 0, true); 
     this.addEventListener(Event.REMOVED_FROM_STAGE, Removed, false, 0, true); 
    } 

    private function Init(e:Event) { 
     this.removeEventListener(Event.ADDED_TO_STAGE, Init); 
     this.stagevar = stage; 
     //Some Code here 
    } 

    private function ResetLevel() { 
     //Some Code here, too 
     if(removeItemArray.length > 0) { 
      for(i = 0; i < removeItemArray.length; i++) { 
       currentRemoveableItem = removeItemArray[i]; 
       this.removeChild(currentRemoveableItem); 
       removeItemArray.splice(i, 1); 
      } 
     } 
     level.x = 0; 
     level.y = 0; 

     trace(stagevar); //Will output [Object Stage] 
    } 
} 
2

當一個DisplayObject從顯示列表刪除,它不保存到舞臺的任何引用了。因此,無論您需要設置/計算,請在有效狀態下進行。 Event.ADDED,Event.ADDED_TO_STAGE,Event.REMOVED和Event.REMOVED_FROM_STAGE幫助驗證DisplayObject的狀態是否有效。

+0

你寫的是正確的。但它不回答「'也許有人可以幫我指點我解決這個問題的辦法嗎?」的問題。 – Engineer 2012-07-19 11:02:37

+0

在「遊戲動畫片段」裏面,我使用了「ADDED_TO_STAGE」和「REMOVED_FROM_STAGE」,我並沒有從我的舞臺/展示列表/任何內容中刪除「遊戲動畫片段」,並且我嘗試訪問舞臺。 – WolvDev 2012-07-19 11:11:03

+0

是的,最簡單的方法是設置一個標誌,如果DisplayObject處於舞臺上或不在舞臺上。 – 2012-07-19 11:12:10