簡體   English   中英

如果類擁有結構,那么實例擁有什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM