在尝试优化游戏后,我开始使用明显的对象池。我使用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
};
}
}
你可以看到它只是一个简单的使用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
}
}
}
最后我在秃鹰类中消灭鸟类功能
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时,除非我发表一些评论。当我删除处理秃鹰中的// tr然后它适用于前2个秃鹰,计数器转到9,然后9再次转到10然后保持10,问题是它停止再放在屏幕上,没有错误但是它停止工作。顺便说一句,我也尝试过trace(pool.length),但我一直都在不断下降。
我也试过#1和2没有效果。我最接近的是#10,池中的非移位声明。这实际上看起来像是有效的,计数器降到9,当它们离开屏幕时又回到10,就像它将它们放回池中一样,但是当它们已经过去时它们就完全停止了,甚至绕过了新的秃鹰声明。正如你从评论中看到的那样,我真的已经尝试了所有我能想到的东西,甚至从更高级的池到这个简化版本仍然无处可去。现在超过40小时,熬夜到凌晨4点因为我无法解决这个问题而感到非常沮丧,我还没有完成位图缓存。有人可以帮忙吗?
答案 0 :(得分:0)
如果需要在遍历数组时更改数组,请执行向后遍历。
for (var i:int=birdArray.length-1;i>=0;i--) {...}
这消除了空指针的麻烦,遗漏的元素(如果你也遇到这个)以及需要临时数组。