0

在我的 2D Tiled 游戏中,我遇到了一个问题,当我在另一个内部的 for 循环中从 2D 数组中更新所有对象时(在 2D 数组中从左上角到右下角逐行循环(如下面的代码)) , 如果程序在索引 (5,6) 处循环并且它需要来自自身下的对象的数据,它将使用他在循环处 (5,5) 时执行的新数据,但我想使用双 for 循环开始之前的所有数据...

一个基本的例子:

int[][] map = new int[10][10];

for(int x = 0; x < 10; x++)
{
    for(int y = 0; y < 10; y++)
    {

        update(x, y, map);
    }
}

// I remember you that it is an example
void update(int x, int y, int[][] m)
{
    m[x][y] = 0
    if(y > 9) { return; }
    m[x][y + 1] = 1
}

它会立即将数据“1”放在(x,10)处,而不考虑它会产生错误......(ArrayOutOfBoundsException......)

当他还没有开始双循环时,我怎样才能让它使用数组的数据?


我知道它会生成 ArrayOutOfBoundExecption,并且如果我可以像我在这里完成的那样更正它


int Water = 1;
int Air = 0;
int[][] map = new int[20][20];

void update()
{   
    for(int x = 0; x < 10; x++)
    {
        for(int y = 0; y < 10; y++)
        {
            tick(x, y, map);
        }
    }
}

void tick(int x, int y, int[][] m)
{
    if(y > m.lenght - 1) { return; }
    m[x][y] = Air;
    m[x][y + 1] = Water;
}
4

2 回答 2

0
int Water = 1;
int Air = 0;
int[][] map = new int[20][20];

void update()
{   
    for(int x = 0; x < 10; x++)
    {
        for(int y = 9; y >= 0; y--)
        {
            tick(x, y, map);
        }
    }
}

void tick(int x, int y, int[][] m)
{
    if (y < m[0].length - 1)
        m[x][y+1] = m[x][y];
}

当然,你需要先让一些细胞水,但这应该在构造函数中。

于 2013-05-02T19:18:34.140 回答
0

你是说你是在逐行迭代你的地图,而实际上是按列进行的。尝试先循环 fory然后 for x

你的更新方法也是错误的。y+1什么时候y = 9会尝试访问map[x][10]哪个会抛出一个ArrayOutOfBoundsException. 请记住,声明为的数组new int[10]有 10 个项目,从 0 开始,到位置 9 结束。

于 2013-05-02T20:16:23.303 回答