Если классы содержат структуру, что содержит экземпляры? - PullRequest
1 голос
/ 31 января 2010

Допустим, у меня есть уровень моего класса:

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 ]

1 голос
/ 02 февраля 2010

В итоге я использовал класс XmlSerializer .

Я начал с создания одного корневого класса данных; наша игра называлась Outrage, поэтому я назвал ее OutrageGameInstance. У этого класса был один экземпляр Dog (наш главный герой), список возможных типов предметов для пикапа и список уровней. Каждая из этих структур имела другие переменные данных. Любые переменные, которые мне не нужны в XML-файле, я просто написал [NonSerializable] в строке над объявлением переменной. В ходе экспериментов я также обнаружил, что сериализуются только общедоступные переменные, поэтому я мог скрывать вещи в частных переменных.

В любом случае, я закомментировал обычный бит в Program.cs и вставил некоторый код для создания примера экземпляра OutrageGameInstance, а затем сериализовал его с помощью XmlSerializer. Это дало мне файл, который я мог затем настроить вручную, и, как вы видите ниже, синтаксис действительно прост для понимания и добавления. Я переключил обратно файл Program.cs и поместил XML-файл в проект Content. В свойствах XML-файла измените действие сборки на «none» (ошибки при компиляции) и задайте его всегда копировать в выходной каталог.

Тогда это просто вопрос использования XmlSerializer для десериализации XML-файла в функции Initialize класса Game и использования данных по своему усмотрению!

Это был мой файл данных, просто чтобы показать вам, как легко было редактировать:

<?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 голосов
/ 31 января 2010

Как хочешь; см. любую статью о «сериализации данных».

Если вы хотите что-то удобочитаемое человеком, CSV - это еще один распространенный, очень простой формат файла для хранения уровней.

0 голосов
/ 31 января 2010

Классы жесткого кодирования, вероятно, затруднят расширение вашей игры, вам придется кодировать каждый уровень. XML - довольно хороший подход, поскольку объем данных для каждого уровня, вероятно, невелик.

Вы можете использовать XElement Linq-to-XML для загрузки данных XML. Эти классы поддерживаются в XNA Framework 3.0 и новее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...