我一直在寻找一种方法来处理这个问题几个小时,但一无所获。在我的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的任何解决方案?
答案 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