2012-05-12 13 views
0

私のタワー防衛ゲームのレベルを編集するためにスキャナを使用しようとしています。ただし、レベル(タイル画像)はカスタムファイルのレベルに更新されません(0は草1が石-1は何もありません)。私はエラーが見つかりましたが、どのように修正する必要がありますが、これを取り除くために追加/変更する必要がありますか?Javaスキャナの問題(JFrame)

java.lang.NullPointerException 
    at Levels.loadLevels(Levels.java:11) 
    at Window.define(Window.java:28) 
    at Window.paintComponent(Window.java:44) 

ライン11:for(int y=0;y<Window.room.block.length;y++) { 行28:levels.loadLevels(new File("levels/level1.level")); 行44:

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.*; 
import java.io.*; 

public class Window extends JPanel implements Runnable { 

    public Thread thread = new Thread(this);   
    public static Image[] tileset_ground = new Image[100]; 
    public static Image[] tileset_air = new Image[100];  
    public static int myWidth, myHeight;   
    public static boolean isFirst = true;  
    public static Room room; 
    public static Levels levels; 

    public Window() { 
     thread.start(); 
    } 

    public void define() { 
     room = new Room(); 
     levels = new Levels();   
     levels.loadLevels(new File("levels/level1.level")); 

     for(int i=0;i<tileset_ground.length; i++) { 
      tileset_ground[i] = new ImageIcon("resources/tileset_ground.png").getImage(); 
      tileset_ground[i] = createImage(new FilteredImageSource(tileset_ground[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32))); 
     } 

     for(int i=0;i<tileset_air.length; i++) { 
      tileset_air[i] = new ImageIcon("resources/tileset_air.png").getImage(); 
      tileset_air[i] = createImage(new FilteredImageSource(tileset_air[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32))); 
     }  
    } 

    public void paintComponent(Graphics g) { 
     if(isFirst) { 
      define();    
      isFirst = false; 
     }   
     g.clearRect(0, 0, getWidth(), getHeight());   
     room.draw(g); 
    } 

    public void run() { 
     while(true) {    
      if(!isFirst) { 
       room.physic(); 
      }    
      repaint();    
      try { 
       Thread.sleep(1); 
      } catch(Exception e) { 
      }    
     }   
    }  
} 
:このウィンドウファイルである

import java.io.*; 
import java.util.*; 

public class Levels { 
    public void loadLevels(File loadPath) { 
     try { 
      Scanner loadLevelsScanner = new Scanner(loadPath); 

      while(loadLevelsScanner.hasNext()) { 

       for(int y=0;y<Window.room.block.length;y++) { 
        for(int x=0;x<Window.room.block[0].length;x++) { 
         Window.room.block[y][x].groundID = loadLevelsScanner.nextInt(); 
        } 
       } 

       for(int y=0;y<Window.room.block.length;y++) { 
        for(int x=0;x<Window.room.block[0].length;x++) { 
         Window.room.block[y][x].airID = loadLevelsScanner.nextInt(); 
        } 
       }  
      }    
      loadLevelsScanner.close(); 

     } catch(Exception e) {    
     } 
    } 
} 

define();

これはスキャナファイルであります

これはtです彼の部屋ファイル:

import java.awt.*; 

public class Room { 
    public int worldWidth = 40; 
    public int worldHeight = 20; 
    public int blockSize = 32; 

    public Block[][] block; 

    public Room() { } 
    public void define() { }  
    public void physic() { } 

    public void draw(Graphics g) { 

     block = new Block[worldHeight][worldWidth];   

     for(int y=0;y<block.length;y++) { 
      for(int x=0;x<block[0].length;x++) { 
       block[y][x] = new Block(x * blockSize, y * blockSize, blockSize, blockSize, Value.groundGrass, Value.airAir); 
       block[y][x].draw(g); 
      } 
     } 
    }  
} 

これはブロックファイルです:

import java.awt.*; 

public class Block extends Rectangle { 
    public int groundID; 
    public int airID; 

    public Block(int x, int y, int width, int height, int groundID, int airID) { 
     setBounds(x, y, width, height); 

     this.groundID = groundID; 
     this.airID = airID; 
    } 

    public void draw(Graphics g) { 
     g.drawImage(Window.tileset_ground[groundID], x, y, width, height, null); 

     if(airID != Value.airAir) { 
      g.drawImage(Window.tileset_air[airID], x, y, width, height, null); 
     }   
    }  
} 

そして最後に、これはスキャナが読み取るようになっているカスタムファイルです:

愚かな質問には申し訳ありません
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 

私は初心者です。

+4

*「一番私を失望させることは、エラーがないことである」* '}キャッチ(例外e){ }'変更すること(およびすべての同様の声明) 'キャッチ(例外へe){ e.printStackTrace(); } '(または、暗闇の中に交互に残る)。 –

+1

あなたが例外を飲み込んだのでエラーがないことをどのように知っていますか? 'catch(Exception e){}'。明らかに、スローされる可能性のある例外を無視すると、エラーがないという印象を受け取ります。しかし、この印象は現実にならない可能性が高い。 –

+0

*「長い投稿には申し訳ありません」*より早い時期に役立つようにするには、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

1

間に合わせと-ソリューションがnullだけでなく、.blockではないとWindow.roomをテストするために、次のとおりです行われていれば、私が書いた

 Scanner loadLevelsScanner = new Scanner (loadPath); 
     if ((Window.room != null) && 
      (Window.room.block != null)) { 
      // ... block until catch block 
     } 

シンプルでTestAppが、これまでの作品そう。

「静的」とは何か、またそれを使用する理由と使い方を理解する必要があります。一般的な初心者の間違いは、単にコンパイラを静かにするために "静的な"キーワードを入れることです。

調査して、クラスとその属性を初期化します。

ブロックでは、ウィンドウにアクセスするには、参照が必要です。ブロックの参照先に参照を渡すことができます。

class Block extends Rectangle { 
    public int groundID; 
    public int airID; 
    Window window; 

    public Block (int x, int y, int width, int height, int groundID, int airID, Window window) { 
     setBounds (x, y, width, height); 
     this.groundID = groundID; 
     this.airID = airID; 
     this.window = window; 
    } 
    public void draw (Graphics g) { 
     g.drawImage (window.tileset_ground [groundID], x, y, width, height, null); 
     if (airID != Value.airAir) { 
      g.drawImage (window.tileset_air [airID], x, y, width, height, null); 
     } 
    } 
} 

誰がブロックを作成しますか?それはルームなので、ルーム自体はウィンドウについて知る必要があります(基本的にデザインを変更しない限り)。

public Room (Window w) { 
    block = new Block [worldHeight] [worldWidth]; 
    for (int y=0; y <block.length; y++) { 
     for (int x=0; x <block [0].length; x++) { 
      block [y] [x] = new Block (x * blockSize, y * blockSize, blockSize, blockSize, Value.groundGrass, Value.airAir, w); 
     } 
    } 
} 

ブロック配列が作成され、初期化され、ブロックにWindowパラメータが渡されます。

ドローで、あなたは何度も繰り返し配列を再作成していない、また、あなたはブロックを再作成しますが、ちょうどそれらを再描画:

public void draw (Graphics g) { 
    for (int y=0; y <block.length; y++) { 
     for (int x=0; x <block [0].length; x++) { 
      block [y] [x].draw (g); 
     } 
    } 
} 

ウィンドウで、ルームを作成し、その合格しますウィンドウ参照:

public void define() { 
    room = new Room (this); 
    levels = new Levels(); 
+0

さて、Window.room.blockだけがnullだとわかっていますが、どうすれば修正できますか? – core16

+0

私はRoom.javaで何かを変更する必要があると思いますが、何ですか? – core16

+0

おそらく 'block ='の初期化をRoomのctorに入れることができますか?私はなぜあなたが '描画'のすべての呼び出しで新しいブロック配列を作成する必要があるのだろうと思う。しかし、あなたのコードのセマンティクスについてはわかりません。あなたはブロック配列を再作成するのではなく、内部のブロックも再作成します。 –