← к содержанию

Урок 6. Подробнее о настройках

В этом уроке мы вновь коснёмся темы настроек программы. Во 3-м уроке уже был описан формат файла настройки_ddd.cfg, используемый библиотекой DDD для определения параметров окна приложения. Здесь мы научимся объявлять наши собственные настройки, которые можно использовать в своей программе. Фактически, этот и следующий уроки на самом деле о библиотеке my_utils, а не о DDD, так что если вам неинтересно или не требуется определять свои собственные настройки и вести журнал событий (тема следующего урока), то можете их пропустить и перейти сразу к уроку 8.

У большинства программ бывают какие-то параметры, которые влияют на её поведение. Это, например:

Как уже было сказано, в этом уроке мы определим текстовый файл с настройками. Одним из достоинств этого подхода является возможность в любой момент открыть такой файл в текстовом редакторе и быстро поправить нужное значение без перекомпиляции программы. Определённым недостатком (по сравнению с использованием баз данных) является необходимость явного определения в программе каждого требуемого параметра, что может показаться неудобным при достаточно большом количестве этих параметров. Библиотека my_utils позволяет определить собственный набор параметров, их типов и значений по-умолчанию, которые могут присутствовать в файле настроек. Допустимые типы параметров в файле настроек (возможно, в дальнейшем этот список будет расширен):

long, double, string, long[], double[], string[], string[string].

Начнём.

  1. За работу с настройками отвечает модуль my_utils.nastroyki_struct. Создайте новый модуль nastroyki.d и добавьте туда строку импорта:

module nastroyki;

import my_utils.nastroyki_struct;
  1. Для определения того, какие параметры использует программа, требуется определить кортеж типа AliasSeq (из модуля стандартной библиотеки std.meta), но отдельно нам не требуется его импортировать. В этом уроке мы создадим всего два параметра нашей маленькой программы, в более поздних уроках мы расширим их количество по мере надобности. Особо не заморачиваясь, назовём наш кортеж Кортеж_Настроек:

alias Кортеж_Настроек = AliasSeq!( 
);
    1. В предыдущем уроке мы передали в функцию инициализация_ddd явно заданный в программе массив с путями к ресурсам программы. Теперь мы определим параметр программы ресурсы, чтобы можно было прописывать эти пути в настройках. Внутри круглых скобок впишите:

string[],      "ресурсы",     "[\".\"]",

Сначала мы объявляем тип параметра (в нашем случае массив строк), затем его название, и, последним идёт значение по-умолчанию. Если в файле с настройками некий параметр отсутствует, то его всё равно можно использовать, просто его значение будет браться из значения по-умолчанию. В данном случае это будет массив ["."], т. е. текущий каталог. Для строк в значениях по-умолчанию требуется использовать экранирование кавычек символом \.

    1. В учебных целях (и просто из интереса) определим ещё один параметр – цвет светильника лампа1. В 4-м уроке мы сделали её фиолетовой, теперь её цвет будет задаваться в файле настроек:

double[],       "цвет_лампы1", "[1,1,1,1]",

Её значением по-умолчанию будет нейтральный белый цвет.

  1. Теперь определим, как будет называться наш файл, из которого мы будем читать настройки:

enum ИМЯ_ФАЙЛА_С_НАСТРОЙКАМИ = "настройки.cfg";

Имя константы не является предопределённым, можете назвать её как-то по-другому, или вообще её не определять (и, тогда на шаге 6 аргументом функции будет строка с именем файла вместо константы). Также и имя файла может быть любым, если хотите, исправьте на то, что вам кажется более подходящим.

Отдельно скажу про использование имени "настройки_ddd.cfg". Если вы используете бублиотеку DDD, то, как было сказано в 3 уроке, такой файл почти всегда должен присутствовать в ваших проектах. Вы можете и свои настройки прописать в него же, если зададите своим настройкам такое имя файла. Единственный нюанс – вам нужно будет самостоятельно следить, чтобы названия ваших параметров не конфликтовали с названиями параметров настроек ddd. Полный список параметров настроек ddd можно увидеть в исходном тексте модуля ddd.nastroyki_ddd библиотеки DDD.

  1. Осталось объявить саму переменную с настройками. Для этого объявляем экземпляр структуры Настройки, параметризованной нашим кортежем:

Настройки!Кортеж_Настроек настройки;

Именно к ней мы будем обращаться при получении значения того или иного параметра.

  1. С модулем nastroyki.d мы закончили, откройте теперь файл urok.d, и проимпортируйте там наш новый модуль:

import nastroyki;
  1. Первой строкой функции main вставьте чтение наших настроек из нужного файла:

настройки.прочитать_настройки_из_файла(ИМЯ_ФАЙЛА_С_НАСТРОЙКАМИ);
  1. Замените строку с вызовом функции инициализация_ddd на такую:

инициализация_ddd(настройки.ресурсы);
  1. Поправим также файл scena.d.

    1. Добавьте в него импорт нашего модуля (это нужно делать везде, где будут читаться какие-либо параметры настроек), а также модуля стандартной библиотеки std.conv, используемого для преобразования типов:

import std.conv;
import nastroyki;
    1. Поправим строку, где определяется цвет светильника лампа1 (у меня это была 18-я строка):

лампа1.задать_диффузный_свет(to!(float[4])(настройки.цвет_лампы1));

Возможно, преобразование типов с помощью шаблона to! выглядит несколько неуклюже, но, чтобы этого не делать в ЛЮБОМ случае, пришлось бы в допустимых типах параметров настроек предусмотреть все возможные типы языка d, и что ещё неприятнее, их массивы самых разных размеров. А без этого, если бы даже массив float[] был допустимым типом, его всё равно пришлось бы приводить к типу float[4] для использования в качестве цвета.

  1. Если теперь скомпилировать и запустить наше приложение, то произойдут две неприятные вещи: во первых, появится предупреждение «Не найден файл с настройками настройки.cfg», а во-вторых программа упадёт с ошибкой на попытке найти файл с мешем, ведь у неё теперь нет нужного каталога с ресурсами.

  2. Наконец-то добавляем в каталог bin сам файл настройки.cfg. Пока что добавьте в него лишь одну строку:

ресурсы = ["ресурсы/меши/", "ресурсы/текстуры/", "ресурсы/объекты/", "ресурсы/инфопанели/", "ресурсы/шрифты/", "ресурсы/скелеты/"]

Таким образом мы указали нашему приложению, где искать все ресурсы. Запускаем:


Т.к. мы не включили в файл настроек цвет светильника, то используется значение по-умолчанию, т. е. белый цвет.

  1. Ну, и напоследок, добавим цвет нашей лампы. Ради разнообразия пусть это будет синий:

цвет_лампы1 = [0.1, 0.1, 1, 1]

Ничего не перекомпилируя, запускаем снова:



Этот урок получился чуть больше, чем предыдущие, т. к. хотелось уже всё про эти настройки рассказать и больше не возвращаться к этому вопросу. В дальнейших уроках мы, при необходимости, добавим к нашим настройкам ещё пару-тройку параметров.