Сразу хочу оговорить, что данная статья будет полезна, скорее всего, в основном, новичкам, ибо более опытные товарищи, вероятнее всего, все описанное ниже знают и так. В любом случае - если статья Вам хоть немного поможет - буду рад.
Итак...
Думаю, многие сталкивались с необходимостью сохранять и, в последствии, выгружать данные, необходимые для игры. Для этой цели можно воспользоваться стандартной функцией game_save(filename). Однако, бывают такие случаи, когда данная функция не подходит.
Пожалуйста, поймите, что сохраняются только основные данные игры. Если, например, проигрывается определённый отрезок музыки, то точная его позиция не сохраняется. Также не сохраняются изменённые ресурсы. Не сохраняются и такие вещи как: дата-структуры, частицы и установки многопользовательской игры.
То есть, многие нужные нам данные могут попросту не сохраниться. А это порой бывает немалой проблемой.
Не подтверждено: я могу ошибаться, но стандартные сохранения, вроде бы, могут конфликтовать при различиях версий игры. То есть, старые сохранения не будут загружаться в более новой версии игры. Однако, как я уже говорил, я могу ошибаться, ибо лично не встречался с такой проблемой.
Для сохранения нужных нам данных можно воспользоваться ini-файлами. С ними просто обращаться, легко создать и отредактировать. Однако, в большинстве случаев, именно легкость в редактировании можно приписать к недостаткам ini-файлов. Ведь если можно открыть их простым Блокнотом и отредактировать любое значение - что помешает игроку добавить себе денег/жизней/чего-либо еще? Поэтому, на мой взгляд, ini-файлы можно использовать для хранения не столь жизненно важных данных. Например - хранение данных игровых настроек.
Итак, мы хотим создать ini-файл и иметь возможность взаимодействовать с ним непосредственно из игры.
Для начала создадим его. Сделать это можно через простой Блокнот. Для этого открываем его, нажимаем "Сохранить как..." и называем файл любым именем, не забыв после имени поставить ".ini". (Например, "settings.ini"). ini-файл создан.
Теперь перейдем к его наполнению. ini-файл включает в себя Секции (записываются "[section_name]" (ясное дело, без кавычек)), которые, в свою очередь, включают в себя Ключи. Ключи могут быть двух видов: числовые и строковые. Думаю, не стоит говорить, чем они отличаются.
Вот, мы создали ini-файл и прописали в нем, допустим:
[Game Settings]
max_score=999
max_exp=100
[Names]
npc_name1=Voldeniaar
Примечание: количество возможных секций и ключей неограничено для одного файла. Также, необязательно делать несколько секций, можно обойтись одной, однако, это будет не очень удобно при редактировании ini-файла (будет тяжелее ориентироваться, если у Вас множество разных ключей. Однако, если у ключей у Вас мало - можете использовать одну секцию).
Мы создали две секции: секцию "Game Settings" с двумя числовыми ключами "max_score" и "max_exp" и секцию "Names" со строковым ключом "npc_name1". Как теперь нам все это считать?
Game Maker предоставляет гибкие возможности по взаимодействию с ini-файлами, от просто считывания информации и записи новых данных, до полного удаления самого файла. Однако, сейчас нам нужно лишь считать данные. Для этого, в нужном нам событии (Create, Game Start, Room Start, или еще где-нибудь) прописываем строку:
ini_open('settings.ini');
Я написал settings.ini, однако, Вам следует прописать то имя, которое Вы указали при созранении ini-файла.
Это важно: Имя файла обязательно должно быть заключено в апострофы. В противном случае Game Maker выдаст нам ошибку, ибо примет наше название за переменную.
Это тоже важно: наш ini-файл обязан быть в одной папке с файлом игры. Иначе игра его просто не найдет и создаст новый с теми данными, которые Вы задали по умолчанию (об этом ниже).
Итак, мы открыли файл для чтения. Приступим непосредственно к считыванию данных:
max_score=ini_read_real('Game Settings','max_score',0); //Считывание значения ключа "max_score" из секции "Game Settings" и присваивание данного значения переменной max_score. (Названия секции и ключа также необходимо заключать в апострофы)
nps_name=ini_read_string('Names','npc_name1',''); //Этой функцией мы считываем строковые данные ключа "npc_name1" из секции "Names". Все то же самое, что и при считывании числовых данных, кроме того, что результат будет строкой.
Это важно: последний аргумент функций ini_read_real и ini_read_string (в данном случае у меня это 0 и '' (пустая строка)) - это значение, которое будет выдаваться программе по умолчанию. То есть, при случайном удалении ini-файла, программа не выдаст ошибку, а примет за значения переменных те значения, которые вы задали в этих функциях. А при переписывании данных под этими ключами - нужные секции и ключи будут созданы автоматически.
Итак, данные считаны, значения присвоены переменным, и ini-файл нам пока что больше не нужен. Чтобы он нам не мешал - необходимо закрыть его:
ini_close();
На этом все. Я проиллюстрировал минимум возможных манипуляций с ini-файлами. Остальные функции для взаимодействия с ними приведены в справке:
ini_open(name) Открывает INI файл с именем name. Файл должен храниться в папке с игрой.
ini_close() Закрывает открытый INI файл (нельзя открыть несколько INI файлов одновременно).
ini_read_string(section,key,default) Возвращает строковое значение записи из секции section, с ключом key. Если такой пары ключ-значение не существует, то возвращается строка default.
ini_read_real(section,key,default) Возвращает числовое значение записи из секции section, с ключом key. Если такой пары ключ-значение не существует, то возвращается число default.
ini_write_string(section,key,value) Записывает в секцию section пару с ключом key и строковым значением value.
ini_write_real(section,key,value) Записывает в секцию section пару с ключом key и числовым значением value.
ini_key_exists(section,key) Возвращает true, если в секции section существует ключ key.
ini_section_exists(section) Возвращает true, если секция с именем section существует.
ini_key_delete(section,key) Удаляет ключ с именем key из секции с именем section.
ini_section_delete(section) Удаляет секцию с именем section.
Используя эти функции, Вы можете редактировать ini-файл так, как вам необходимо.
В следующей статье я рассмотрю использование файлов для сохранения необходимых нам данных, что позволит лучше защитить их, чем ini-файл. Хотел вместить все это в одну статью, однако, при взгляде на написанное выше, понял, что следует их разделить.
Также приношу извинения за отсутствие примера, иллюстрирующего статью. Он будет вместе со следующей статьей. Благодарю за понимание.
P.S. Критикуем. Указываем на ошибки,
минусуем даем советы по улучшению статьи, говорим что плохо, что хорошо.