0

エラーメッセージ全体はここにあります:

There was an error while deserializing intermediate XML. Cannot find type
"WindowsGame1.Tile".

XNAゲームを作成していますが、現在、xmlファイルからタイルベースのレベルでロードしようとしています。現在、私のxmlファイルは次のようになっています。

<?xml version="1.0" encoding="utf-8"?>
<XnaContent>
  <Asset Type="WindowsGame1.Tile">
    <Tile>
      <X>0</X>
      <Y>0</Y>
      <ImageName>grass-tile</ImageName>
    </Tile>
  </Asset>
</XnaContent>

そして私のC#ファイルは次のようになります:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace WindowsGame1
{
    public class Tile
    {
        public int x;
        public int y;
        public string imageName;

        public int X
        {
            get { return x; }
            set { x = value; }
        }

        public int Y
        {
            get { return y; }
            set { y = value; }
        }
        public string ImageName
        {
            get { return imageName; }
            set { imageName = value; }
        }
    }
}

XPathライブラリを使用してxmlファイルを解析し、Tileを作成するクラスがありますが、xmlのものが機能しないため、現在すべてコメント化されています。Game1クラスで、以下をインポートしてみました。

using WindowsGame1.Tile;

および参照:

Tile tile;

このタイルクラスは、これに対する解決策を見つけようとしたときに見つけた提案によると、それでも同じエラーが発生し、ゲームがビルドされません。このXMLを機能させるために何を変更する必要があるか知っている人はいますか?

XMLを解析する必要のあるコードは次のようになりますが、現時点では、コンパイルできるようになるまですべてコメント化されています。

namespace WindowsGame1
{
    class ActionScreen : GameScreen
    {
        public ActionScreen(Game game, SpriteBatch spriteBatch, String file,  AnimatedSprite sprite)
            : base(game, spriteBatch)
        {
            this.file = file;
            this.sprite = sprite;
            initializeTiles();
        }

        private void initializeTiles()
        {
            XPathDocument doc = new XPathDocument(file);
            XPathNavigator nav = doc.CreateNavigator();
            XPathNodeIterator iter = nav.Select("tile");

            while (iter.MoveNext())
            {
                int x, y;
                string fileName;

                x = int.Parse(iter.Current.GetAttribute("X", ""));
                y = int.Parse(iter.Current.GetAttribute("Y", ""));
                fileName = iter.Current.GetAttribute("ImageName", "");

                Console.WriteLine(x + " " + y + " " + fileName);
            }
        }
    }
}
4

3 に答える 3

3

XNAコンテンツパイプラインを使用してXMLファイルをコンテンツとして構築しようとしているようです-したがって、私の答えは、あなたが会ったすべてのXPathのものをスキップします-あなたはそれを必要としません。

エラーが参照している「逆シリアル化」は、コンテンツパイプラインがXMLをオブジェクトインスタンスに変換しようとしている場合です。次に、そのオブジェクトを取得してXNBファイルに書き込みます。後でゲームを実行すると、そのXNBファイルがオブジェクトインスタンスに読み込まれます。

どのオブジェクトのインスタンスですか?さて、あなたの場合、WindowsGame1.Tileオブジェクト。コンテンツパイプラインは、オブジェクトが何であるかをどのように認識しますか?あなたがそれについてそれについて言わない限り、それはそうではありません-それ故にエラーメッセージ。WindowsGame1.Tile


これをどのように修正しますか?

WindowsGame1.Tileコンテンツパイプラインプロジェクトの型を含むアセンブリを参照する必要があります。

ゲームプロジェクトを直接参照することはできません。循環依存関係が作成されるためです(ゲームプロジェクトはすでにコンテンツプロジェクトに依存しています)。

したがって、ゲームプロジェクトとコンテンツプロジェクトの両方から参照する別のアセンブリ(新しい「ゲームライブラリプロジェクト」を作成)にタイプを配置する必要がありWindowsGame1.Tileます(コンテンツプロジェクトを右クリックし、参照を追加し、プロジェクト参照を追加します)。

次に、コンテンツマネージャーを介してゲーム内にタイルをロードできます。

Tile myTile = Content.Load<Tile>("assetName");

XMLの形式について別のエラーが発生した場合(私はエラーをスパイしていると思いますが、チェックしていません)、タイプのダミーインスタンスを作成して、それが何であるかを理解しTile、を使用IntermediateSerializer.Serializeして生成することができます適切なXML。これを行う方法の例を次に示します

于 2012-09-04T05:55:49.080 に答える
0

正しく逆シリアル化するには、プロパティ名をXMLと実際のクラスで同じにする必要があります。Tileクラスでプロパティ「imageName」の名前を「image」に変更してみてください。

于 2012-09-02T21:26:10.710 に答える
0

問題はGetAttribute()、代わりにメソッドを使用していることSelect("X").Valueです。たとえば、代わりに

x = int.Parse(iter.Current.GetAttribute("X", ""));

試す

x = int.Parse(iter.Current.Select("X").Value, string.Empty));

System.Xml.Serlization.XmlSerializerクラスは使いやすいので検討することもできますが、使用しているXNAフレームワークのバージョンに含まれているかどうかはわかりません。

于 2012-09-03T02:10:01.097 に答える