【问题标题】:Serializing a DrawableGameComponent as XML using XNA's ContentTypeWriter class使用 XNA 的 ContentTypeWriter 类将 DrawableGameComponent 序列化为 XML
【发布时间】:2009-06-16 00:59:16
【问题描述】:

我正在用 XNA 编写一个小型 2D 射击游戏,我决定这样可以在游戏中实现自定义内容,它会从 XML 文件加载游戏对象的定义。当我发现 XNA 有一个易于使用的 XML 序列化器时,它变得更加简单。问题是,我要序列化的对象是DrawableGameComponents。 XNA 的 XML 序列化程序,ContentTypeWriter 类,您可以扩展它来创建自定义内容编写器,它要求对象有一个没有默认参数的构造函数。但是,DrawableGameComponent 在其构造函数中需要一个Game 对象,并且在对象初始化后不允许您设置游戏。但是,我无法充分修改ContentTypeWriter 的行为以接受非空白构造函数,因为内容是通过完全不同的方法加载的,我无法覆盖。所以基本上我有这个:

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

ContentTypeWriter 需要不带参数的构造函数。但我无法创建一个,因为这样我就无法将 Game 对象放入 Star 类中。我无法将其设为DrawableGameComponent,但我试图将这些对象与主要游戏类分离,以便我可以重用它们等,而如果没有Game 对象,这将非常困难。因此,我的问题是,有没有人知道如何修改 ContentTypeWriter 以允许带有参数的构造函数或任何解决方法?

我还考虑过使用 XPath 或 Linq XML 类编写我自己的 XML 解析代码,但是如果我在项目中有任何 XML 文件不遵循 XNA 架构并且不会构建,那么 XNA 会很合适。编写一个只包含类的主要字段和使用装饰器模式的DrawableGameComponent 版本的基类,并且只序列化基类是否合理?我正在拔头发试图解决这个问题,并想知道在这种情况下我到底应该做什么。

【问题讨论】:

    标签: c# xml xna


    【解决方案1】:

    我也在通过解析关卡文件来构建关卡,并且我使用 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多