2012-01-02 4 views
1

Я получаю эту ошибку в C# при попытке создать импортер для tilemap. Он должен читать файлы, отформатированные таким образом;NullReferenceException, как я могу справиться с этим?

DatMapName! 
6|4 
SpritePageID:SpriteID:OffsetX:OffsetY|SpritePageID:SpriteID:OffsetX:OffsetY SpritePageID:SpriteID:OffsetX:OffsetY 
SpritePageID:SpriteID:OffsetX:OffsetY|SpritePageID:SpriteID:OffsetX:OffsetY SpritePageID:SpriteID:OffsetX:OffsetY 

в структуру данных, построенная следующим образом;

map 
    MapTile[MapSizeX, MapSizeY] 
     Tile[Sprites on tile] 
     - string SpritePageID 
     - int SpriteID 
     - Vector2 Offset 

В основном это имеет название карты на первую линию, X/Y размера на секунду, а потом она SpritePageID, spriteID, OffsetX, OffsetY разделены: и несколько спрайтов на плитку, разделенной |. Пробелы ограничивают разные плитки.

Однако во время обработки я получаю следующую ошибку;

Код ошибки, которую генерирует эта ошибка.

string[] lines = input.Split(new char[] { '\n' }); 
// ------ 
// Clear out commented lines from the array. Turn it to a list, remove indices, turn back to array. 
List<string> derp1 = new List<string>(lines); 
for (int derp2 = 0; derp2 < derp1.Count; derp2++) { 
    if (derp1[derp2][0] == ' ' || derp1[derp2][0] == ';') { 
     derp1.RemoveAt(derp2); 
     derp2--; 
    } 
} 
lines = derp1.ToArray(); 
// ------ 
int rows = Convert.ToInt32(lines[1].Split('|')[0]); 
int columns = Convert.ToInt32(lines[1].Split('|')[1]); 

MapTile[,] res = new MapTile[rows, columns]; 

for (int i0 = 2; i0 < (rows + 2); i0++) { 
    string[] tiles = lines[i0].Split(' '); 

    for (int i1 = 0; i1 < columns; i1++) { 
     string[] tileSprites = tiles[i1].Split('|'); 
-->  res[i0 - 2, i1].sprites = new Tile[tileSprites.Length]; <-- Exception 

     for (int i2 = 0; i2 < tileSprites.Length; i2++) { 
      string[] spriteData = tileSprites[i2].Split(':'); 

      res[i0 - 2, i1].sprites[i2] = new Tile(spriteData[0], Convert.ToInt32(spriteData[1]), new Vector2(Convert.ToInt32(spriteData[2]), Convert.ToInt32(spriteData[3]))); 
     } 
    } 
} 
return new Map(res, lines[0]); 

Это классы, которые я использую для создания этого дерева. Я удалил операторы using, чтобы сократить этот вопрос.

//Map.cs 
namespace LibTile { 
    public class Map { 
     public MapTile[,] grid { get; set; } 
     public string MapName { get; set; } 

     public Map(MapTile[,] value) { 
      grid = value; 
     } 
     public Map(MapTile[,] value, string name) { 
      grid = value; 
      MapName = name; 
     } 

     public MapTile GetTile(int row, int col) { 
      return grid[row, col]; 
     } 

     public int Rows { 
      get { 
       return grid.GetLength(0); 
      } 
     } 

     public int Columns { 
      get { 
       return grid.GetLength(1); 
      } 
     } 
    } 
} 

.

//MapTile.cs 
namespace LibTile { 
    public class MapTile { 
     public Tile[] sprites { get; set; } 

     public MapTile(Tile[] value) { 
      sprites = value; 
     } 
    } 
} 

.

//Tile.cs 
namespace LibTile { 
    public class Tile { 
     public String SpritePageID; 
     public int SpriteID; 
     public Vector2 Offset; 

     public Tile(String spid, int sid, int ox, int oy) { 
      SpritePageID = spid; 
      SpriteID = sid; 
      Offset = new Vector2(ox,oy); 
     } 
     public Tile(String spid, int sid, Vector2 o) { 
      SpritePageID = spid; 
      SpriteID = sid; 
      Offset = o; 
     } 
    } 
} 
+0

Какое значение имеет свойство null в списке «locals»? – annonymously

ответ

0

Вы создаете новый массив MapTile, но вы никогда не инициализируете отдельные элементы. Попробуйте это:

res[i0 - 2, i1] = new MapTile(new Tile[tileSprites.Length]); 

Это создаст новый объект MapTile в каждом poition массива. Не делать этого вызывало ваше исключение для ссылки. Я также хотел бы изменить конструктор MapTile на отсутствие параметров, а затем просто установить MapTile.sprites, как вы это делали раньше.

+0

Спасибо! Это исправило это. Я знал, что это связано с тем, что одна из этих вещей не инициализирована, но я никогда не пробовал эту вариацию. Предложение конструктора является хорошим. Я добавлю пустой конструктор. – CELLShock

Смежные вопросы