1

2Dタイルゲームを作成しようとしていますが、タイルを保持する配列を作成すると、NullPointerExceptionが発生します。コードの一部を次に示します。フォーマットが悪い場合は申し訳ありませんが、最初のタイマー

パブリッククラスワールド{

//holds data for where to place images and rectangles
int[][] worldDat = new int[25][25]; 
//hold rectangles for checking interaction with player
Rectangle[][] blocks = new Rectangle[25][25];
//holds block's images to be painted
Image[][] blockImage = new Image[25][25];
//holds position to be pained on screen
int[][] location = new int[25][25];
//enumeration holding block's images and other things of the sort
EWorldBlocks eBlocks;

//sets all of the arrays listed above
public void setupAll(){

    for(int i = 0; i < 24; i++){

        for(int e = 0; e < 24; e++){                    
            blocks[i][e].setBounds(e * 20, i * 20, 20, 20);
            blocks[i][e].setLocation(e*20, i*20);

            if(worldDat[i][e] == 6){
                blockImage[i][e] = getRandomGrass();
            }else if(worldDat[i][e] == 0){
                blockImage[i][e] = null;
            }else{
            blockImage[i][e] = eBlocks.intToImage(worldDat[i][e]);
            }
        }
    }
}   

//used to get a random block
private Image getRandomGrass()
{
    Random rand = new Random();

    int r = rand.nextInt(2);
    r++;

    return eBlocks.intToImage(r);
}


public World(int[][] worldDat) {
    this.worldDat = worldDat;
}

}

それからそれはこのクラスで呼ばれます(私はそれが問題の一部であると信じています)

パブリッククラスworldDraw{

//ALSO if there is a better way to do this, do tell
levels levels = new levels();
static levels sLevels = new levels();
World level1;
static World sLevel1 = new World(sLevels.getLevel1());

//called in paint method for panel
public void draw(Graphics2D g2){
    sLevel1.setupAll();
    for(int i = 0; i < 24; i++){
        for(int e = 0; i < 24; i++){
            g2.drawImage(level1.blockImage[i][e], e*25, i*25, null);
        }
    }

}

//holds levels
public worldDraw() {        
    level1 = new World(levels.getLevel1());
}
}
4

2 に答える 2

3

オブジェクト配列を作成すると、参照の配列が作成されますが、参照は割り当てられません。それらを使用する前に、まずこれを行う必要があります。卵パックを作成するのと似ていると考えてください。カートンに最初に卵を入れるまで、卵を使用することはできません。したがって、たとえばブロック配列の場合、メソッドを呼び出す前に、まず配列内の各アイテムにRectangleオブジェクトを割り当てる必要があります。これは通常、forループで実行されます。例えば、

for(int i = 0; i < 24; i++){
    for(int e = 0; e < 24; e++){       
        blocks[i][e] = new Rectangle(....); //...             
        blocks[i][e].setBounds(e * 20, i * 20, 20, 20);
        blocks[i][e].setLocation(e*20, i*20);
于 2013-01-29T03:14:43.177 に答える
1

JavaはCとは違うことを知っておく必要があります。

これを行うとき:

Rectangle[][] blocks = new Rectangle[25][25];

newを呼び出して参照を指定するまで、ブロック2D配列内のすべての参照はnullです。

したがって、これを行う必要があります。

for(int i = 0; i < 24; i++){
    for(int e = 0; e < 24; e++){             
        blocks[i][e] = new Rectangle(); // I don't know what arguments it takes.       
        blocks[i][e].setBounds(e * 20, i * 20, 20, 20);
        blocks[i][e].setLocation(e*20, i*20);
于 2013-01-29T03:16:25.870 に答える