[英]If classes hold the structure, what holds the instances?
假設我有我的班級:
public class Level
{
public Vector2 dogStart;
public List<Pickup> pickups;
public string backgroundAsset;
public Level()
{
pickups = new List<Pickup>();
}
}
如何存儲/加載Level類的實例? XML文件? 是否創建ClassOne,LevelTwo等類和硬編碼? 在XNA中推薦的方法是什么?
這也是在假設我真的沒有時間進行編輯的情況,因此例如XML對我來說可以手動鍵入非常方便。 但是對於XML,我該怎么做? 我將使用什么系統將XML文件加載到Class Level的實例中?
我最終使用了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>
硬編碼類可能會使擴展游戲變得更加困難,您必須對每個級別進行編碼。 XML是一種相當不錯的方法,因為每個級別的數據量可能很小。
您可以使用Linq-to-XML XElement加載XML數據。 XNA Framework 3.0和更高版本中支持這些類。
隨你怎么便; 請參閱有關“數據序列化”的任何文章。
如果您想要人類可讀的內容,則CSV是另一種常見的,非常簡單的文件格式,用於存儲級別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.