2011-07-20 9 views
-1

私は昨夜、小さな円(星)をたくさん作って楽しむ小さなプロジェクトを作っていました。この星を表現するために、私は星のクラスを作成しました。ここでは、それ自体に基本的にはすべてのインスタンスがvarialblesゼロにするリスナーを追加し、基本的には初期化時に、あなたはそれが何をするかの概要を与えるために最も関連性の高い方法AS3でのMovieClipの削除

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); 

      } 


     } 

です。 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を確認してください... removeStarListenerを「Main」にアタッチする方法はわかりませんが、remove star関数はe.targetプロパティを正しく参照して、 ...

基本的には、GCがパスしたときにいつか、オブジェクトが解放されるために、オブジェクトに対するすべての参照を「強制終了」する必要があります。

あなたがすべての星を "削除"していないのは、あなたの "削除チェック"コードで右端と下端だけがチェックされているからです...おそらくいくつかの星は左または上に...左とそれを修正するかもしれません...(this.x < 0 || this.y < 0)

+0

その追加の条件に感謝します。トータルはそれを忘れていた – denniss

関連する問題