2010-01-30 38 views
1

比方说,我有我的一流水平:如果类拥有结构,那么实例是什么?

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

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

如何存储级别类/负载情况? XML文件?我是否创建了LevelOne类,LevelTwo类等以及硬编码? XNA推荐的方式是什么?

这也假设我没有时间去编辑器,所以例如XML对我来说可以非常方便手动输入。但在XML的情况下,我将如何做到这一点?我将使用什么系统将XML文件加载到类Level的实例中?

回答

1

我结束了使用类。

我开始创建一个根数据类;我们的游戏被称为愤怒,所以我将其命名为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> 
+0

进一步扩展这个答案,我与Xbox试验360场比赛在过去的这个周末,结果发现,只要XML文件被放入内容管道(并且设置为始终复制到输出),它们被部署并可以在Xbox上读取! – Ricket 2010-03-01 21:36:49

0

硬编码类可能会让你的游戏更难扩展,你必须编码每个级别。 XML是一种相当好的方法,因为每个级别的数据量可能很小。

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

0

但是你想要;看到关于“数据序列化”的任何文章。

如果你想要一些人类可读的东西,CSV是另一种常见的,非常简单的文件格式来存储级别。

相关问题