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

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].lengthy

x と y が反転しただけです。X は行数、Y は列数です。

Tiledもチェックすることをお勧めします。この種のことを行うためのはるかに簡単な方法です。手動でタイル マップをソース ファイルにコーディングする必要はもうありません。それらを素敵なプログラムで編集し、データファイルを解析するだけです。多くの異なるフォーマットとパーサーがあります。

于 2013-08-01T00:17:19.927 に答える
0

私は 2 次元配列を使用するときは x と y を逆にする習慣を持っています。つまり、次の方法でアクセスしますMAP[y][x]。最初に「行」(内側の配列) にアクセスし、次に「列」(内側の配列の項目) にアクセスします。 .

よく間違える場合は、単一の「行列」ではなく、「より多くのボックスを含むボックス」で推論してください。

于 2013-08-01T00:21:26.437 に答える