1

私はJavaゲームを開発していて、現在マップメーカーを書いています。マップを作成してタイルを描画することはできますが、キャラクターがマップのさまざまな場所を見ることができるように、それらのタイルの位置を変更できる必要があります。メソッドで変更しようとすると、次のmoveMap()エラーが発生します。

Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: 570
at Base.moveMap(Base.java:88)
at Base.run(Base.java:55)
at java.lang.Thread.run(Unknown Source)

なぜこれが起こっているのかわかりません-誰かが私に問題を理解するのを手伝ってくれませんか。タイルを移動する別の方法はありますか?

これが私のコードです...

public class Base extends JPanel implements Runnable {

    private static String[] line = { 
        "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwwwwwwwwwwwfffffffffffwwwwwwwwwww", 
        "wwwwwwffwwwwwwwwfwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwfffffffwwwfwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwffwwwffffffwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwffwwwffffffwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwfffffffwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwffwwwwwwwwwwwwwwwwwwwwwwwwwwwwww", 
        "wwwwwwffwwwwwwwwwwwwwwffffffffwwwwwwww",
        "wwwwwwffwwwwwwwwwwwwwwwwwwwwffwwwwwwww",
        "wwwwffffffwwwwwwwwwwwwwwwwwwffwwwwwwww",
        "wwwwffffffffffffffffffffffffffwwwwwwww",
        "wwwwffffffwwwwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",
        "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww",};

    private Rectangle[] colRect;

    private int tileWidth = 30;
    private int tileHeight = 30;

    public Base() {
        colRect = new Rectangle[line.length * line[0].length()];
        for (int i = 0; i < line.length; i++) {
            for (int f = 0; f < line[i].length(); f++) {
                colRect[counter] = new Rectangle(f * tileWidth, i * tileHeight,tileWidth, tileHeight);
                if (counter != colRect.length) {
                    counter += 1;
                }
            }
        }
    }

    public void moveMap(){
        for(int i = 0; i <= colRect.length; i++){
            colRect[i].setLocation(colRect[i].x+1, colRect[i].y+1);
        }
    }
}
4

2 に答える 2

3

あなたはほぼ間違いなくこれを意味します:

for (int i = 0; i < colRect.length; i++) {

これの代わりに:

for(int i = 0; i <= colRect.length; i++){

配列の長さがnの場合、インデックスは0からn-1になることに注意してください。

于 2012-04-07T04:12:28.573 に答える
0

マップ自体ではなく、ジオメトリへのアクセサを変更することをお勧めします。のように見えるので、関数moveMapはある種の「ループ」動作をする可能性があります

getLocation (int index, offset = 0){
    int accIndex = (index + offset) % colRect.length;
    // ... probably better to modify your data-structure to simplify the handling
}
于 2012-04-07T10:05:29.607 に答える