actionscript 3 - 有谁知道为什么我的对象池在我释放一个对象后不起作用?



在尝试优化我的游戏后,我开始使用明显的对象池。我遵循更复杂的一个使用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--) {...}

这消除了空指针的麻烦、丢失元素(如果您也遇到这种情况)和对临时数组的需要。

最新更新