嘗試優化我的遊戲後,我開始使用明顯的對象池。我跟着更復雜的使用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點,因爲我無法解決這個問題而感到沮喪,我甚至還沒有完成位圖緩存。任何人都可以幫忙嗎?
試過這個,仍然得到相同的問題,從10,9,9,10,10下降,所以它看起來像它的工作,但它仍然停止將它們放在屏幕上,謝謝答覆雖然 – user1939771 2013-03-01 12:47:33
看來你的游泳池不是爲了重新使用condors而創建的,但是你在'disposeCondor()'中加入它們,並且增加計數器。這使得下一次調用'getCondor()'來接收一個已經處置的神鷹,這看起來是違反遊戲邏輯的。你應該重新檢查你的邏輯池是如何運作的。 – Vesper 2013-03-01 12:51:49
我以爲通過使用處置神鷹我把它放回池中,以便它可以重新使用。我同意這看起來好像它不能稱之爲被遺棄的禿鷹。儘管我認爲游泳池的邏輯是合理的。我實際上從gotoandlearn視頻中獲得了它,但即使如此,我還是使用了另一個旨在用於不同類別的絕對重複使用的設備,但它仍然不適用於我的遊戲。你可以看到池碼中有任何東西會阻止它重新使用舊的禿鷹。 – user1939771 2013-03-01 12:57:45