让我切入主要问题,我有一个50乘50的网格。我需要一种方法,为网格中的每个单元格设置一个真或假变量,默认值为false,每次方法被调用。
我需要这个阵列,所以我可以看到我访问了哪些单元格,所以我不需要重新访问它们来查找我正在研究的路径查找系统。
但是目前我有一个双数组[] [],我每次使用这个方法时都需要循环。 (每秒最多3次,但绝大多数情况下从不),这意味着循环2500值。哪个听起来不太好。什么是最好的解决方案,这是最好的解决方案还是我错过了一些愚蠢的东西。
希望你能帮忙并指出我正确的方向。
答案 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类,它将包含所有必要的值,最典型的是:
您可以为应用添加任意数量的内容。
然后我有一个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;
访问一行中的图块我在本例中使用了向量,因为它们的性能优于Arrays,并且您保持存储对象的类型不变。
Flash在数组中循环不是问题;如果你想要提高性能,break
循环如果你已经完成了你想要的所有东西,continue
循环,如果磁贴不符合要求而你不需要处理它。
此外,拥有2d阵列可以提高性能,因为您只能处理所需阵列的区域。
还有一个建议是不要害怕使X更小的数组来存储来自更大阵列的一些数据并循环通过小数组。由于数组的数据不是原始数据(int,uint等)而是类,它将保存对象的指针/引用,因此您实际上并不是每次都复制对象。