在AS3中为2D平台生成新级别的问题

时间:2012-11-25 05:41:00

标签: arrays actionscript-3 levels

我正在Flash中为一个项目制作2D平台游戏,一切都在游动!直到我意识到赋值使用2个级别,并且我完成级别的唯一方法是将它们添加为类,而此项目使用数组时,这很简单。

我开始使用URLLoader来填充.txt文件中的级别,但即便如此,我一直关注的示例代码仅显示如何在一个级别执行此操作,而不是2 +。

这是我用于地图的代码,如果这还不够,我可以提供更多:

    public function init()
    {
        trace("init");

        map = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, 0, 0, 0],
                [0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 0, 0, 0, 0],
                [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                [0, 1, 1, 1, 0, 2, 2, 0, 1, 1, 1, 1, 0, 2, 2, 0, 1, 1, 1, 0],
                [0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0],
                [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                [0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0]]

                container = new Sprite();
                addChild(container);
                tileArray = [Tile0, Tile1, Tile2];
                buildMap();
                createPlayer();
                createWinSpace();
                ArrowKeyInput.init(stage);
                addEventListener(Event.ENTER_FRAME, update);
    }
    private function buildMap():void
    {
        trace("BUILD");
        tileMap = [];
        for (var i:int = 0; i < map.length; i++) 
        {
            var row:Array = map[i];
            var tileRow:Array = [];
            tileMap.push(tileRow);
            for (var j:int = 0; j < row.length; j++) 
            {
                var tileNum:int = row[j];
                var className:Class = tileArray[tileNum];
                var tile:MovieClip = new className();
                tile.width = tile.height = TILE_SIZE;
                tile.x = TILE_SIZE * j;
                tile.y = TILE_SIZE * i;
                container.addChild(tile);
                tileRow.push(tile);
            }
        }
    }

我很感激我能得到的任何反馈。

1 个答案:

答案 0 :(得分:0)

如果我正确理解你,你想知道如何使你的buildMap功能能够构建多个地图。

要理解这个问题,重要的是map数组是buildMap函数用来构建关卡的数据。因此,地图数组中的任何内容都定义了将在该级别上为每个位置使用的切片。因此,如果您想拥有多个级别,您可以定义多个映射,每个映射都有自己的数组:

    map_1 = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, 0, 0, 0],
            [0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 0, 0, 0, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 1, 1, 1, 0, 2, 2, 0, 1, 1, 1, 1, 0, 2, 2, 0, 1, 1, 1, 0],
            [0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0]];

    map_2 = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 2, 2, 2, 0, 0, 0, 0],
            [0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 2, 2, 2, 0, 0, 0, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 1, 1, 1, 0, 2, 2, 0, 1, 1, 1, 1, 0, 2, 2, 0, 1, 1, 1, 0],
            [0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0],
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            [0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0]];

这些是您的地图定义,您可以拥有任意数量的地图定义。我刚刚复制了第二张地图的数据,但你可以在该定义中创建一个新的等级。

现在,在调用buildMap()函数之前,只需将map的值设置为您希望构建的任何级别:

map = map_1;
buildMap();

map = map_2;
buildMap();

现在,您还有其他需要考虑的事情,就像您从map_1开始,然后想要构建map_2,您需要删除用于构建map_1的切片。

从我在代码中可以看出,它们都被添加到容器精灵中。所以你可以做的是通过在buildMap()函数的开头添加这样的东西来删除所有这些图块:

while (container.numChildren > 0)
{
    container.removeChildAt(0);
}

在加载新级别时,很可能还需要重置其他变量,但这只是一个可以管理的方法的示例,通过查看代码我知道的很少