Сохранение игры [Урок]
| |
SpeRdKeaR | Дата: Четверг, 12 Июня 2014, 21:52 | Сообщение # 1 |
KillerReborn
Сейчас нет на сайте
| Последнее время все чаще стал замечать вопросы по сохранению игр и т.д. Тут мы рассмотрим возможные (точнее наиболее распространенные) способы сохранения игр. Их будет всего два (как бы то странно не звучало). Приступим. [Способ 1 - простейший. game_save(filename)] Это - стандартная функция функция сохранения в GM. Производиться она таким вот кодом: Код game_save('имя файла сохранения.sav') Тут все понятно, но на всякий случай разъясню: game_save - так сказать, основа описанного мною кода выше. То есть она "начинает" сам процесс сохранения. ('имя файла сохранения.sav') - та часть, без которой функция работать не будет (сохранение в пустоту еще не изобрели ). То есть - она сохраняет игру в файл с введенным названием. Как вы уже наверно поняли - .sav тут является расширением ( введи ты .exe - оно тебе это в exe'шнике и сохранит. Но работать этот файл как сохранение не будет). *** Плюсы стандартного сохранения: Просто, в самый раз для новичков. Легкая реализация сохранения, к примеру, по слотам. Минусы стандартного сохранения: Ну просто жутко не практично. Данный способ плохо оптимизирован. Для больших проектов не подходит категорически. *** Способ 2. Сохранение в .ini. Начнем. Тут все сложнее. Для начала создайте отдельную папку для игры (будет проще работать). Создайте в нем файл с названием save, с расширением .ini. Через блокнот пропишите в нем вот что: Данный код создает секцию, в простонародье - отдел. Дописываем: Тут мы указали загружаемые координаты объекта - в ГМЛ код будет отправлять объект в левый верхний угол. Далее заходим уже в гамак. Создаем любой объект, присваиваем ему любой спрайт. В создание пишем: Код ini_open('save.ini') xn=ini_read_real('Game','xn',0); yn=ini_read_real('Game','yn',0); ini_close() x=xn y=yn xd=x yd=y Объясняю снова. Первая строка - открываем инишник. Вторая - считываем из отдела (секции) Game переменную (ключ) xn. Следующая строка делает тоже самое, но уже с yn. Со следующими строками - все и так ясно. В step запишите: А так же этот код для движения: Код if keyboard_check(ord("W")) {vspeed=-5} if keyboard_check(ord("S")) {vspeed=5} if keyboard_check(ord("A")) {hspeed=-5} if keyboard_check(ord("D")) {hspeed=5} if keyboard_check(vk_nokey) {speed=0} Его, я думаю, объяснять не надо - вы сами поймете. Далее создаем событие Game End, пропишем: Код ini_open('save.ini') ini_write_real('Game','xn',xd) ini_write_real('Game','yn',yd) ini_close() Объясняю (хотя вы сами могли догадаться): 1 строка - открываем инишник. Вторая - значение переменной xn в инишнике приравнивает в переменной xd. С третьей тоже самое, но там задействованы переменные yn и yd. Теперь немного (или много - без разницы) двигаем наш объект и выключаем игру. Если у вас все сделано правильно - то при новом запуске вы начнете с того места, где и закончили. Так же в ini можно хранить значение переменных - для них чаще всего создают отдельные секции. Вы скажите x и y - тоже переменные. Зачем отдельные секции? И я вам отвечу: в отдельные секции чаще всего записывают какие-либо "возможности" и "проверки" (то есть переменные, значением которых являются true и false. Переменные вроде visible и solid). Так же там можно хранить, например, кол-во жизней. *** Плюсы способа: Более оптимизирован, чем стандартный. Сохранение более "профессиональное". Позволяет избежать многих багов. Минусы способа: Только для более-менее опытных пользователей, ибо не каждому новичку "доступно" это сохранение. *** Вот я и показал вам основные способы сохранения игры . Критикуйте, ставьте +, комментируйте. Надеюсь хоть кому-то помог. В следующем уроке я попробую рассказать вам о шифровке ini-файлов. До свидания.
Примечание: ini_close() - строка, закрывающая ini-файл. Инишник - .ini файл.
А звезды, будто мириады стрел, Ловя на мушку силуэты снов. Смеется и злорадствует любовь, И мы с тобой попали в их прицел...
Сообщение отредактировал SpeRdKeaR - Четверг, 12 Июня 2014, 22:11 |
|
| |
aFriend | Дата: Четверг, 12 Июня 2014, 22:15 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Цитата SpeRdKeaR ( ) Данный способ плохо оптимизирован. Для больших проектов не подходит категорически. Поясни, в каком месте он не оптимизирован, как ты это определил? И почему это он не подходит для "больших проектов" и насколько больших?
Цитата SpeRdKeaR ( ) Создайте в нем файл с названием save, с расширением .ini. Не обязательно чтоб этот файл был с расширением ini, он может быть практически с любым расширением
Цитата SpeRdKeaR ( ) ini_open('save.ini') x=ini_read_string('Game','x','INI'); y=ini_read_string('Game','y','INI'); Цитата SpeRdKeaR ( ) Первая строка - считываем из отдела (секции) Game переменную (ключ) x. Вторая строка делает тоже самое, но уже с y. Разве первая строка не "ini_open('save.ini') "?Цитата SpeRdKeaR ( ) xd=x yd=y Цитата SpeRdKeaR ( ) Со следующими двумя строками - вся и так ясно. Новичку может быть и ясно, но я не понимаю зачем эти 2 строчкиЦитата SpeRdKeaR ( ) Более оптимизирован, чем стандартный. Скорее, наоборот Цитата SpeRdKeaR ( ) Сохранение более "профессиональное". В чем? Цитата SpeRdKeaR ( ) Позволяет избежать многих багов. Расскажи, каких, например?Цитата SpeRdKeaR ( ) Только для более-менее опытных пользователей, ибо не каждому новичку "доступно" это сохранение. Тут ты не прав, с самого начала изучения языка ГМЛ я знал как работают ини и принципы сохранения чего-либо
Сообщение отредактировал aFriend - Четверг, 12 Июня 2014, 22:18 |
|
| |
SpeRdKeaR | Дата: Четверг, 12 Июня 2014, 22:20 | Сообщение # 3 |
KillerReborn
Сейчас нет на сайте
| aFriend, извиняй, тут много где натупил, ибо исправлял код.
А звезды, будто мириады стрел, Ловя на мушку силуэты снов. Смеется и злорадствует любовь, И мы с тобой попали в их прицел...
|
|
| |
aFriend | Дата: Четверг, 12 Июня 2014, 22:24 | Сообщение # 4 |
участник
Сейчас нет на сайте
| Твой код не оптимизирован, зачем тебе писать Цитата SpeRdKeaR ( ) ini_open('save.ini') xn=ini_read_real('Game','xn',0); yn=ini_read_real('Game','yn',0); ini_close() x=xn y=yn xd=x yd=y
когда можно Код ini_open('save.ini') x=ini_read_real('Game','x',0); y=ini_read_real('Game','y',0); ini_close()
а в конце игрыЦитата SpeRdKeaR ( ) ini_open('save.ini') ini_write_real('Game','xn',xd) ini_write_real('Game','yn',yd) ini_close() когда можно просто Код ini_open('save.ini') ini_write_real('Game','x',x) ini_write_real('Game','y',y) ini_close()
и без лишнего кода в step
Сообщение отредактировал aFriend - Четверг, 12 Июня 2014, 22:25 |
|
| |
SpeRdKeaR | Дата: Четверг, 12 Июня 2014, 22:26 | Сообщение # 5 |
KillerReborn
Сейчас нет на сайте
| aFriend, еще раз большое спасибо. Я туплю сегодня - болею Когда тайм-аут кончиться - плюс поставлю, ибо реально помогаешь.
А звезды, будто мириады стрел, Ловя на мушку силуэты снов. Смеется и злорадствует любовь, И мы с тобой попали в их прицел...
|
|
| |
aFriend | Дата: Четверг, 12 Июня 2014, 22:30 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Цитата SpeRdKeaR ( ) Я туплю сегодня - болею Когда тайм-аут кончиться - плюс поставлю, ибо реально помогаешь. Не бойся сказать, что ты ошибся - люди учатся на своих ошибках) Скорейшего выздоровления. Без плюсика я бы пережил, к тому же я практически ничего не сделал)
|
|
| |
SpeRdKeaR | Дата: Четверг, 12 Июня 2014, 22:42 | Сообщение # 7 |
KillerReborn
Сейчас нет на сайте
| Цитата aFriend ( ) Не бойся сказать, что ты ошибся - люди учатся на своих ошибках) Да, я ошибся). Может, из-за болезни, может лишний раз зря "подстраховался"... Сказате не могу. Цитата aFriend ( ) Скорейшего выздоровления. Спасибо.Цитата aFriend ( ) Без плюсика я бы пережил, к тому же я практически ничего не сделал) Все равно ты помог =)
А звезды, будто мириады стрел, Ловя на мушку силуэты снов. Смеется и злорадствует любовь, И мы с тобой попали в их прицел...
|
|
| |
XDominator | Дата: Пятница, 13 Июня 2014, 12:58 | Сообщение # 8 |
постоянный участник
Сейчас нет на сайте
| Насчет избежания багов стандартного сохранения - все правильно он написал, но объяснить не смог. Объясню я.
Клогда гамак стандартной функцией сохраняет игру, он пишет все подряд - че надо, че не надо. Тупо все. Соответственно ты фактически теряешь контроль над игрой, т.к. она начинает жить точно той же жизнью, которой жила в момент сохранения(причем опять же - с нюансами, которые могут быть очень неочевидны, т.к. сохраняется все же не все.).
Когда ты пишешь свою структуру сохранения - это много более правильно. Во первых, при чтении из ини файла ты не теряешь свою "оболочку" - можно читать и менять данные на лету. Конечно это более громоздко, зато куда более предсказуемо. Поэтому большой проект, особенно который связан с онлайном - просто не может использовать стандартный game_save(). Как то так. Но при выходе в онлайн и ини нужно использовать с умом, потому что иначе твою игру можно будет сломать даже без стороннего по. Так что без прикладывания моска не обойдешься никак
Ну и во вторых, свой ини ты можешь шифровать как тебе угодно, а гамак использует стандартный алгоритм без возможности настройки.
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
Сообщение отредактировал XDominator - Пятница, 13 Июня 2014, 13:00 |
|
| |
aFriend | Дата: Пятница, 13 Июня 2014, 13:07 | Сообщение # 9 |
участник
Сейчас нет на сайте
| Цитата XDominator ( ) Когда ты пишешь свою структуру сохранения - это много более правильно. Во первых, при чтении из ини файла ты не теряешь свою "оболочку" - можно читать и менять данные на лету. Конечно это более громоздко, зато куда более предсказуемо. Поэтому большой проект, особенно который связан с онлайном - просто не может использовать стандартный game_save(). Как то так. Но при выходе в онлайн и ини нужно использовать с умом, потому что иначе твою игру можно будет сломать даже без стороннего по. Так что без прикладывания моска не обойдешься никак тебя не смущает, что для онлайн игр обычно используют базы данных, которые более надежны чем использование ini?
|
|
| |
XDominator | Дата: Пятница, 13 Июня 2014, 16:56 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| С базами данных это отдельный разговор уже. К тому же, если ты сохраняешь какие то данные на клиенте(скажем, прогресс однопользовательской компании как в батлфилде) - тоже будешь разворачивать на компе клиента БД?))
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
aFriend | Дата: Пятница, 13 Июня 2014, 23:05 | Сообщение # 11 |
участник
Сейчас нет на сайте
| XDominator, если честно, то я (лично я) использовал бы базу данных)
|
|
| |
XDominator | Дата: Пятница, 13 Июня 2014, 23:20 | Сообщение # 12 |
постоянный участник
Сейчас нет на сайте
| Давай мы оба сделаем вид что твоего последнего поста тут не было?
Ghaarp
The soul lighter(Android, logic)
Zzzzombie RAGE!!!(For android)
|
|
| |
aFriend | Дата: Суббота, 14 Июня 2014, 00:53 | Сообщение # 13 |
участник
Сейчас нет на сайте
| XDominator, мы не можем так поступить
|
|
| |
SwordMaster | Дата: Суббота, 21 Июня 2014, 01:10 | Сообщение # 14 |
был не раз
Сейчас нет на сайте
| Вы тут сами себе жизнь усложняете.
|
|
| |
GMHelp | Дата: Суббота, 21 Июня 2014, 19:44 | Сообщение # 15 |
почетный гость
Сейчас нет на сайте
| SwordMaster, причём здесь жизнь ? От комментариев не пострадал не один Форумчан.
Всё что я сказал может показаться обидно , но это только кажется так, ибо мнение моё и оно может поменяться.
|
|
| |
MrSlap | Дата: Четверг, 03 Июля 2014, 23:07 | Сообщение # 16 |
почетный гость
Сейчас нет на сайте
| SpeRdKeaR, нет идей, как сохранить статус объектов, находящихся в комнате (всех)? Какие были удалены перед сохранением, какие созданы. Вроде надо массив применять, но что-то мне ума не хватает дойти до решения.
Создаю интерактивную повесть.
|
|
| |
aFriend | Дата: Четверг, 03 Июля 2014, 23:14 | Сообщение # 17 |
участник
Сейчас нет на сайте
| MrSlap, напиши в лс
|
|
| |
|