2015-06-21 54 views
0

嘿大家所以我知道這一定很簡單,我過於複雜化,無法弄清楚如何去做。所以我有這些明星在我的startScreen的背景中移動,我想在遊戲開始時將它們移除。如何刪除For循環中的所有對象?

這裏是如何讓他們安裝在我的主類:

   public var numStars:int = 4; 

      //Add star background to startscreen only 
      for (var i:int = 0; i < numStars; i++) 
      { 
       stage.addChild(new mcStar(stage)); 
      } 

,並在我的mcStar類我有這樣的代碼:

public class mcStar extends MovieClip 
{ 

    private var stageRef:Stage; 
    private var starSpeed:Number; 


    public function mcStar(stageRef:Stage) 
    { 
     this.stageRef = stageRef; 
     setupStar(true); 

     addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
    } 


    public function setupStar(randomizeY:Boolean = false) : void 
    { 
     //Pick the frames for start position 
     var nRandom:Number = randomNumber(1, 3); 
     //Setup goto and stop on timeline 
     this.gotoAndStop(nRandom); 

     //inline conditional, looks complicated but it's not. 
     y = randomizeY? Math.random()*stageRef.stageHeight : 480; 
     x = Math.random()*stageRef.stageWidth; 
     alpha = Math.random(); 
     //rotation = Math.random()*360; 
     //scaleX = Math.random(); 
     //scaleY = Math.random(); 


     starSpeed = 2 + Math.random()*2; 
    } 

    public function loop(e:Event) : void 
    { 
     y -= starSpeed; 

     if (y <= stage.stageHeight/2) 
      setupStar(); 

    } 

    public function destroyStar():void 
    { 
     if (this.parent) 
     { 
      parent.removeChild(this); 
      removeEventListener(Event.ENTER_FRAME, setupStar); 
      removeEventListener(Event.ENTER_FRAME, loop); 
     } 

    } 

    //Generates a truly "random" number 
    function randomNumber(low:Number=0, high:Number=1):Number 
    { 
     return Math.floor(Math.random() * (1+high-low)) + low; 
    } 


} 

所以我試圖做到的是在我當用戶按下開始時的主類,我刪除了startScreen我希望所有的開始被刪除並停止產卵。但我無法弄清楚我將如何去除它們。當我嘗試我總是得到一個必須是來電的孩子等...

任何幫助,將不勝感激謝謝!

+0

您可以發佈您在Main類中使用的代碼以刪除星星嗎? – jdfinch3

回答

2

當您添加它時,將星星存儲在數組中。所以你可以稍後參考它們。

destroyStar-功能不是最佳實踐,因爲明星本身不應該有權改變主顯示列表中的內容。最好在Main中直接刪除它。

主要

public var numStars:int = 4; 
private var stars:Array = []; 

initStars(); 

function initStars():void{ 
    for (var i:int = 0; i < numStars; i++) 
    { 
     var star:mcStar = new mcStar(stage); 
     addChild(star); 
     stars.push(star); 
    } 
} 
function removeAllStars():void{ 
    for each(var star:mcStar in stars){ 
     if(contains(star)) { 
      star.destroy(); 
      removeChild(star); 
     } 
    stars=[]; 
} 

mcStar

//better name for this class would be McStar for better readability 
public function destroyStar():void 
{ 
     removeEventListener(Event.ENTER_FRAME, setupStar); 
     removeEventListener(Event.ENTER_FRAME, loop); 
} 

而且你不需要舞臺傳遞給構造函數。如果在舞臺上添加mcStar -instance,則可以使用this.stage

參考舞臺(僅有一個舞臺已存在)。問候。

+1

+1;另外,作爲文檔參考的經驗法則:[不應將對象直接添加到舞臺上]。(http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/ 3/flash/display/DisplayObjectContainer.html#addChild%28%29) – null

+0

嘿,非常感謝。對此,我真的非常感激。我知道我必須將它收集在一個陣列中,但並不確定如何。感謝所有的建議我決定考慮它。 – Nathan