2011-12-28 70 views
0

我在設置我的對象池時遇到問題。我創建了一個「BallPoll」自定義類來處理池化邏輯。我首先調用fillPool()將20個Ball對象添加到我的數組中。然後在我的文檔類中,當我想創建一個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 2011-12-28 23:45:10

+0

getBall函數不起作用。我無法弄清楚如何通過STOREDBALLS數組循環,並確定哪些球在舞臺上,哪些不在舞臺上。此外,正確地從父文檔類中回收球。謝謝 – user1114288 2011-12-29 04:57:45

回答

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

BTW;它看起來像來自PHP背景。在ActionScript 3中,沒有人使用美元符號,您不需要使用它們。

更新:要再次將球推入池,你可以使用此功能:

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

從你的類,你正在使用的游泳池,你應該使用removeChild()addChild(),顯示的處理-list不是游泳池類的責任。

+0

謝謝你的迴應!請最後一個問題。我已經實現了你的新的getBall函數。球完美卸載,但如何將它們發回陣列。當我將它們從池中拉出來時,我將這些球存儲在我的文檔類中的一個名爲「ballArray」的數組中。 「Pool」是我的「BallPool.as」類的實例。我嘗試調用「Pool.STOREDBALLS.push(ballArray [i]);」但它不起作用。所以總結一下,我怎樣才能將我完成的球送回到自定義類中的STOREDBALLS數組中?如何將對象從文檔類中的自定義類中推送到數組? – user1114288 2011-12-29 17:50:34

+0

我已經更新了答案,希望有所幫助。 – 2011-12-30 09:27:33