有没有人知道为什么我处理一个物体后我的对象池不起作用?

时间:2013-03-01 11:59:41

标签: actionscript-3 flash pool

在尝试优化游戏后,我开始使用明显的对象池。我使用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点因为我无法解决这个问题而感到非常沮丧,我还没有完成位图缓存。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

如果需要在遍历数组时更改数组,请执行向后遍历。

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

这消除了空指针的麻烦,遗漏的元素(如果你也遇到这个)以及需要临时数组。