Actionscript 3 在基于瓷砖的as3游戏中清除瓷砖

Actionscript 3 在基于瓷砖的as3游戏中清除瓷砖,actionscript-3,Actionscript 3,我已经找了几个小时的方法来处理这个问题,但什么也没找到。在BuildMap函数中,我用实例名cell实例化了新的MovieClips互动程序。他们的框架基于我的2d阵列原型图。问题是这些单元格在函数中被实例化。我不知道如何在它之外访问它们。我想移除ChildCell,但我知道的唯一方法是在实例化它的函数中 public function BuildMap() { for (var i:int=0; i < mapHeight; i++) { for (va

我已经找了几个小时的方法来处理这个问题,但什么也没找到。在BuildMap函数中,我用实例名cell实例化了新的MovieClips互动程序。他们的框架基于我的2d阵列原型图。问题是这些单元格在函数中被实例化。我不知道如何在它之外访问它们。我想移除ChildCell,但我知道的唯一方法是在实例化它的函数中

 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);
        }
    }
}

但那没用。。。所以我试图将该单元格作为参数传递给BuildMap,但当我试图删除它时,它不是调用方的对象。。。或者类似的。我还想把这个单元放到它自己的数组中,但我不想不必要地浪费内存。noob的任何解决方案?

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

类的要点是隔离关注点。 在您的情况下,您需要处理所有这些瓷砖。根据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();
        }
    }
}
我想指出,以这种方式使用MovieClips构建平铺地图是个坏主意。电影唇对于表演来说是可怕的,因为它们承载着时间线的开销。 把所有的孩子都带走也是非常浪费的

因此,如果您有性能问题,请尝试重用对象和/或采用称为blitting的技术
看这篇文章:

好吧,你太棒了。不过,试图修改多个文件以适应这些变化确实很可怕。我知道使用MovieClips并不是最好的方式,但我对所有这些都很陌生,这似乎是最简单的方式。我在某个地方读到,对于游戏来说,最好是尽快拿出一个概念证明,然后再进行优化。它一直在为我工作,因为在我做任何事情之前试图想出最好的方法只会让我不知所措,而且我从来没有做过任何事情。我想我会将我的地图移动到xml,然后开始尝试bitmapData。谢谢。您当然不想应用过早的优化,但也不想写垃圾。如果什么都不做是一个问题,不要从这样的游戏开始,它只是一个太大的项目。从许多小事情开始,比如创建地图和地图。将地图数据序列化为的格式应该无关紧要,请考虑是否值得添加另一种格式。。。。哦,如果你觉得有用的话,你可以点击这个小勾。如果它没有用,请指定仍然不清楚的内容=非常清楚。我真的很感激。我仍然习惯于使用多个类和参数。所以我会把这件事存档,等我舒服一点的时候再说。现在,我要谈点别的。再次感谢!我在另一个项目中使用了这个。地图创建程序。现在我有另一个问题。我希望能够单击一个平铺,将框架图像加载到HeldFile框中,显示其当前框架标签,等等。如何从其他功能访问和更改单元格移动剪辑?好的。。。从movieclip创建一个对象,其中包含heldfile对象所需的所有数据,并将其推送到新数组heldTileData。知道了。所以,我还有一个问题。。。我一直在玩bitmapData,我让它只使用每帧的bitmapData构建地图。我只实例化一个movieclip,并根据mapArray生成的帧创建多个对象。这很难说。如果你明白。。。这样会更好吗?
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);