2017-04-08 15 views
1

Ich versuche gerade, Spielobjekte aus einer Tiled-Map-Datei (Tiled Map Editor) in eine Game-Engine zu laden, die ich in C# mache. Ich verwende TiledSharp (Link zu Github here). Es verwendet ein Wörterbuch, um Eigenschaften über jede einzelne Kachel (oder "Spielobjekt"), die ich zu laden versuche, zu halten. Aber aus irgendeinem Grund bekomme ich einen Fehler, wenn ich Schleife durch die Eigenschaften, und ich auch einen Fehler, wenn ich überprüfen, ob es null istC# -Dictionary - Der angegebene Schlüssel war nicht im Wörterbuch vorhanden

Hier ist ein Ausschnitt aus dem Code Ich verwende:

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++) 

Die error I get is says Der angegebene Schlüssel war im Wörterbuch nicht vorhanden. Aber ... ich suche nicht einmal nach einem Schlüssel.

Fehle ich etwas?

Jede Hilfe wäre willkommen.

+0

_ "Ich bin nicht einmal auf der Suche nach einem Schlüssel" _ - Sie sind es doch. Ich schätze 'Tiles [l]' wirft. Warum dies der Fall ist, hängt davon ab, wie Sie das Wörterbuch deklarieren und initialisieren. Wahrscheinlich suchst du nur nach foreach (var tile in tmxMap.Tilesets [k] .Tiles) '? – CodeCaster

+0

Von diesem Punkt Ich bin in der Lage, die Eigenschaften jeder Platte zuzugreifen, indem Sie eine andere foreach-Schleife innerhalb der Kachel-Schleife zu tun, aber dies scheint nur sehr dumm zu mir, muss es ein besserer Ansatz. –

Antwort

4

Der Fehler, den ich bekomme, sagt, dass der angegebene Schlüssel nicht im Wörterbuch vorhanden war. Aber ... ich suche nicht einmal nach einem Schlüssel.

Ja, Sie suchen nach einem Schlüssel. Dies ist Ihr Code:

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

Sie sind für Tilesets mit Schlüssel k prüfen und dann mit Schlüssel l überprüfen. Wenn die Tilesets kein Element mit Schlüssel k enthält, erhalten Sie diesen Fehler. Das gleiche gilt für mit Schlüssel l.

Sie können folgende tun, wenn sie mit Wörterbücher arbeiten:

Option 1

Das Nachschlagen zweimal durchgeführt: einmal, um zu sehen, ob das Element vorhanden ist, und dann ein zweites Mal um den Wert zu erhalten:

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

Option 2

Und hier ist ein weiterer Ansatz, bei dem die Suche einmal durchgeführt wird:

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

Soweit ich in Ihrem Code sehen kann Ich denke, dass Fliesen ein Wörterbuch ist, und wenn Sie von tmxMap.Tilesets[k].Tiles[l] zu iterieren versuchen wirft es Fehler, weil es sucht nach Schlüssel l, nicht für das l-Element.

können Sie versuchen, tmxMap.Tilesets[k].Tiles[tmxMap.Tilesets[k].Tiles.Keys.ElementAt(l)]

0

Sie versuchen, einen Wert auf k, l Schlüssel basiert zu erhalten.

if (tmxMap.Tilesets[k].Tiles[l].Properties != null) Anweisung erhält grundsätzlich den Wert k Schlüssel in Tilesets Wörterbuch. Wenn Tilesets Wörterbuch keinen Wert für den Schlüssel k enthält, wird eine Ausnahme ausgelöst. Wenn kein Wert dem Schlüssel l entspricht, wird im Tiles-Wörterbuch eine Ausnahme ausgelöst.

Sie können TryGetValue Extension-Methode verwenden, mit dem Sie den Wert geben, wenn das Element gefunden wurde.

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 
       } 
      } 
      } 
     } 
    } 
Verwandte Themen