1

このトピックにはたくさんの投稿がありますが、投稿中に2日間読んでも何も機能しなかったので、ここで質問することにしました。私はこのようなXML(Level01.xml)ファイルを持っています

<map version="1.0">
 <tileset>
  <image source="....>
 </tileset>
 <layer name="background">
     <data encoding="csv">
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3
     </data>
 </layer>
 <layer name="walls">
     <data encoding="csv">
     182,182,182,182,182,8,8,
     182,8,182,8,8,8,8,
     182,182,182,182,182,8,8,
     182,8,182,8,8,8,8,
     </data>
 </layer>
</map>

さまざまなレイヤーを持つ(タイル)マップであり、XNAで描画したいと思います。したがって、各レイヤーからデータを読み取りたいのですが、string[] これは私が試したものですが、2番目は機能せず、string[] walldata理由がわからないため、絶対に必死です。

public class LevelXmlReader
{
    public string[] backgroundData;
    public string[] wallData;

    LevelXmlReader()
    {
        XDocument doc = XDocument.Load(@"Level/Level01.xml");
        foreach (XElement layer in doc.Element("map").Descendants("layer"))
        {

            var lay = doc.Element("map").Element("layer");
            var layName = lay.Attribute("name").Value;
            switch (layName)
            {
                case "background":
                    {
                        backgroundData = lay.Element("data").Value.Split(',');
                    }
                    break;
                case "walls":
                    {
                        wallData = lay.Element("data").Value.Split(',');
                    }
                    break;
            }

        }

    }

}

描画しようとするとwallData、常にExceptionError「オブジェクト参照がオブジェクトのインスタンスに設定されていません」が表示されます。

4

4 に答える 4

3

ループ内で宣言しています

var lay = doc.Element("map").Element("layer");

すでに個別のレイヤーがあるため、これは不要です。layerその行を完全に削除し、foreachループから変数を使用する必要があります。ループの内側は次のようになります。

foreach (XElement layer in doc.Element("map").Descendants("layer"))
{
    switch (layer.Attribute("name").Value)
    {
        case "background":       
            backgroundData = layer.Element("data").Value.Split(','); 
            break;

        case "walls":
            wallData = layer.Element("data").Value.Split(',');
            break;
    }
}

コードでは、ステップスルーするのではなく、常に同じレイヤーを両方の時間で取得しています。

于 2013-02-05T14:39:51.787 に答える
2

を使用してすべてのタグforeachを繰り返します。layerしかし、ループ内では、それらを使用していません。代わりに、常にを介して最初のレイヤーにアクセスしていdoc.Element("map").Element("layer")ます。

于 2013-02-05T14:39:03.687 に答える
1

交換

var lay = doc.Element("map").Element("layer");

var lay = layer;

最初の要素のみを使用しながら、ループ変数を無視しています。

于 2013-02-05T14:39:05.013 に答える
1

これを試して

public class LevelXmlReader
{
    public string[] backgroundData;
    public string[] wallData;

    LevelXmlReader()
    {
        XDocument doc = XDocument.Load(@"Level/Level01.xml");
        foreach (XElement layer in doc.Element("map").Descendants("layer"))
        {
            var layName = layer.Attribute("name").Value;
            switch (layName)
            {
                case "background":
                    backgroundData = layer.Element("data").Value.Split(',');
                    break;

                case "walls":
                    wallData = layer.Element("data").Value.Split(',');
                    break;
            }
        }
    }
}
于 2013-02-05T14:39:22.223 に答える