Найти тему

Сохранения в файл на Game Maker

Добрый день, дорогие читатели! Сегодня немного расскажу о том, как очень просто можно организовать сохранения/загрузку в файл/из файла на Game Maker новичкам. Этот способ будет работать без ошибок на всех платформах, включая Android, HTML5, Windows и пр.

Что можно сохранять в файл на Game Maker?

Для чего вообще может потребоваться запись в файл и чтение из него? Все значения, будь то кол-во набранных очков, кол-во жизней, кол-во и типы вещей в инвентаре героя, кол-во пройденных/открытых уровней и многое-многое другое - все это сохраняется в переменные. Но дело в том, что все эти значения хранятся в оперативной памяти, т.е. игра помнит их, пока она запущена и работает. Но стоит только выйти из игры/закрыть приложение, как тут же оперативная память обнуляется и соответственно все, что вы запомнили в переменных так же сбрасывается.

А если вы хотите запомнить прогресс игрока, чтобы он на следующий день продолжил играть, продолжая собирать очки с того места, где он остановился, с тем же кол-вом жизней, на котором он бросил играть в прошлый раз, и с теми же предметами? Тут на помощь приходит запись всех значений переменных в файл и чтение из него при новом запуске игры. Все, что вы запишите в файл хранится там даже после выключения компьютера.

Куда мы будем сохранять информацию?

Все свои данные мы будем сохранять в файл с расширением *.ini. Такие файлы могут открываться простым текстовым редактором и информация в них хранится в следующем виде:

Как хранится информация в ini-файлах
Как хранится информация в ini-файлах

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

В самой секции идут так называемые ключи (Keys), по сути это просто наименования переменных, которые мы храним в секции. Например, в секции настроек у нас могут быть ключи sound, music, language и т.д. Или ключи в секции инвентаря например могут быть такими как lives, coins и др.

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

Ну и наконец у каждого ключа есть свои значения (Values). Это уже сами значения необходимых нам переменных.

Секций в вашем файле сохранения можете делать сколько угодно, а можете оставить и всего одну. Тут все зависит только от вас, т.е. делайте так, как вам будет удобнее.

Краткий алгоритм записи в файл на Game Maker.

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

  • Открываем файл
  • Записываем в него необходимые данные
  • Закрываем файл

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

У вас в игре может быть даже несколько ini-файлов, в которые вы будете что-то записывать,но одновременно открытых файлов может быть только один! Запомните это! Т.е. если вы хотите в несколько ini-файлов записать информацию, то вам придется поочередно открывать сначала один, записывать в него, закрывать, затем второй.

Ну и для чтения все аналогично, как и для записи. Перед чтением из файла его необходимо сначала открыть. А прочитав данные обязательно закрыть. Если читаете из нескольких файлов, то делаете это по очереди.

Функции чтения и записи INI-файла на Game Maker.

Давайте сначала вкратце разберем некоторые функции, которые пригодятся нам для работы с ini-файлами на Game Maker. Я не буду писать их все, а только те, что пригодятся нам. Так же пока я не буду подробно объяснять их работу, а просто перечислю, а дальше на примере уже разберем их работу.

file_exists(имя файла) - эта функция проверяет существует ли данный файл и возвращает true, если он есть, или false, если его нет.

ini_open(имя файла) - эта функция открывает нужный нам файл для записи или чтения

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

ini_write_real(секция, ключ, значение) - эта функция записывает численное значение ключа в определенной секции ini-файла. Опять же, как видите, в этой функции нет параметра имени файла, указывающего в какой именно файл необходимо записать данные. Все потому же, что открытым файл может быть только один. Т.е. функция записывает в открытый в данный момент времени файл соответственно.

Если вы хотите записать строковое значение, например, какое-то имя, то используется функция ini_write_string(секция, ключ, значение). В этом уроке я ее разбирать не буду, но работает она аналогично функции ini_write_real(секция, ключ, значение).

ini_read_real(секция, ключ, значение по умолчанию) - эта функция читает численное значение ключа в определенной секции ini-файла. Опять же, как видите, в этой функции нет параметра имени файла, указывающего из какого именно файла необходимо прочитать данные. Все потому же, что открытым файл может быть только один. Т.е. функция читает из открытого в данный момент времени файла соответственно. Для чего необходим параметр значение по умолчанию? Это то значение, которое будет получено, если например в файле нет этого ключа и/или этой секции, с которой вы пытаетесь прочитать данные. Либо вообще нет даже такого файла, с которого вы пытаетесь читать.

Для чтения строковых значений используем ini_read_string(секция, ключ, значение по умолчанию). О них в данном уроке не пишу, но там все аналогично.

Вот собственно весь набор функций, которые нам необходимы для работы. Давайте уже наконец перейдем к написанию кода.

Код чтения и записи INI-файла на Game Maker.

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

Для начала давайте поясню, как мы будем создавать файл. Его можно создать вручную и отредактировать в текстовом редакторе. Но это не очень хороший способ, так как при распространении игры, этот отдельный файл может куда-то потеряться. По этому логичнее создавать файл прям кодом из игры при первом ее запуске.

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

Запись при первом запуске

Как правило такой код я рекомендую писать в событии создания самой первой комнаты вашей игры.

if !file_exists("mygamesetup.ini") {

ini_open("mygamesetup.ini")

ini_write_real("menu", "music", 1)

ini_write_real("menu", "sound", 1)

ini_write_real("menu", "language", 1)

ini_write_real("game" ,"score", 0)

ini_close()

}

Давайте чуть разберемся в возможно непонятных для вас моментах. Во-первых, для новичков может быть непонятна первая строчка с восклицательным знаком "!" перед функцией проверки файла. Если бы этого знака не было, то мы бы читали первую строчку как: Если файл "mygamesetup.ini" существует, то... (имя файла кстати вы конечно же придумываете свое). Восклицательный знак же как бы переворачивает значение функции, т.е. с ним она читается как: Если файл "mygamesetup.ini" НЕ существует, то... Это справедливо для всех функций Game Maker.

Т.е. мы проверяем, если у нас нет такого файла, то мы открываем его следующей строкой и начинаем что-то записывать. У некоторых новичков порой возникает вопрос, а в каком месте кода мы создаем сам файл? А тут дело в том, что любая функция записи, будь то ini_write_real или ini_write_string, если файла не существует, то она автоматически создает его, чтобы записать что-то.

Считайте, что третья строка в коде ini_write_real("menu", "music", 1) как раз таки создает файл.

Зачем мы все эти строчки завернули в проверку наличия этого файла? А дело в том, что далее игрок например в настройках игры отключит звук и музыку и сохранит эти настройки в данный ini-файл, т.е. ключ "music" и "sound" в секции "menu" файла "mygamesetup.ini" примут значения "0". И когда он выйдет из игры и запустит ее заново, то не будь проверки наличия файла, "music" и "sound" снова бы приняли значения "1". А так как он уже создан, то отключенные игроком ранее звук и музыка сохранятся. Думаю с этим моментом вы разобрались.

Чтение при старте

Как правило тут же после вышеуказанного куска кода я рекомендую сразу прочитать необходимые нам данные. Это можно сделать прям там же в событии создания первой комнаты, если переменные у вас глобальные. Думаю данный код объяснять уже не нужно. Открываем файл, читаем необходимые нам данные, присваивая прочитанный результат в наши глобальные переменные. Если же файла нет, или нет ключа/секции, то нашим глобальным переменным присваиваются значения по умолчанию (последние параметры в функции).

ini_open("mygamesetup.ini")

global.music = ini_read_real("menu", "music", 1)

global.sound = ini_read_real("menu", "sound", 1)

global.language = ini_read_real("menu", "language", 1)

global.score = ini_read_real("game", "score", 0)

ini_close()

Запись во время игры

Про самый первый запуск разобрались, но как мы будем производить запись во время игры?

Тут все просто, когда игрок в настройках например сменил звук, язык или еще что-то или прошел какой-то уровень, то мы открываем файл, записываем изменившиеся данные и закрываем его. Важно понимать, что код открытия файла и записи должен выполниться только один раз! Т.е. в событии шага "Step" такой код естественно нельзя вставлять. Он должен быть или в событии создания "Create" какого-то объекта (например, при выигрыше у вас создается объект, показывающий кол-во собранных звезд в игре) или в событии конца комнаты "End Room" или с помощью проверки переменной флага и пр. Думаю для вас это не должно создать проблем. Сам код же будет выглядеть как-то так:

ini_open("mygamesetup.ini")

ini_write_real("game", "score", global.score)

ini_close()

Где переменная global.score - это как раз ваша внутренняя переменная, которая хранит значение очков.

Куда сохраняется наш ini-файл?

У многих новичков часто возникает вопрос, куда именно сохраняется ini-файл, так как в папке с игрой они его не видят. Game Maker предусмотрительно сохраняет их на каждой платформе в специально выделенное место.

В Windows файл будет храниться где-то в папке с именем пользователя, типа user/AppData/Local/gamename, или что-то типа того, по памяти сейчас уже не вспомню. Но при желании этот файл можно найти и открыть его текстовым редактором, чтобы посмотреть, каким образом там все сохранено, для лучшего понимания.

В HTML5 игре запись будет в local storage.

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

По этому особо не забивайте себе голову, где именно хранится ваш файл. Просто знайте, что для удобства, вам в коде не нужно прописывать никакой путь к этому файлу, а так же вам не надо париться по поводу того, что на каких-то платформах могут возникнуть ошибки из за того, что ОС вас просто не пустит сохранить что-то не там, где нужно. Game Maker уже позаботился о том, чтобы все работало одинаково без проблем на всех возможных платформах.

Спасибо, что дочитали статью до конца! Надеюсь она действительно окажется вам полезной и теперь вы без проблем сможете сделать сохранения каких-то параметров и переменных в файл в вашей игре. Ставьте лайки, оставляйте комментарии, подписывайтесь, делитесь - это все мотивирует меня писать дополнительные статьи на данном канале.

С подпиской рекламы не будет

Подключите Дзен Про за 159 ₽ в месяц