2013-03-01 16 views
0

嘗試優化我的遊戲後,我開始使用明顯的對象池。我跟着更復雜的使用max_growth等,然後繼續一個簡單的,但我一直在碰到同樣的問題。現在,經過40多個小時的在線搜索,並向一位知道我比我更多的朋友提供幫助,我已經放棄並決定來到這裏。下面的代碼包含一些#僅供參考,我留在了我嘗試過的評論內容中,並且還沒有工作。有沒有人知道爲什麼我的對象池在處理對象後不起作用?

我CPOOL類

package { 
    import flash.display.DisplayObject; 

    public class CPool 
    { 
     public var counter:int; 
     private var pool:Array; 

     //public function CPool(type:class, len:int) 
     public function CPool() 
     { 
      pool = new Array(); 
      counter = 10; 
      //counter=len; 

      //var i:int=len; 
      var i:int = 10; 
      while (--i > -1) 
       //pool[i] = new type(); 
       pool[i] = new Condor(); 
     }; 

     public function getCondor():Condor 
     { 
      trace(counter); 
      //trace (pool.length); 
      if (counter > 0) 
      { 
       return pool[--counter]; 
      } 
      else 
      { 
       var cde = new Condor(); 
       return cde; 
       } 
     }; 


     public function disposeCondor(disposedCondor:Condor):void { 

      pool[counter++] = disposedCondor; 
    //pool.unshift(disposedCondor);  #10 
     }; 
    } 
} 

你可以看到它是一個簡單的,只是使用了獲取和處理。我的邏輯類下面的代碼是指池。

public var cpool:CPool; 

cpool = new CPool(); //(in the constructor) 

else if (whichBird ==12) 
{ 
    bird = cpool.getCondor() as Condor; 
} // (in the addBird section) 


private function checkBirdsOnScreen():void 
{ 
    for (var i:int = 0; i < birdArray.length; i++) 
    { 
     var dg = birdArray[i]; 
     if (birdArray[i].x < -100) 
     { 
      dg.parent.removeChild(dg); 
      birdArray.splice(i, 1); 
      //hc.destroyCondor();    #9 
      //tr cpool.disposeCondor(dg);  #1 
      //birdArray[i].destroyCondor();  #2 
     } 
    } 
} 

最後我破壞鳥的功能在禿鷹類

public function destroyCondor():void 
{ 
    //removeChild(oldCondor); #5   
    //ConPool.disposeCondor(oldCondor); #4 
    //this.x=390 #3 
//ConPool.disposeCondor(this); 
    parent.removeChild(this); //remove object from stage 
    removeEventListener(Event.ENTER_FRAME, CondorLoop); 
} 

正如你可以看到我已經想盡辦法,我能想到的得到這個工作。現在的代碼以池中的10個con開始,當它們離開屏幕時,池中的跟蹤計數器顯示池停止運行,當它達到0時,它會創建新的con。現在這個工作方式,或者當我使用destroyCondor,除非我採取一些評論。當我刪除處理神鷹中的// tr時,它對前兩個禿鷹起作用,計數器變爲9,然後再次變爲9,然後變爲10,並停留在10,問題是它不再在屏幕上再放置任何錯誤,但它停止工作。順便說一句,我也試過跟蹤(pool.length),但我一直得到10s一路下降。

我也試過#1和2沒有效果。我來的最接近的是#10,這是泳池中的不變聲明。這實際上看起來就像是有效的,櫃檯下降到9,當它們離開屏幕時,它們回到了10,當它們把它們放回池中時,但是當10個已經過去時,它們完全停止,甚至繞過新的神鷹聲明。從評論中可以看出,我真的已經嘗試過所有我能想到的事情,即使是從更高級的池中轉到這個簡化版本,仍然無處可尋。現在超過40小時,直到凌晨4點,因爲我無法解決這個問題而感到沮喪,我甚至還沒有完成位圖緩存。任何人都可以幫忙嗎?

回答

0

如果您需要在遍歷陣列時更改該陣列,請執行向後遍歷。

for (var i:int=birdArray.length-1;i>=0;i--) {...} 

這消除了空指針麻煩,錯過的元素(如果你也遇到這個)以及需要臨時數組。

+0

試過這個,仍然得到相同的問題,從10,9,9,10,10下降,所以它看起來像它的工作,但它仍然停止將它們放在屏幕上,謝謝答覆雖然 – user1939771 2013-03-01 12:47:33

+0

看來你的游泳池不是爲了重新使用condors而創建的,但是你在'disposeCondor()'中加入它們,並且增加計數器。這使得下一次調用'getCondor()'來接收一個已經處置的神鷹,這看起來是違反遊戲邏輯的。你應該重新檢查你的邏輯池是如何運作的。 – Vesper 2013-03-01 12:51:49

+0

我以爲通過使用處置神鷹我把它放回池中,以便它可以重新使用。我同意這看起來好像它不能稱之爲被遺棄的禿鷹。儘管我認爲游泳池的邏輯是合理的。我實際上從gotoandlearn視頻中獲得了它,但即使如此,我還是使用了另一個旨在用於不同類別的絕對重複使用的設備,但它仍然不適用於我的遊戲。你可以看到池碼中有任何東西會阻止它重新使用舊的禿鷹。 – user1939771 2013-03-01 12:57:45

相關問題