如果类包含结构,那么实例是什么?

时间:2010-01-30 21:19:19

标签: c# xml xna

让我说我的班级水平:

public class Level
{
    public Vector2 dogStart;
    public List<Pickup> pickups;
    public string backgroundAsset;

    public Level()
    {
        pickups = new List<Pickup>();
    }
}

如何存储/加载Level类的实例? XML文件?我是否创建了LevelOne类,LevelTwo类等硬编码? XNA推荐的方式是什么?

这也是假设我没有时间去编辑,所以例如XML对我来说非常方便能够手动输入。但就XML而言,我该怎么做?我将使用什么系统将XML文件加载到类Level的实例中?

3 个答案:

答案 0 :(得分:1)

我最终使用了XmlSerializer类。

我开始创建一个根数据类;我们的游戏被称为Outrage,因此我将其命名为OutrageGameInstance。这个类有一个Dog实例(我们的主角),一个可能的拾取项类型列表和一个级别列表。这些结构中的每一个都有其他数据变量。我在XML文件中不想要的任何变量,我只是在变量声明上方的行中写了[NonSerializable]。我还通过实验发现只有公共变量被序列化,所以我可以隐藏私有变量中的东西。

无论如何,我注释掉Program.cs中的常用位并输入一些代码来创建OutrageGameInstance的示例实例,然后使用XmlSerializer对其进行序列化。这给了我一个文件,然后我可以手动调整,如下所示,语法真的很容易理解和添加。我切换回Program.cs文件,并将XML文件放入Content项目中。在XML文件的属性中,将构建操作更改为“无”(编译错误)并将其设置为始终复制到输出目录。

然后,只需使用XmlSerializer在Game类的Initialize函数中反序列化XML文件,然后使用您想要的数据!

这是我的数据文件,只是为了向您展示编辑的简便性:

<?xml version="1.0" encoding="utf-8"?>
<OutrageGameInstance xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <dog>
    <scale>
      <X>0.3</X>
      <Y>0.3</Y>
    </scale>
  </dog>
  <pickupTypes>
    <PickupType>
      <picture>Bone</picture>
      <collideSound>BoneMunch</collideSound>
      <animationType>none</animationType>
      <scoreValue>5</scoreValue>
      <scale>
        <X>0.3</X>
        <Y>0.3</Y>
      </scale>
    </PickupType>

  </pickupTypes>
  <levels>
    <Level>
      <playerStart>100</playerStart>
      <dogHead>Level1/dog_head</dogHead>
      <dogTail>Level1/dog_tail</dogTail>
      <floor>668</floor>
      <name>Flowers!</name>
      <background>Level1/background</background>
      <foreground>Level1/foreground</foreground>
      <pickupInstances>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>50</X>
            <Y>50</Y>
          </location>
        </PickupInstance>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>850</X>
            <Y>50</Y>
          </location>
        </PickupInstance>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>300</X>
            <Y>250</Y>
          </location>
        </PickupInstance>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>600</X>
            <Y>250</Y>
          </location>
        </PickupInstance>

      </pickupInstances>
      <gravity>0.3</gravity>
      <backgroundMusic>BackgroundMusic1</backgroundMusic>
      <madMeter>Level1/thermo_happy</madMeter>
    </Level>
    <Level>
      <playerStart>100</playerStart>
      <dogHead>Level1/dog_head</dogHead>
      <dogTail>Level1/dog_tail</dogTail>
      <floor>668</floor>
      <name>Flowers!</name>
      <background>Level1/background</background>
      <foreground>Level1/foreground</foreground>
      <pickupInstances>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>50</X>
            <Y>250</Y>
          </location>
        </PickupInstance>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>850</X>
            <Y>250</Y>
          </location>
        </PickupInstance>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>300</X>
            <Y>50</Y>
          </location>
        </PickupInstance>
        <PickupInstance>
          <type>Bone</type>
          <location>
            <X>600</X>
            <Y>50</Y>
          </location>
        </PickupInstance>

      </pickupInstances>
      <gravity>0.3</gravity>
      <backgroundMusic>BackgroundMusic1</backgroundMusic>
      <madMeter>Level2/thermo_inshock</madMeter>
    </Level>

  </levels>
</OutrageGameInstance>

答案 1 :(得分:0)

硬编码类可能会使你的游戏扩展变得更加困难,你必须对每个级别进行编码。 XML是一种相当不错的方法,因为每个级别的数据量可能很小。

您可以使用the Linq-to-XML XElement加载XML数据。 XNA Framework 3.0及更高版本支持这些类。

答案 2 :(得分:0)

但是你想要;请参阅有关“数据序列化”的任何文章。

如果你想要人类可读的东西,CSV是另一种常见的,非常简单的文件格式,用于存储关卡。