[ AmberSkyNet VR ]

Продолжаем... Неспеша... Как там у Исссы - "тихо-тихо ползи, Улитка, по склону Фудзи.."

Пора делать парсинг ini-файла. Файла, в котором будут храниться всякие настройки - графические, сетевые, игровые. Пора и нам сделать такой файл.. Его местом расположения будет та папка, в которой лежит AmberSkyNet.exe, т.к. на момент старта программы нам неизвестны другие пути.
В констукторе класса Engine сделаем вызов функции разбора ini-файла. Т.к. эта операция однократная (или двукратная, если разбираются два ini-файла, - один из которых хранит настройки по умолчанию, а другой- текущие настройки ) то я не стал делать эту функцию членом класса Engine а просто вынес отдельно. И кроме CEngine её никто не видит.
Функция открывает ini-файл как файловый поток и построчно читает его, потом определяет что прочитали - комментарий (начинается с символа ';'), название раздела (начинается с символа '['), параметр=значение (присутствует символ '=') или просто пустую строку.

Вообще, планировал написать универсальный интерфейс парсера, одним из парсеров был бы парсер ini-файлов, но потом передумал.

Я не стал делать отдельный класс для хранения структуры ini-файла. Оно выглядит красиво, но по-моему не очень нужно, т.к. переменных окружения не так уж и много, чтобы хранить их еще и иерархически.
При разборе ini-файла название раздела будет присоединяться к названию параметра и в таком виде заноситься в переменные окружения класса Engine.

Например в ini-файле есть следующие строки:


...
[Video]
Screen=800x600
MouseSens_X=150
MouseSens_Y=150
...
Тогда после разбора ini-файла классом CEngine мы можем читать эти параметры во внешней программе следующим образом:

ENGINE->GetPtrParam("[Video]Screen");
ENGINE->GetPtrParam("[Video]MouseSens_X");
ENGINE->GetPtrParam("[Video]MouseSens_Y");

После разбора ini-файла в конструкторе CEngine можно создавать различные менеджеры, подавая им на вход требуемый им путь или указатель на Engine (в этом случае они будут сами читать переменные окружения и в зависимости от их значений инициализироваться сами).

Изменения в исходниках

include/: Добавлен файл EngineStarter.h для "автоматической" загрузки модуля asnEngine.dll. Теперь к классу Engine можно обращаться используя макрос ENGINE (да, мне понравилось решение в SAVEngine 8), но у меня Engine вынесено в отдельный от Main модуль, поэтому обращаться напрямую к нему не получится - надо сначала загрузить asnEngine.dll).

src/asnCommon/: В файле утилитарных функций добавлена функция Trim - отбрасывание пробелов в начале и конце строки

src/asnMain/: Класс загрузки плагинов вынесен в asnEngine. Указатель на экземпляр класса движка получаем через использование макроса ENGINE.

src/asnEngine/: Сюда перенесен класс загрузки плагинов. Класс CEngine разбирает ini-файл и создаёт экземпляр класса загрузки плагинов. Загружаемый модуль asnEngine.dll создаётся в папке bin/, а не в папке plugins/.

Исходники этого шага выложены в SVN. Скачать их можно набрав команду:

svn co https://svn.sourceforge.net/svnroot/ambernet/tags/AmberSkyNet-0.4 ambernet_0.4
Powered by: SourceForge.net Logo