在尝试优化我的游戏后,我开始使用明显的对象池。我遵循更复杂的一个使用max_growth等,然后继续到一个简单的,但我一直遇到同样的问题。现在,在网上搜索了40多个小时,并向一个比我更了解flash的朋友寻求帮助后,我放弃了,决定来到这里。下面的代码包括一些#仅供参考,我已经在我的评论的东西,我已经尝试过,也没有工作。
My Cpool class
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
};
}
}
你可以看到这是一个简单的,只使用了get和dispose。我的代码在我的逻辑类下面,引用池。
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
}
}
}
最后是condor类中的destroy bird函数
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只秃鹰,当它们离开屏幕时,池中的跟踪计数器显示池中的秃鹰数量下降,当它达到0时,它会创建新的秃鹰。现在这个工作方式,或者当我使用destroyCondor,除非我拿出一些注释。当我在dispose condor中删除//tr时,它为前2个秃鹰工作,计数器变为9,然后再次变为9,然后变为10并保持在10,问题是它停止在屏幕上显示更多,没有错误,但它停止工作。顺便说一句,我也试过trace (pool.length),但我一直得到10的方式。
我也试过#1和# 2,但没有效果。我最接近的是#10,池中的unshift语句。这看起来是可行的,计数器下降到9,当它们离开屏幕时回到10就像它把它们放回池子里一样但是当10过了它们就完全停止了,甚至绕过了new condor语句。正如你从评论中看到的,我真的尝试了我能想到的所有方法,甚至从更高级的池化到这个简化版本,但仍然一无所获。现在已经超过40个小时了,我一直熬夜到凌晨4点,因为我对无法解决这个问题感到非常沮丧,我甚至还没有完成位图缓存。有人能帮忙吗?
如果你需要在遍历数组的同时改变它,请反向遍历。
for (var i:int=birdArray.length-1;i>=0;i--) {...}
这消除了空指针的麻烦、丢失元素(如果您也遇到这种情况)和对临时数组的需要。