Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 对象池未正确返回对象_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 对象池未正确返回对象

Actionscript 3 对象池未正确返回对象,actionscript-3,flash,Actionscript 3,Flash,Iv使用对象池设置程序生成的游戏。第一个区域始终加载良好,有时下一个区域或第二个区域也会加载良好。然后它会崩溃,我编码要抛出的错误被抛出,告诉我池中没有足够的对象,这很奇怪,因为它应该在尝试加载下一个区域之前返回它使用的所有对象 一个链接到游戏,看看它在做什么 我甚至在我的sprite pool类中添加了一个countSprites函数来返回计数器所在的位置,然后让generateTile函数等待直到池返回到192,但它似乎仍然不起作用:/ 在做了一系列跟踪和if测试后,iv得出结论,它返回的

Iv使用对象池设置程序生成的游戏。第一个区域始终加载良好,有时下一个区域或第二个区域也会加载良好。然后它会崩溃,我编码要抛出的错误被抛出,告诉我池中没有足够的对象,这很奇怪,因为它应该在尝试加载下一个区域之前返回它使用的所有对象

一个链接到游戏,看看它在做什么

我甚至在我的sprite pool类中添加了一个countSprites函数来返回计数器所在的位置,然后让generateTile函数等待直到池返回到192,但它似乎仍然不起作用:/

在做了一系列跟踪和if测试后,iv得出结论,它返回的对象很好,问题是它实际上绘制了从地图开始到现在的im区域的所有内容

这是在屏幕上生成我的平铺的功能

    public function generateTile()
    {
        for (var i:int = X/GlobalCode.MAP_SCALE; i < (X + (800/TILE_SIZE)/GlobalCode.MAP_SCALE); i++)
        {
            for (var j:int = Y/GlobalCode.MAP_SCALE; j < Y + (600/TILE_SIZE)/GlobalCode.MAP_SCALE; j++)
            {
                hm = heightmap[i][j];
                if (hm >= 0.84)
                {
                    tile = waterPool.getSprite(); //this is where the tiles are taken from the sprite pool
                }
                else if (hm >= 0.8 && hm < 0.84)
                {
                    tile = shallowPool.getSprite();//this is where the tiles are taken from the sprite pool
                }
                else if (hm >= 0.7 && hm < 0.8)
                {
                    tile = sandPool.getSprite();//this is where the tiles are taken from the sprite pool
                }
                else if (hm >= 0.2 && hm < 0.7)
                {
                    tile = tilePool.getSprite();
                }
                else
                {
                    tile = stonePool.getSprite();//this is where the tiles are taken from the sprite pool
                }
                tile.width = TILE_SIZE;
                tile.height = TILE_SIZE;
                worldTiles.x = 0;
                worldTiles.y = 0;
                tile.x = TILE_SIZE * (i % 800);
                tile.y = TILE_SIZE * (j % 600);
                tilesInWorld.push(tile);
                worldTiles.addChild(tile);
            }
        }
    }
这是首先创建对象池的地方

        tilePool = new SpritePool(Tile, 192);
        sandPool = new SpritePool(Sand, 192);
        shallowPool = new SpritePool(Shallow, 192);
        waterPool = new SpritePool(Water, 192);
        stonePool = new SpritePool(Stone, 192);
我不认为这有什么意义,但以防这是我的SpritePool类

  package  {
    import flash.display.MovieClip;

    public class SpritePool {

    private var pool:Array;
    private var counter:int;

    public function SpritePool(type:Class, len:int) {
        pool = new Array();
        counter = len;

        var i:int = len;
        while(--i > -1){
            pool[i] = new type();
        }
    }

    public function getSprite():MovieClip
    {
        if(counter > 0){
            return pool[--counter];
        }
        else{
            throw new Error("You exhausted the pool!");
        }
    }
    public function returnSprite(s:MovieClip):void
    {
        pool[counter++] = s;
    }

    public function countSprites():int
    {
        return counter;
    }

}

}
改变


如果您没有提供完整的代码,那么很难得到错误。现在还不清楚delete调用的位置以及映射是如何生成的——您已经提供了函数,但它不是从何处执行的。你不能简单地问出问题所在——问题在于你和你的代码设计。我们无法读取您的所有代码并找到错误-这取决于您。在添加和删除内容时进行一些跟踪。始终检查剩余精灵的数量。如果它用完了,你就不会返回它们。看,我真的一点都不懂:对于var I:int=X/GlobalCode.MAP\u SCALE;i package { import flash.display.MovieClip; public class SpritePool { private var pool:Array; private var counter:int; public function SpritePool(type:Class, len:int) { pool = new Array(); counter = len; var i:int = len; while(--i > -1){ pool[i] = new type(); } } public function getSprite():MovieClip { if(counter > 0){ return pool[--counter]; } else{ throw new Error("You exhausted the pool!"); } } public function returnSprite(s:MovieClip):void { pool[counter++] = s; } public function countSprites():int { return counter; } } }
    for (var i:int = X/GlobalCode.MAP_SCALE; i < (X + (800/TILE_SIZE)/GlobalCode.MAP_SCALE); i++)
    {
        for (var j:int = Y/GlobalCode.MAP_SCALE; j < Y + (600/TILE_SIZE)/GlobalCode.MAP_SCALE; j++)
        {
var Xcalc = (X + (800/TILE_SIZE)/GlobalCode.MAP_SCALE);
var Ycalc = (Y + (600/TILE_SIZE)/GlobalCode.MAP_SCALE);

    for (var i:int = X; i < Xcalc; i++)
    {
        for (var j:int = Y; j < Ycalc; j++)
        {