Я делаю маленькую игру в 2D с видом сверху. Я пытаюсь сделать это:NullPointerException при анализе файла для создания карты игры
1) У меня есть локальный файл с картой расположения в .txt
2) Разобрать этот файл и сделать макет карты в игре
3) Краска все на screen
Я (думаю, так) успешно проанализировал файл и поместил его в приложение, но он не смог нарисовать, выбрасывая исключение 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]);
}
}
Это функция для разбора файла в программу. Первые две строки читают ширину и высоту карты (из указанного файла), затем для каждого значения в файле я создаю точку на карте [строка] [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
);
Я думаю, что это может иметь некоторые ошибки, но я не уверен. То, что я хочу сделать, - это взять изображение каждой плитки и нарисовать ее в соответствующих строках и столбцах. Каждое поле представляет собой квадрат (length = tileSize).
EDIT
Спасибо всем, ребята!
@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
@ Ата - Я уже это сделал, я указал, какая линия вызывает проблемы. – WarmasterMazuran