2017-04-08 466 views
1

我目前正在嘗試從Tiled(平鋪地圖編輯器)地圖文件中將遊戲對象加載到我在C#中製作的遊戲引擎中。我使用TiledSharp(鏈接到GitHub的here)。它使用字典來記錄每一個單獨的瓷磚(或「遊戲對象」),我試圖加載性能。但由於某些原因,我得到一個錯誤,當我遍歷性,同時我也得到一個錯誤,如果我檢查它是否是空C#字典 - 給定的關鍵字不存在於字典中

下面是我使用的代碼片段:

for (int l = 0; l < tmxMap.Tilesets[k].Tiles.Count; l++) 
    // This line throws an error 
    if (tmxMap.Tilesets[k].Tiles[l].Properties != null) 
     // and if I remove the above line, this line throws an error 
     for (int m = 0; m < tmxMap.Tilesets[k].Tiles[l].Properties.Count; m++) 

的錯誤我收到說給定的關鍵是不存在的字典。但是...我甚至沒有檢查鑰匙。

我錯過了什麼嗎?

任何幫助,將不勝感激。

+0

_「我甚至沒有檢查鑰匙」 - - 但你是。我猜'瓷磚[l]'拋出。爲什麼這取決於你如何聲明和初始化字典。可能你只是在尋找'foreach(var tile in tmxMap.Tilesets [k] .Tiles)'? – CodeCaster

+0

從那時起,我可以通過在tile循環中執行另一個foreach循環來訪問每個tile的屬性,但這對我來說看起來很愚蠢,必須有更好的方法。 –

回答

4

我得到的錯誤說給定的鍵不在字典中。但是...我甚至沒有檢查鑰匙。

是你檢查的關鍵。這是你的代碼:

if (tmxMap.Tilesets[k].Tiles[l].Properties != null) 

您與關鍵k檢查Tilesets,然後用鑰匙l檢查。如果Tilesets不包含關鍵k一個項目,你會得到錯誤。這同樣適用於與關鍵l

使用詞典時,您可以執行以下操作:

選項1

進行查找兩次:第一次看到,如果該項目存在,然後第二次獲得的價值:

var items = new Dictionary<string, string>(); 
items.Add("OneKey", "OneValue"); 
if(items.ContainsKey("OneKey")) 
{ 
    var val = items["OneKey"]; 
} 

選項2

這裏是其中一次執行查找另一種方法:

string tryVal; 
if (items.TryGetValue("OneKey", out tryVal)) 
{ 
    // item with key exists so you can use the tryVal 
} 
0

至於我可以在你的代碼中看到的我認爲瓷磚是一本字典,當你嘗試通過tmxMap.Tilesets[k].Tiles[l]迭代,因爲它搜索拋出錯誤鍵l,而不是l元素。

您可以嘗試tmxMap.Tilesets[k].Tiles[tmxMap.Tilesets[k].Tiles.Keys.ElementAt(l)]

0

你試圖讓基於密鑰kl的值。

if (tmxMap.Tilesets[k].Tiles[l].Properties != null)聲明基本上是獲取Tilesets字典中對應於k密鑰的值。如果Tilesets字典不包含密鑰k的值,則會拋出異常。另外,如果沒有對應於l鍵的值,則在Tiles字典中將拋出異常。

您可以使用TryGetValue擴展方法,如果找到該項目,它將爲您提供值。

TileSet ts = null; 

    if(tmxMap.Tilesets.TryGetValue(k, out ts) 
    { 
     for (int l = 0; l < ts.Tiles.Count; l++) 
     { 
      Tiles tl = null; 

      if(ts.TryGetValue(l,out tl) 
      { 
      if (tl.Properties != null) 
      { 
       for (int m = 0; m < tl.Properties.Count; m++) 
       { 
       //Do something 
       } 
      } 
      } 
     } 
    } 
相關問題