2011-12-28 4 views
0

オブジェクトプールの設定に問題があります。私はプールロジックを扱うための "BallPoll"カスタムクラスを作成しました。最初にfillPool()を呼び出して、20個のBallオブジェクトを配列に追加します。次に、ドキュメントクラスでボールを作成するときにプール配列をチェックします。それは動作していないと私は理由がわからない。オブジェクトプールが機能しない

------ドキュメントクラス---------

function throwBall(e:TimerEvent):void { 

    if (mouseY>stage.stageHeight-180) { 
     return; 
    } 

    var tBall:Ball = Pool.getBall(new Point(mouseX,mouseY),new Point(Math.random()+Math.random()*5+Math.random()*8),gravity,friction); 
    tBall.gotoAndStop(BallColor); 
    addChild(tBall); 
    ballArray.push(tBall);  

} 

----------- BallPoolクラス---------

package { 


import flash.events.TimerEvent; 
import flash.geom.Point; 
import flash.events.*; 
import flash.display.*; 
import flash.utils.*; 
import flash.system.*; 
import Ball; 

public class BallPool extends MovieClip { 


    private static const gravity:Number=1.5; 
    private static const friction:Number=.50; 
    public var STOREDBALLS:Array = new Array(); 

    public function BallPool() { 

     fillPool(); 

    } 

    public function fillPool() { 

     for (var i:int = 0; i < 20; i++) { 

      var NewBall:Ball = new Ball(new Point(mouseX,mouseY),new Point(Math.random()+Math.random()*5+Math.random()*8),gravity,friction); 
      STOREDBALLS.push(NewBall); 
     } 


    } 

    public function getBall($position:Point, $vector:Point, $gravity:int, $friction:Number):Ball { 

     if (STOREDBALLS.length > 0) { 

      var counter:int = 0; 

      trace(STOREDBALLS.length); 
      var ball:Ball = STOREDBALLS[counter]; 
      trace("44"); 
      counter ++; 
      return ball; 

     } else { 

       return new Ball($position, $vector, $gravity, $friction); 
     } 

     //return null; 
    } 
} 
} 
+1

どの部分が機能していませんか?何が問題なのですか? – Cadin

+0

getBall関数が機能していません。私はどのようにSTOREDBALLS配列をループし、どのボールがステージ上にあり、どのボールがステージ上にないのかを判断することはできません。また、親Documentクラスからボールを​​適切にリサイクルします。ありがとうございました – user1114288

答えて

0

私は、ボールがボールを戻すときにボールをリリースする必要があります。すべてのあなたのボール(申し訳ありません)のリストではありませんが、あなたが現在使用していないボールのリストです。したがって、あなたのgetBall()関数は新しいBallを返し、STOREDBALLSから参照を削除する必要があります。これを行う最善の方法は、pop()またはshift()を使用することです。これは、配列から最後の要素を削除し、その要素の値を返します。

あなたのカウンタは間違っています(それは常に0ですか?)そうではありません。

私はこのようにそれを行うだろう。ところで

public function getBall($position:Point, $vector:Point, $gravity:int, $friction:Number):Ball { 
    if (STOREDBALLS.length) { 

     // grab ball from list + remove it 
     var ball:Ball = STOREDBALLS.pop(); 

     // reset its values 
     ball.position = $position; 
     ball.vector = $vector; 
     ball.gravity = $gravity; 
     ball.friction = $friction; 

     return ball; 
    } 

    return new Ball($position, $vector, $gravity, $friction); 
} 

。あなたがPHPの背景から来ているようです。 ActionScript 3では、誰もドル記号を使用しないため、それらを使用する必要はありません。

更新:あなたはこの機能を使用することができ、再びプールにボールをプッシュする:あなたのクラスから

public function addBall($ball:Ball):void { 
    STOREDBALLS.push($ball); 
} 

あなたがプールを使用している、あなたはremoveChild()またはaddChild()、ディスプレイの取り扱い使用する必要があります-listはプールクラスの責任ではありません。

+0

応答ありがとう!最後に1つ質問してください。あなたの新しいgetBall関数を実装しました。ボールは完全にアンロードされますが、どのようにアレイに戻しますか?私がプールからそれらを引っ張ると、私はドキュメントクラスの "ballArray"という配列にこれらのボールを格納します。 "Pool"は私の "BallPool.as"クラスのインスタンスです。私は "Pool.STOREDBALLS.push(ballArray [i]);"と呼んでみました。しかしそれはうまくいかなかった。ですから、私はボールを私がカスタムクラスにあるSTOREDBALLS配列に戻す方法を要約すると?どのようにオブジェクトをドキュメントクラスのカスタムクラスの配列にプッシュしますか? – user1114288

+0

私は答えを更新しました。 –

関連する問題