2

所以这是我使用的双数组

public int[][] MAP = { { 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 9, 9, 8, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 9, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 9, 9, 8, 8, 8, 8, 8 },
        { 8, 8, 9, 9, 9, 8, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 9, 9, 9, 8, 8, 8, 8, 8 },
        { 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8 },
        { 8, 8, 8, 8, 8, 9, 9, 9, 8, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 },
        { 9, 8, 8, 8, 8, 8, 9, 9, 9, 8, 8 } };

我的问题是,当我尝试使用它来加载相应的图像时,我得到一个错误,说当 y = 12 时它超出了界限。

Image[][] displayedMap = new Image[MAP[0].length][MAP.length];

    public Town() {
        System.out.println("Map len" + MAP.length);
        for (int x = 0; x < MAP[0].length; x++) {
            for (int y = 0; y < MAP.length; y++) {
                System.out.println("X:" + x + ",Y:" + y);
                setImageContent(x, y);
            }
        }
    }

    private void setImageContent(int x, int y) {
        Terrain t = Terrain.getTerrainFor(MAP[x][y]);
        displayedMap[x][y] = t.getImage();
    }

当 y 在城镇构造函数中变为 11 然后转到它所说的 setImagecontent 时

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:11

4

5 回答 5

5

您已经交换了数组的尺寸,在您的一部分中,您正在使用 Y 的“X 轴”的大小,反之亦然

于 2013-08-01T00:19:46.043 回答
2

您的数组列长度仅为 11,但行长度为 15。您已经翻转了数组引用,因此由于行和列的长度不同,因此出现异常。

试试这个:

Image[][] displayedMap = new Image[MAP[0].length][MAP.length];
public Town() {
    System.out.println("Map len" + MAP.length);
    for (int x = 0; x < MAP.length; x++) {
        for (int y = 0; y < MAP[0].length; y++) {
            System.out.println("X:" + x + ",Y:" + y);
            setImageContent(x, y);
        }
    }
}

private void setImageContent(int x, int y) {
    Terrain t = Terrain.getTerrainFor(MAP[x][y]);
    displayedMap[x][y] = t.getImage();
}

请注意,我现在将MAP.length其用作限制xMAP[0].length限制y

你刚刚得到了你的 x 和 y 翻转。X 是行数,Y 是列数。

我是否还建议您查看Tiled。这是做这种事情的一种更简单的方法。不再需要手动将平铺地图编码到源文件中!在一个不错的程序中编辑它们,然后只解析其中的数据文件。有许多不同的格式和解析器。

于 2013-08-01T00:17:19.927 回答
1

这就是displayedMap数组的创建方式:

Image[][] displayedMap = new Image[MAP.length][MAP[0].length];

在您的代码中,尺寸是倒置的。

于 2013-08-01T00:19:32.403 回答
0
for (int x = 0; x < MAP.length; x++) {
   for (int y = 0; y < MAP[0].length; y++) {

    }
}

MAP.length是行数。 MAP[0].length是该行中的列数。

于 2013-08-01T00:20:59.313 回答
0

我习惯在使用二维数组时颠倒 x 和 y,即我通过以下方式访问它们MAP[y][x]:首先访问“行”(内部数组),然后访问“列”(内部数组中的项目) .

如果您经常犯错误,请使用“包含更多盒子的盒子”而不是单个“矩阵”来推理。

于 2013-08-01T00:21:26.437 回答