我正在使用锯齿状数组来保存我正在制作的游戏中的地图段(集群)。数组中的位置对应于集群在地图中的位置。此外,如果内部数组(锯齿状部分)不再加载任何集群(集群在未使用的超时后从数组中删除),则外部数组的元素设置回 null 以保持地图的内存使用向下。
当游戏试图从地图中获取集群时,问题似乎是随机出现的:
public Cluster getCluster(int xIndex, int yIndex)
{
lock (xAxis)
{
loadCluster(xIndex, yIndex);
return xAxis[xIndex][yIndex];
}
}
public void loadCluster(int xIndex, int yIndex)
{
lock (xAxis)
{
if (xAxis[xIndex] == null)
xAxis[xIndex] = new Cluster[(int)worldSize.Y];
if (xAxis[xIndex][yIndex] == null)
xAxis[xIndex][yIndex] = new Cluster(this, new Vector2(xIndex * 256, yIndex * 256), worldLoader.loadClusterData(xIndex, yIndex));
}
}
该loadCluster(int, int)
方法应确保在该方法检索集群之前将其加载到数组中getCluster(int, int)
,并且几乎始终如此,但有时会loadCluster(int, int)
以某种方式无法添加集群。
它似乎不会发生在任何特定的集群中,但总是在未添加内部数组时发生(但是,大多数情况下它创建的内部数组完全没有问题)。loadCluster(int, int)
此外,当 Visual Studio 捕获随后的空指针异常时,退后一步并始终(至少到目前为止)重新调用正常工作。loadCluster(int, int)
在方法中添加额外的调用getCluster(int, int)
也大大降低了这个错误的频率。
老实说,我不知道是什么导致这个相当简单的功能不起作用,甚至看起来是随机的。任何帮助将非常感激
编辑:编辑 xAxis[][] 的其他代码
public override void Update(GameTime gameTime)
{
for (int x = 0; x < worldSize.X; x++)
{
if (xAxis[x] == null) continue;
int loaded = 0;
for (int y = 0; y < worldSize.Y; y++)
{
if (xAxis[x][y] == null)
{
continue;
}
xAxis[x][y].Update(gameTime);
if (xAxis[x][y].clusterLoaded)
{
loaded++;
}
else if (xAxis[x][y].clusterTimer == 0)
{
xAxis[x][y] = null;
}
}
if(loaded == 0) xAxis[x] = null;
}
}
Cluster.clusterLoaded
是一个布尔值,显示集群当前是否正在使用。
Cluster.clusterTimer
是一个倒计时的 int,一旦clusterLoaded
变为 false。如果clusterLoaded
再次变为真,则将其重置为最大值。每次Cluster.Update(GameTime)
运行时减1,而clusterLoaded
为假。
loaded
用于统计当前内部数组加载了多少个Cluster。