一个菜鸟错误:3

时间:2014-04-18 18:05:23

标签: actionscript-3

提供的DisplayObject必须是调用者的子级。

什么是基本错误?我已经解决了很多这些问题,但也许我只是在想这个......不管怎么说......

我有一个基于perlin噪音和位图绘制地图的游戏,很好地绘制整个地图并移动地图的每个平铺都是不切实际且不聪明的。因此,将其设置为绘制地图的一部分,当您按下箭头键时,它会删除切片并使用所需的新瓷砖阵列重新绘制它们。但 当我从第一组地图移动到下一组时,它会删除这些图块并重新绘制它们,但是当我尝试移动到地图的另一部分时它给我提供的显示对象必须是调用者的子项。我得到了错误,它说它的删除必须在它的删除内(我认为)。但我不确定为什么它第一次工作但不是下一次?我的猜测是它与添加了瓷砖的worldTiles精灵有关。但我不知道如何解决它

如果你将地图宽度设置为1600,然后按下右键一次,它将绘制下一个区域图块,但你不能去其他任何地方而不会出现错误 http://www.fastswf.com/xl3LXbg

在级别类上,它是在时间轴上到达某个帧时运行的类。 Aka是一个连接到屏幕上的MovieClip的类。在该类中,我创建了一个新的World.class对象

    world = new World(this);

这只是将worldTiles精灵创建到关卡类上,并在第一次运行类时运行第一个生成平铺

public function World(parentMC:MovieClip)
    {
        worldTiles = new Sprite();
        parentMC.addChild(worldTiles);
        generateTile();
            }

这是设置drawRect的X和Y以及它绘制瓷砖的数组的X和Y.

    if (k.keyCode == Keyboard.RIGHT)
    {
        world.deleteTiles();
        world.X += 800/world.TILE_SIZE;
        world.generateTile();
        X += 800/MAP_SCALE;
    }
    if (k.keyCode == Keyboard.LEFT)
    {
        world.deleteTiles();
        world.X -= 800/world.TILE_SIZE;//the actual X width of the tiles being drawn
        world.generateTile();
        X -= 800/MAP_SCALE;//drawRect
    }

这就是我用来删除屏幕上的图块的方法。

public function deleteTiles()
{
    if (tilesInWorld.length > 0)
    {
        for (var i:int = 0; i < tilesInWorld.length; i++)
        {
            worldTiles.removeChild(tilesInWorld[i]);
        }
    }
}

然后当瓷砖重新添加时,它会运行generateTiles()函数,即此

public function generateTile()
    {
        for (var i=X; i < X+80 i++) //using 80,60 cause thats the screen width / 10, which is default tile size
        {
            for (var j=Y+60; j < grid_height; j++)
            {
                hm = heightmap[i][j];
                if (hm >= 0.84)
                {
                    tile = new Water();
                }
                else if (hm >= 0.8 && hm < 0.84)
                {
                    tile = new Shallow();
                }
                else if (hm >= 0.7 && hm < 0.8)
                {
                    tile = new Sand();
                }
                else if (hm >= 0.2 && hm < 0.7)
                {
                    tile = new Tile();
                }
                else
                {
                    tile = new Stone();
                }
                tile.width = TILE_SIZE;
                tile.height = TILE_SIZE;
                worldTiles.x = 0;
                worldTiles.y = 0;
                tile.x = TILE_SIZE * (i % grid_width);
                tile.y = TILE_SIZE * (j % grid_height);
                tilesInWorld.push(tile);
                worldTiles.addChild(tile);
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您永远不会从tilesInWorld数组中移除图块,因此第二次调用deleteTiles时,它会尝试删除已删除的图块。尝试这样的事情:

public function deleteTiles()
{
    while (tilesInWorld.length > 0)
    {
        // this will remove the tile from the array, then remove it from the display list
        worldTiles.removeChild(tilesInWorld.pop());
    }
}