Сериализация DrawableGameComponent как XML с использованием класса XNA ContentTypeWriter - PullRequest
0 голосов
/ 16 июня 2009

Я пишу небольшую 2D-игру-шутер на XNA, и я решил, что для того, чтобы можно было реализовать в игре контент, созданный по заказу, он загружает определения игровых объектов из файлов XML. Когда я узнал, что XNA имеет простой в использовании XML-сериализатор, он сделал его очень простым. Проблема в том, что мои объекты, которые я хочу сериализовать, DrawableGameComponent s. XML-сериализатор XNA, класс ContentTypeWriter, который вы расширяете для создания пользовательских средств записи содержимого, требует, чтобы у объекта был конструктор без аргументов по умолчанию. DrawableGameComponent, однако, требует в своем конструкторе объект Game и не позволит вам установить игру после инициализации объекта. Однако я не могу изменить поведение ContentTypeWriter достаточно, чтобы принять непустой конструктор, потому что содержимое загружается совершенно другим методом, который я не могу перезаписать. По сути, у меня есть это:

class Star : DrawableGameComponent{
    public Star(Game game)
        : base(game)
    {
    }
}

С ContentTypeWriter, требующим конструктор без аргументов. Хотя я не могу его создать, потому что тогда у меня нет возможности поместить объект Game в класс Star. Я просто не могу сделать это DrawableGameComponent, но я пытаюсь отделить эти объекты от основного класса игры, чтобы я мог их повторно использовать и т. Д., И без объекта Game это нелепо сложно. Поэтому мой вопрос: кто-нибудь знает, как изменить ContentTypeWriter достаточно, чтобы конструктор мог иметь аргументы, или каким-либо образом обойти это?

Я также думал о написании собственного кода синтаксического анализа XML с использованием XPath или классов Linq XML, но XNA выбрасывает, если у меня есть какие-либо файлы XML в проекте, которые не следуют схеме XNA и не будут собираться. Было бы разумно написать базовый класс только с первичными полями класса и версией DrawableGameComponent, использующей шаблон декоратора, и сериализовать только базовый класс? Я вырываю свои волосы, пытаясь обойти это, и задаюсь вопросом, что именно я должен делать в этой ситуации.

1 Ответ

2 голосов
/ 18 июня 2009

Я также строю уровни с помощью разбора файлов уровней, и я использую System.Xml для загрузки данных. Я изменил свойства XML-файла, который добавил к следующему: Действие построения: нет Копировать в выходной каталог: Копировать, если новее

тогда я написал такой код:

public static LevelInfo LoadLevel(
    string xmlFile, 
    GraphicsDevice device, 
    PhysicsSimulator sim, 
    ContentManager content)
{
    FileInfo xmlFileInfo = new FileInfo(xmlFile);

    XDocument fileDoc = XDocument.Load(xmlFile);
    //this part is game specific
    LevelInfo levelData = new LevelInfo();
    levelData.DynamicObjects = LevelLoader.LoadDynamicObjects(device, sim, content, xmlFileInfo, fileDoc);
    levelData.StaticObjects = LevelLoader.LoadStaticObjects(device, sim, content, xmlFileInfo, fileDoc);
    levelData.LevelAreas = LevelLoader.LoadAreas(device, xmlFileInfo, fileDoc);
    return levelData;
}

Это просто пример, но он позволяет вам строить объекты так, как вам хочется, с любыми данными XML, которые вы хотите.

Для любопытных, вот XML-файл:

<Level>
  <Object Type="Custom" 
          PositionX="400" 
          PositionY="400" 
          IsStatic="true"
          Rotation="0"
          Texture="sampleObj1_geometrymap"
          Mass="5"
          ColorR="0"
          ColorG="255"
          ColorB="0">
  </Object>
  <Object Type="Custom"
          PositionX="400"
          PositionY="600"
          IsStatic="false"
          Rotation="0"
          Texture="sampleObj2_geometrymap"
          Mass="5"
          ColorR="230"
          ColorG="230"
          ColorB="255">
  </Object>
  <Object Type="Area"
          MinPositionX="0"
          MinPositionY="0"
          MaxPositionX="300"
          MaxPositionY="300"
          AreaType="Goal">
  </Object>
</Level>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...