2011-07-20 197 views
-1

所以我創造了一個有趣的小項目昨晚涉及創建大量的小圓圈(星)。所以爲了代表這顆明星,我創建了一個明星班。這是最相關的方法影片剪輯去除AS3

public class Star extends MovieClip 
{ 

public function Star(r:Number) 
     { 
      starRadius = r; 
      this.animated = false; 
      this.graphics.beginFill(0xFFFFFF); 
      this.graphics.drawCircle(0,0,starRadius); 
      this.graphics.endFill(); 

      this.addEventListener(Event.REMOVED, onRemoval); 
     } 
public function animate():void 
     { 
      if(isNull(angle)|| isNull(speed)){ 
       throw new Error("Angle or speed is NaN. Failed to animate"); 
      } 
      if(animated){ 
       throw new Error("Star already animated"); 
      } 
      if(this.parent == null){ 
       throw new Error("Star has not been added to stage yet"); 
      } 

      this.addEventListener(Event.ENTER_FRAME, doAnimate, false, 0); 
      animated = true; 
     } 

private function doAnimate(e:Event):void{ 

      if(isNull(cachedDirectionalSpeedX) || isNull(cachedDirectionalSpeedY)){ 
       cachedDirectionalSpeedY = -speed * Math.sin(angle); 
       cachedDirectionalSpeedX = speed * Math.cos(angle); 
      } 

      this.x += cachedDirectionalSpeedX; 
      this.y += cachedDirectionalSpeedY; 


      if(this.x > this.parent.stage.stageWidth || this.y > this.parent.stage.stageHeight){ 
       this.dispatchEvent(new Event("RemoveStar",true)); 
       this.removeEventListener(Event.ENTER_FRAME, doAnimate); 

      } 


     } 

爲了給你什麼它做了總結,基本上就初始化它增加了對自身的監聽器,基本上是空值每個實例varialbles。當animate()被調用時,它會向本身添加一個偵聽器,並將其動畫到某個方向。這個聽衆還檢查它的位置是否已經在舞臺之外,並且在它已經到達時停止它的移動。另外,它會派發一個事件,以便父母知道何時刪除它。

因此,在「主」類,我有

this.addEventListener("RemoveStar", removeStar); 

private function removeStar(e:Event):void 
     { 
      starCount--; 
      this.removeChild(Star(e.target)); 
     } 

我還有一個聽衆,基本上打印出數兒,它有每次,但我不是要去把代碼放在這裏。我遇到的問題是......看起來像刪除星星的聽衆不能「一直」工作。當創建1000個明星在啓動時,沒有別的,兒童人數下降在開始的時候,它被卡在一定數量這使我覺得有一些影片剪輯不會移除。有人知道這裏發生了什麼嗎?

+1

你能向我們展示完整的代碼?有不同的東西丟失:所有的類屬性,以及一些類的方法,如ISNULL()或onRemoval() – pkyeck

+1

哪裏'onRemoval()'函數,想必應該去掉所有的內部引用? – shanethehat

回答

0

檢查您是否正在移除所有事件偵聽器,例如removeStar ...我沒有看到如何將removeStar偵聽器附加到「Main」,但remove star函數正確引用e.target屬性作爲星號...

基本上,你需要爲它被「釋放」在將來某個時候,當GC做它的傳球「殺死」的對象的所有引用。

原因雖然你不是「刪除」所有的星星,大概只有右側和底部邊緣都在你的「刪除檢查」代碼進行覈對......可能有些明星去左或向上......添加更多的條件進行左,並可能自我修復...(this.x < 0 || this.y < 0)

+0

感謝您的額外條件。總結忘了 – denniss