Настройки игры Monogame - PullRequest
       9

Настройки игры Monogame

0 голосов
/ 01 января 2019

Я разрабатываю платформер, используя C # и моногаму, как забавный проект для улучшения моих навыков.Я хочу добавить поддержку таких настроек, как аудио, видео, элементы управления и многое другое, но я не знаю, как лучше всего это сделать.

Я планирую получить файл XML, в котором будут храниться все настройки, например:

<Settings>
  <Audio>
    <masterVolume>100</masterVolume>
    <musicVolume>40</musicVolume>
    <sfxVolume>90</sfxVolume>
  </Audio>
  <Video>
    <Resolution>
      <width>1920</width>
      <height>1080</height>
    </Resolution>
  </Video>
  <Controls>
    <forward>W</forward>
    <back>S</back>
    <left>A</left>
    <right>D</right>
  </Controls>
</Settings>

Я планировал использовать класс Settings, который имеет статические переменные для аудио, видео, элементов управления и т. Д., Которые разделены на отдельные классы, чтобы я мог получить к ним доступ через Settings.Audio.MasterVolume или Settings.Controls.Forward .Я хочу загрузить настройки в эти классы из XML с помощью Linq, и я хочу сохранить настройки в файл XML, когда они изменяются пользователем.

Я знаю, что синглтоны также можно использовать, но, насколько я могу судить из проведенного мною исследования, у него слишком много недостатков.Это правда?

Это хороший способ сделать это, или есть лучший способ, который позволяет мне получить доступ к настройкам по всему проекту, не имея все статическое?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Ваш метод работает.Однако вы ограничиваете повторное использование вашего класса.

Если бы вы описали MyClass другим, не могли бы вы сказать, что метод, используемый для чтения параметров конфигурации, необходим для MyClass?Другими словами: будет ли большая часть кода вашего класса бессмысленной, если параметры конфигурации не будут считываться из файла конфигурации, но, например, из CSV-файла, или из Интернета, или каким-либо другим способом?

Вы, вероятно, скажете «нет»: большая часть кода моего класса может быть повторно использована, если параметры конфигурации должны быть предоставлены по-другому.

Так зачем ограничивать ваш класс классом, который может работать, только если он читает параметры конфигурации изфайл конфигурации?

Я полагаю, что у вас сейчас есть что-то вроде:

static class ConfigurationSettings
{
    public static int LeftControl => ...
    public static int RighControl => ...
}

class MyClass
{
    // MyClass uses configuration settings:
    public int LeftControl => ConfigurationSettings.LeftControl;
    public int RightControl => ConfigurationSettings.RightControl;

    ...
}

Вы не можете создать два объекта MyClass, каждый из которых имеет свой собственный набор параметров конфигурации.Вы не можете создать MyClass объект, который использует другой метод предоставления значений конфигурации.

Один из случаев использования, который мне часто нужен, это когда выполняется модульное тестирование: я хочу быстрый способ, чтобы иметь возможностьизменить настройки конфигурации без необходимости изменения файла конфигурации проекта модульного тестирования.

Простой способ позволить пользователям вашего класса предоставлять различные методы настройки - создать интерфейс с настройкой и предоставить конструкторс этим интерфейсом:

interface IMySettings
{
    int LeftControl {get;}
    int RightControl {get;}
    ...
}

class ConfigurationSettings : IMySettings
{
     // ConfigurationSettings reads settings from the configuration file
}

class MyClass
{
    // default constructor use the configuration file via ConfigurationSettings:
    public MyClass() : this (new ConfigurationSettings())
    {
    }

    // extra constructor for those who don't want to use configuration file
    public MyClass(IMySettings settings)
    {
        this.Settings = settings;
    }

    protected readonly IMySettings settings;

    // MyClass uses settings:
    public int LeftControl => this.settings.LeftControl;
    public int RightControl => this.settings.RightControl;
}

Пользователи, которые хотят использовать настройки из файла конфигурации, могут использовать конструкторы по умолчанию;использует тех, кто хочет конкретные настройки использовать альтернативный конструктор.Этот альтернативный конструктор также используется, если вам нужны два разных объекта MyClass, каждый со своими настройками.

На первый взгляд кажется, что с минимальными изменениями вы все равно можете использовать файл конфигурации.Однако для реализации интерфейса класс, который читает файл конфигурации (MyClass), не может быть статическим.

Однако вы были правы: существует только один файл конфигурации, следовательно, должен быть только один экземпляр класса, который читает из файла конфигурации: создайте одиночный файл.

По моему опыту,классы, представляющие конфигурацию, является одной из часто используемых причин использовать одиночный вместо статического класса

0 голосов
/ 02 января 2019

В моих игровых проектах я всегда использую некоторые статические классы (и / или переменные) для хранения информации, которая действительна на протяжении всей игры.Это может пригодиться, особенно для настройки звука, если вы хотите иметь возможность изменять громкость и так далее в разных точках игры.Это не обязательно включает только пользовательские настройки.Подумайте о снижении фоновой музыки, когда какой-то персонаж говорит.

Короче говоря: я бы пошел на статический подход.Но будьте осторожны, чтобы не превысить его.

...