2012-05-12 3 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 

죄송합니다 나는 초보자이다. 하는 경우에, 내가 작성한 간단한 TestApp가

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

지금까지 작품 :

+4

* *'} 캐치 (예외 전자) { }'이 변경 (모든 유사한 문) "무엇 가장 나를 좌절하는 것은 오류가 없다는 것입니다"캐치 '에 (예외 e) { e.printStackTrace(); }'(또는 어둠 속에서 번갈아 가며). –

+1

예외를 삼키기 때문에 오류가 없다는 것을 어떻게 알 수 있습니까? catch (Exception e) {}'. 분명히 던져 질 수있는 예외를 무시하면 오류가 없다는 인상을 받게됩니다. 그러나이 인상은 현실이되지 못할 가능성이 큽니다. –

+0

* "긴 게시물"죄송합니다. * 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

1

더러운 빠른 및-솔루션은 널 (null)뿐만 아니라 .block 수 없습니다 Window.room을 테스트 할 수있다 그래서.

"정적"과 그 이유 및 사용 방법을 이해해야합니다. 일반적인 초보자 실수는 컴파일러를 조용히하기 위해 "정적"키워드를 주입하는 것입니다.

클래스와 속성을 초기화하기 위해 조사하십시오.

블록에서 창에 액세스하려면 참조가 있어야합니다. 참조는 Block의 ctor로 전달 될 수 있습니다.

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); 
     } 
    } 
} 

누가 블록을 생성합니까? 그것은 Room이므로 Room 자체는 Window에 대해 알아야합니다 (기본적으로 디자인을 변경하지 않는 한).

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); 
     } 
    } 
} 

는 블록 배열이 생성 초기화하고, 블록은 윈도우 파라미터를 전달한다.

무승부에, 당신은 또 다시 배열을 다시하지 않으며, 당신은 블록을 다시 않지만, 단지 그들을 다시 그리기 :

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에 넣을 수 있을까요? 왜 'draw'를 호출 할 때마다 새로운 Block 배열을 만들어야하는지 궁금합니다. 하지만 코드의 의미에 대해서는 잘 모르겠습니다. 블록 배열을 재창조하는 것이 아니라 내부의 블록을 재현하는 것입니다. –