基于as3游戏清除瓷砖中的瓷砖

时间:2015-03-30 18:23:30

标签: actionscript-3

我一直在寻找一种方法来处理这个问题几个小时,但一无所获。在我的BuildMap函数中,我使用实例名称单元格实例化新的MovieClips(Tile)。他们的框架基于我的2D阵列(protoMap)。问题是单元格在函数中被实例化。我不知道如何在它之外访问它们。我想删除孩子(单元格),但我知道如何在它被实例化的函数中的唯一方法。

 public function BuildMap()
{
    for (var i:int=0; i < mapHeight; i++)
    {
        for (var u:int=0; u < mapWidth; u++)
        {
            var cell:MovieClip = new Tile();
            cell.gotoAndStop(protoMap[i][u]+1);
            cell.x = tileSide*u;
            cell.y = tileSide*i;
            addChild(cell);

            var currCellLabel:String = cell.currentFrameLabel;
            mapLabels[i].push(currCellLabel);
        }
    }
}

我想要一个名为ClearMap()的函数,它再次循环并执行removeChild(cell)。我想过做一个clearTiles:Boolean和在BuildMap()中做

if(clearTiles == false)
{
build the map;
}else{loop again and removeChild(cell)}

但那不起作用......所以我尝试将单元格作为参数传递给BuildMap()但是当我试图删除它时,它不是调用者的对象......或类似的东西。我也想把细胞放到自己的阵列中,但我不想浪费不必要的记忆。 noob的任何解决方案?

1 个答案:

答案 0 :(得分:0)

创建一个类而不是使用函数。

课程的重点是孤立关注点。 在您的情况下,您想要处理所有这些瓷砖。 (根据protoMap创建它们并能够将它们全部删除。

扩展DisplayObjectContainer,例如Sprite,可以将所有图块添加到地图对象中,然后就可以轻松添加和删除地图。

您的BuildMap函数成为构造函数。

这是一些非工作伪代码,用于说明这个想法:

package
{
    public class Map extends Sprite 
    {
        public function Map (data, width, height)
        {
            for (var i:int=0; i < height; i++)
            {
                for (var u:int=0; u < width; u++)
                {
                    var cell:MovieClip = new Tile();
                    cell.gotoAndStop(data[i][u]+1);
                    cell.x = tileSide*u;
                    cell.y = tileSide*i;
                    addChild(cell);

                    var currCellLabel:String = cell.currentFrameLabel;
                    mapLabels[i].push(currCellLabel);
                }
            }
        }

        public function clear():void
        {
            removeChildren();
        }
    }
}

整个地图都包含在该类中。你必须添加标签,但你没有指明它们是什么或它们做了什么,所以我把它们排除了。

您可以像这样使用它:

var awesomeMap:Map = new Map(protoMap, mapWidth, mapHeight);
addChild(awesomeMap);
//later
awesomeMap.clear();
//or
removeChild(awesomeMap);

我想指出用这种方式用MovieClips构建瓷砖地图是个坏主意。 MovieClips表现很糟糕,因为它们带有时间线的开销。 移除所有孩子也非常浪费。

因此,如果您遇到性能问题,请尝试重用对象和/或采用名为“blitting”的技术 请参阅此文章:http://www.adobe.com/devnet/flash/articles/blitting_mc.html