Game Maker - создание игр | HellRoom Games
Январь 16, 2025, 08:27:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: Работа с файлами для сохранения и считывания данных - Статья №1 - Ini-файлы  (Прочитано 68024 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Voldeniaar
Активный участник
*****

Репутация: 96
Offline Offline

Пол: Мужской
Награды:
За постоянность! [100 дней на форуме]
API: Love
Сообщений: 414


« : Июль 30, 2012, 20:37:52 »

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

Итак...
Думаю, многие сталкивались с необходимостью сохранять и, в последствии, выгружать данные, необходимые для игры. Для этой цели можно воспользоваться стандартной функцией 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. Критикуем. Указываем на ошибки, минусуем даем советы по улучшению статьи, говорим что плохо, что хорошо.
Записан

"Даже сумасшедшие предприятия могут осуществиться, если сумасшествовать по обдуманному плану.." (С) А.Сапковский "Божьи Воины"

"Лучше без точно сформулированной цели двигаться вперед, чем без цели стоять на месте, и уж наверняка гораздо лучше, чем без цели пятиться назад." (С) А.Сапковский "Крещение Огнем"
S_Kleer
GM Pro user
*

Репутация: 567
Offline Offline

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« Ответ #1 : Июль 30, 2012, 22:56:36 »

Может стоить добавить создание ини, если его не существует? (со стандартными настройками игры)
А то "умный" игрок может удалить ини и у него возникнет ошибка в игре.
Записан

Коты - Мирители
Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #2 : Июль 30, 2012, 23:18:46 »

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

Добавлено: Июль 30, 2012, 23:21:36
Не подтверждено: я могу ошибаться, но стандартные сохранения, вроде бы, могут конфликтовать при различиях версий игры. То есть, старые сохранения не будут загружаться в более новой версии игры. Однако, как я уже говорил, я могу ошибаться, ибо лично не встречался с такой проблемой.
Да, если в игре были достаточные изменения, например, добавлен какой-либо новый объект или комната, или любой другой ресурс.
Ошибка несовместимости не возникнет, если были мелкие изменения, например, в коде поведения существующих объектов.

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

Voldeniaar
Активный участник
*****

Репутация: 96
Offline Offline

Пол: Мужской
Награды:
За постоянность! [100 дней на форуме]
API: Love
Сообщений: 414


« Ответ #3 : Июль 30, 2012, 23:32:00 »

Может стоить добавить создание ини, если его не существует? (со стандартными настройками игры)
А то "умный" игрок может удалить ини и у него возникнет ошибка в игре.
Цитировать
Число 0 - это аргумент, который будет возвращен, если ключ не будет найден. То есть, это значение "по умолчанию" - например, при случайном удалении ini-файла, именно оно будет выдано программе.
Видимо, это плохо заметно. Сейчас исправлю.

Добавлено: Июль 30, 2012, 23:42:41
Вроде теперь более понятно и заметно...
Цитировать
PS: и, исходя из первого абзаца, создавать заранее файл в блокноте тоже не обязательно.
Кстати, да... Я почему-то привык создавать его заранее.
Благодарю за замечания.
Записан

"Даже сумасшедшие предприятия могут осуществиться, если сумасшествовать по обдуманному плану.." (С) А.Сапковский "Божьи Воины"

"Лучше без точно сформулированной цели двигаться вперед, чем без цели стоять на месте, и уж наверняка гораздо лучше, чем без цели пятиться назад." (С) А.Сапковский "Крещение Огнем"
MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #4 : Июль 31, 2012, 00:43:46 »

В первом предложении слишком много вводных конструкций

Добавлено: Июль 31, 2012, 00:47:48
Вообщем, не плохая статья.

P.S. Так и не нашёл нормального (без возможности редактирования) способа сохранений прогресса для GMS
Записан

geroy231
GM Pro user
*

Репутация: 137
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [100 дней на форуме]
API: Game Maker 8.0 Pro
Сообщений: 952



« Ответ #5 : Август 01, 2012, 12:40:52 »

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

P.S. у меня при старте стоит проверка ини. Если я правельно вас понимаю, то этот код совершенно не нужен, да?
Код:
var creat;
if file_exists('game.ini')
  {
    ini_open('game.ini')
    //считывание настроек
    ini_close()
   }
else
   {
    creat=file_text_open_write('game.ini')
    file_text_close(creat)
    ini_open('game.ini')
    //запись настроек по умолчанию
    ini_close()
   }
Записан

Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #6 : Август 01, 2012, 13:44:38 »

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

Sarkut
Посетитель
**

Репутация: 10
Offline Offline

Пол: Мужской
API: GameMaker Studio
Деятельность: Код, графика, музыка, сюжет, диалоги, идея
Сообщений: 42


« Ответ #7 : Февраль 01, 2013, 14:50:58 »

РЕПОСТ http://forum.hellroom.ru/index.php?topic=14308.msg175922#msg175922


Приветствую!  

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

Объясню на примере:
Код:
save.ini
[save]
score=1

create/key release
ini_open('save.ini') //или (ini_open (working_directory + "\SaveData.ini")), а так же располагал ини файл в /datafiles/save.ini через included files. пробовал все вместе и отдельно
score=ini_read_real('save','score',0)
ini_close() //и без закрытия

draw
draw_text(50,50, score)
все одно - рисует score = 0
В чем может быть дело?   Хм...

П.С.
Пробовал объявлять переменные, в том числе глобальные. Пробовал цеплять значение переменных к другим функциям, не только к draw. Итог всегда один и тот же = 0.
По-моему ини файл просто-напросто не подгружается, и вместо нужного значения GM берет дефолтное.
Записан
AndrewVideoGames
Главный Модератор
*

Репутация: 821
Offline Offline

Пол: Мужской
Награды:
За постоянность! [500 дней на форуме]За лояльность! [+750 репутации]5000 сообщений!За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316



« Ответ #8 : Февраль 01, 2013, 16:11:10 »

 Вместо SaveData.ini надо писать название ини файла
Записан
Sarkut
Посетитель
**

Репутация: 10
Offline Offline

Пол: Мужской
API: GameMaker Studio
Деятельность: Код, графика, музыка, сюжет, диалоги, идея
Сообщений: 42


« Ответ #9 : Февраль 01, 2013, 16:56:42 »

Вместо SaveData.ini надо писать название ини файла

Ну это само-собой разумеется, данный пример я скопипастил из комментов.

Добавлено: Февраль 01, 2013, 18:15:02
Нашел источник проблемы! У меня, почему-то, сгенерированные приложением ini файлы находятся в обычной AppData\GameName. И как не пиши название, он все равно будет искать или создавать файлы в аппдате, будь то родная директория, или темп-директории по program или working (а если прописать полный путь к файлу, по типу "C\games\blabla\bla.ini", то GM будет его искать как "...appdata\gamename\c:\blabla..." - короче, тоска Мда....).
Пока я вижу только одно решение - это не создавать файл заранее, а предварительно прописать в коде все значения в качестве констант по-умолчанию в одном месте, и тогда где бы не был осуществлен первый запуск игры, файл всегда будет в аппда.

Вот такие дела. А причина отсутствия такой же кутерьмы у прочих пользователей, видимо, проста - народ не создает специальные папки под свои проекты, а пользуется стандартными из "C:\Users\user\Documents\GameMaker\Projects". Иных причин я не вижу.

Есть у кого какие-нибудь еще идеи? 
Записан
3dmax
Посетитель
**

Репутация: 0
Offline Offline

Пол: Мужской
API: GameMaker Studio Free
Сообщений: 15


« Ответ #10 : Ноябрь 16, 2013, 22:28:12 »

столкнулся с непонятной проблемой:
...не видит файла, куда я его только не кидал, уже кинул в корневой, все равно не видит. В чем может быть проблема ?
if file_exists('d:/123.txt'){
   show_message("Есть");
}
else
show_message("Нету файла");
Записан
geroy231
GM Pro user
*

Репутация: 137
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [100 дней на форуме]
API: Game Maker 8.0 Pro
Сообщений: 952



« Ответ #11 : Ноябрь 17, 2013, 00:13:45 »

Основной недостаток студии это то, что она не умеет нормально работать с внешними файлами. Действия можно производить только с теми, которые находятся в "песочнице". Такое ограничение вызвано мультиплатформенностью гамака. Если с английским хорошо, почитайте справку там подробно описано, ежели плохо, то гугл транслит в помощь.
Записан

3dmax
Посетитель
**

Репутация: 0
Offline Offline

Пол: Мужской
API: GameMaker Studio Free
Сообщений: 15


« Ответ #12 : Ноябрь 17, 2013, 00:22:14 »

что вы называете "песочницей"  ? я файл кидал и в проект и куда только не кидал. А в справке а каком именно месте глянуть?
Записан
geroy231
GM Pro user
*

Репутация: 137
Offline Offline

Пол: Мужской
Награды:
500 сообщений!За постоянность! [100 дней на форуме]
API: Game Maker 8.0 Pro
Сообщений: 952



« Ответ #13 : Ноябрь 17, 2013, 00:53:44 »

Суть в том, что открывать можно только те файлы, которые находятся в "Песочнице". Это место зависит от платформы, например на винде это %localappdata%\<Game Name>
Скажем вам ничего не мешает прямо из игры сохранить какой-нибуть файл, неважно текстовый он, ини или вообще картинка, а после загрузить его обратно в игру.

в справке: Reference\File Handling\File Sistem Limits
Записан

Fantom
I am... All of me
Гл. Администратор
*

Репутация: 1325
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [500 дней на форуме]За лояльность! [+1000 репутации]За отличные статьи по Game Maker!Тру Админ :DЗнаток Game Maker...
API: GameMaker Studio Master
Сообщений: 5026



« Ответ #14 : Ноябрь 17, 2013, 02:00:49 »

Дополню, или поправлю, кому как нравится.
GMS-игры могут открывать файлы (на Windows) из любого расположения, но только через диалоги. ГМС отвергает записанный путь прямо в код, а открывает только через диалог. Не знаю, что у него за бзик такой, возможно, не хватает общения ему, но вот так... Путь, записанный в код, полностью совпадает с путём, выбранном в диалоге, - соглашается только на диалог.
И дополнительное примечание: в пути открываемого файла не должно быть русских букв.
Собственно, пригодится всё это только для неких прикладных целей - разработки, обработки документов - открыл документ, переработал, закрыл - не для какой-либо "скрытой" подгрузки внешних файлов в процессе игры.
Записан

Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.137 секунд. Запросов: 34.