As3关于阵列的最佳解决方案

时间:2014-04-16 23:13:28

标签: arrays actionscript-3

让我切入主要问题,我有一个50乘50的网格。我需要一种方法,为网格中的每个单元格设置一个真或假变量,默认值为false,每次方法被调用。

我需要这个阵列,所以我可以看到我访问了哪些单元格,所以我不需要重新访问它们来查找我正在研究的路径查找系统。

但是目前我有一个双数组[] [],我每次使用这个方法时都需要循环。 (每秒最多3次,但绝大多数情况下从不),这意味着循环2500值。哪个听起来不太好。什么是最好的解决方案,这是最好的解决方案还是我错过了一些愚蠢的东西。

希望你能帮忙并指出我正确的方向。

2 个答案:

答案 0 :(得分:2)

另一种可能的改进是使用一维矢量,可能包含在一个类中,它将包含2500个元素,其索引意味着(宽度* 50 +高度)。像这样:

private var _visited:Vector.<Boolean>;
function checkVisited(x:int,y:int):Boolean {
    return _visited(x*50+y); // x and y are in 0-49 range
}

如果你需要它们,矢量可以是二维的,你可以像这样声明矢量矢量:

var _visited:Vector.<Vector.<Boolean>>;

通过按下填充的Vector.<Boolean>进行初始化,然后像使用普通数组一样更改元素。

向量的主要优点是它们是实心的,也就是说,如果向量中有50个元素,则可以确定在0到49之间的任何索引处都存在值(即使为null,或者为NaN)对于向量的内部处理,这也使得向量的内部处理更容易,因为Flash引擎可以通过仅使用索引和向量的链接来计算适当的内存位置,这比首先引用数组关于是否存在值的速度更快index,如果是,则获取其内存位置,然后引用。

答案 1 :(得分:1)

根据我使用不同网格制作基于图块的游戏的经验,我通常会有一个Tile类,它将包含所有必要的值,最典型的是:

  • POSX:INT
  • POSY:INT
  • 器isChecked:布尔

您可以为应用添加任意数量的内容。

然后我有一个Grid类,它将创建你的网格,并有一些有用的方法,比如给出邻居区块。

在Grid类中,我以这种方式制作网格:

public var tileLineArray:Vector.<Tile>;
public var tile2dArray:Vector.<Vector.<Tile>>;

public function makeGrid(w:int, h:int):void
{
    tileLineArray = new Vector.<Tile>();
    tile2dArray = new Vector.<Vector.<Tile>>();

    for (var i:int = 0; i < gridWidth; i++)
    {
        var rowArray:Vector.<Tile> = new Vector.<Tile>();
        for (var j:int = 0; j < gridHeight; j++)
        {
            var t:Tile = new Tile();
            t.posX = i;
            t.posY = j;
            tileLineArray.push(t);
            rowArray.push(t);
        }
        tile2dArray.push(rowArray);
    }
}

它会给你的是你可以通过坐标x,y;

访问一行中的图块
  • var myTile:Tile = tileLineArray [lineID];
  • var myTile:Tile = tile2dArray [targetX] [targetY];

我在本例中使用了向量,因为它们的性能优于Arrays,并且您保持存储对象的类型不变。

Flash在数组中循环不是问题;如果你想要提高性能,break循环如果你已经完成了你想要的所有东西,continue循环,如果磁贴不符合要求而你不需要处理它。

此外,拥有2d阵列可以提高性能,因为您只能处理所需阵列的区域。

还有一个建议是不要害怕使X更小的数组来存储来自更大阵列的一些数据并循环通过小数组。由于数组的数据不是原始数据(int,uint等)而是类,它将保存对象的指针/引用,因此您实际上并不是每次都复制对象。