我正在用2D視圖製作小遊戲,並從上方查看視圖。我試着這樣做:在遊戲解析文件製作遊戲地圖時出現NullPointerException
1)我有一個爲.txt
2地圖佈局本地文件)解析這個文件,並在地圖佈局)上繪製的一切屏幕
我(認爲是)成功解析文件並將其放入應用程序,但它無法繪製,拋出NullPointerException。我知道這裏有些東西是空的,但是我沒有看到什麼和在哪裏 - 從我的角度來看,一切都應該是這樣。
一些代碼:
BufferedReader br = new BufferedReader(new FileReader(s));
mapwidth = Integer.parseInt(br.readLine());
mapheight = Integer.parseInt(br.readLine());
String delimiters = " ";
for (row = 0; row < mapheight; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mapwidth ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
這是函數解析文件到程序。前兩行讀取地圖寬度和高度(從所述文件),然後對於文件中的每個值,我在地圖[row] [col]中創建一個點
這是負責爲地圖的每個點製作對象的另一個函數
String wall ="Images/wall.jpg";
BufferedImage WALL = ImageIO.read(new File(wall));
if (map[row][col] == 0) { tile[row][col] = new Tile(WALL, false, true, false); }
最後一行是拋出一個NullPointerException。 瓷磚在我的遊戲中是單場。它有四個值 - BufferedImage,阻塞,可走和可破壞(最後三個是布爾值)。 此外,如果我將代碼與解析代碼一起製作,這並不重要。我仍然有例外。 我知道這裏有一些缺失,但我無法弄清楚什麼。
後來我想畫的所有瓷磚:
public void paint(Graphics g){
for (row=0; row < mapheight; row++)
for(col = 0; col < mapwidth; col++){
g.drawImage(
tile[row][col].getImage(),
row*tileSize,
col*tileSize,
null
);
我認爲它可能有一些錯誤,但我不知道。我想要做的就是拍攝每塊瓷磚的圖像並將其繪製在適當的行和列中。每個字段都是一個正方形(長度= tileSize)。
編輯
謝謝大家!
@Thierry - 調試後我發現瓷磚仍然是空的,並沒有填滿。所以,我做了一個空的實例並將這兩個函數放在一起。現在它看起來像這樣和正常工作:
public GameTileMap(String s, int tileSize){
this.tileSize = tileSize;
try{
BufferedReader br = new BufferedReader(new FileReader(s));
mapwidth = Integer.parseInt(br.readLine());
mapheight = Integer.parseInt(br.readLine());
map = new int[mapheight][mapwidth];
tile = new Tile[mapheight][mapwidth];
int mh = mapheight;
int mw = mapwidth ;
String delimiters = " ";
for (row = 0; row < mh; row++){
String line = br.readLine();
String[] tokens = line.split(delimiters);
for (col = 0; col < mw ; col++){
map[row][col] = Integer.parseInt(tokens[col]);
}
}
String wall ="Images/wall.jpg";
String brick = "Images/brick.jpg";
String grass ="Images/grass.jpg";
String water = "Images/water.jpg";
BufferedImage WALL = ImageIO.read(new File(wall));
BufferedImage BRICK = ImageIO.read(new File(brick));
BufferedImage GRASS = ImageIO.read(new File(grass));
BufferedImage WATER = ImageIO.read(new File(water));
for (row = 0; row < mh; row++){
for (col = 0; col < mw ; col++){
if (map[row][col] == 0) { tile[row][col] = new Tile(GRASS, false, true, false); }
else if (map[row][col] == 1) {tile[row][col] = new Tile(BRICK, true, false, true);}
else if (map[row][col] == 2) {tile[row][col] = new Tile(WALL, true, false, false);}
else if (map[row][col] == 3) {tile[row][col] = new Tile(WATER, false, false, false);}
else {tile[row][col] = new Tile(GRASS, false, true, false);};
}
}
}
catch(Exception e){
e.printStackTrace();}
}
這是導致你的異常的代碼:'if(map [row] [col] == 0){tile [row] [col] = new Tile(WALL,false,true,false); }'?只要確保我理解正確。 –
異常stacktrace包含答案。至少將它縮小到線路上拋出的異常 – ata
@Ata - 我已經做了,我已經指出了哪條線路造成了麻煩。 – WarmasterMazuran