В итоге я использовал класс 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>