Как сделать сохранение в игре

В Construct 2 реализован простой механизм, позволяющий игрокам сохранить игру, а затем вернуться и загрузить игру с того момента, когда она прервалась. Это особенно полезно для длинных игр и уровней. Можно конечно сохранить, на каком уровне остановился пользователь, используя Local Storage, но зафиксировать состояние всех игровых объектов будет крайне сложно. Системные объекты [2] Save и Load позволят вам легко создать сложный механизм сохранения игры.

Как это работает

Самый простой способ добавить сохранение — использовать системные экшены Save и Load по нажатию на какую-то конкретную клавишу. Например:

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

Файлы с сохраненным игровым процессом браузер помещает на локальный диск. Поэтому игроки могут выключить устройство и вернуться к игре, например, на следующий день, при этом игра будет продолжена с сохранённого момента. Важно, что каждый браузер сохраняет информацию в свою папку, поэтому не получится начать игру в одном браузере, а продолжить — в другом.

Файл с сохраненным игровым процессом не хранится в кэше. Кэш браузера — временное хранилище, в которое помещаются изображения с разных страниц, чтобы не подгружать их каждый раз, когда вы повторно заходите на сайт, и регулярно чистится. К счастью, сохранения игр хранятся не в кэше, а в WebStorage или IndexedDB, которые относятся к постоянным хранилищам и не затрагиваются, когда пользователь чистит кэш.

Слот для сохранения

Всегда полезно давать игрокам возможность сохранять игру многократно. Такая возможность реализуется за счёт save slot (слотов, ячеек сохранения). Каждый слот — как отдельный файл, который хранит отдельную "сохранёнку". Можно предложить пользователю выбрать готовый набор слотов, в которые будет сохраняться игра, или позволить ему создать свой собственный слот с пользовательским именем.

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

Триггеры завершения процесса

Процесс сохранения игры может занять некоторое время, при этом игра будет продолжаться. По завершении процесса сохранения срабатывает системный триггер On save complete. Загрузка также занимает определённое время и завершается срабатыванием триггера On load complete. Помните, что любые изменения после включения механизма Save и до срабатывания триггера On save complete могут сохраниться.

Если попытаться загрузить сохранение из несуществующего слота, сработает триггер On load failed. Можно настроить запуск игры с начала, если пользователь выбирает пустой слот.

Поведение 'No Save'

Все, у чего настроено поведение No Save behavior, не будет сохраняться и не будет настраиваться при загрузке. Весьма полезно добавлять поведение No Save к статичным объектам, например, заднему плану или объектам сцены, а также к автоматически обновляемым объектам. Это несильно повлияет на игру, а вот сохранения за счёт отсутствия ненужной информации будут меньше, будут записываться и загружаться быстрее. (Также важно, чтобы хорошо работало continuous preview).

Изменение проекта после сохранения

Сохранёнки должны быть приспособлены к возможным будущим изменениям в вашем проекте. Должна быть возможность удалять и перенастраивать разные элементы: переменные, поведения и прочие объекты. При этом старые сохранения должны успешно загружаться. Помните, что если вы что-то добавили, чего нет в старой сохранёнке, оно может не заработать после загрузки. И наоборот, если вы что-то удаляете из проекта, оно не должно появляться после загрузки. Вы можете удалять отдельные экземпляры объектов, и это не повлияет на сохранения, но если вы удалите объекты, уровни или слои, они уже не появятся после загрузки сохранения.

Продвинутые вопросы

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

Как отследить, какие слоты используются

Система сохранения/загрузки не скажет вам, куда будут сохраняться данные. Лучший способ отследить, какие слоты используются, — сохранить дополнительные метаданные в объекте WebStorage. Например, добавляйте WebStorage key, который позволит идентифицировать слот. В качестве метаданных, идентифицирующих слот, также можно использовать имя пользователя или даже небольшой скриншот игры. Можно осуществлять различные манипуляции с этими данными: переназначение, очистка — просто путём настройки или удаления меток метаданных, чтобы создать ощущение, что слот пуст.

Что сохраняется, а что — нет

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

Не сохраняются и не загружаются:

- Состояния устройств ввода (например, положение курсора мыши, нажатия клавишей или касания экрана);

- AJAX запросы;

- WebSocket соединения;

- XML-объекты;

- Пользовательские медиа-данные;

- Вход посредством Facebook;

- Состояние WebStorage;

- CocoonJS/Windows 8;

- Внутриигровые покупки независимо от платформы;

- Все объекты с поведением 'No Save'.

Использование данных JSON

При срабатывании триггеров On save complete и On load complete, системное выражение SaveStateJSON возвращает все относящиеся к сохранению данные JSON в виде строки. Помните, что выражение SaveStateJSON за пределами срабатывания этих триггеров возвращает пустую строку.

Если у вас есть доступ к серверу, есть возможность создавать сохранения, доступные с разных устройств, за счёт передачи на сервер JSON-данных с AJAX-объектами и сохранения их в базе данных. В качестве альтернативы некоторые платформы, например, Windows 8 и Clay.io позволяют хранить данные залогиненных пользователей и использовать их на любых устройствах, где они зайдут под своим аккаунтом. Это позволяет загружать сохранения независимо от устройства и браузера.

Если у вас есть строка JSON, у вас есть возможность загрузить из нее игру, используя системный экшен Load from JSON.

Версии

Вы можете менять проект, при этом сохранения будут загружаться. Однако некоторым продвинутым пользователям бывает нужно отследить, к какой версии их проекта относится сохранение. Это можно реализовать за счёт глобальной переменной. Назовите ее Version и сделайте равной 1. Потом, выпуская новую версию игры, присвойте переменной новое значение, например, 2. Теперь когда сработает триггер On load complete, и загрузится глобальная переменная Version, значение которой будет обновлено при использовании экшена Save. Это пригодится, если вы добавили в проект много новых объектов и хотите быть уверенны, что они будут уничтожены или спрятаны при загрузке старой сохранёнки.

  • 0 Comments

  • Order by
Want to leave a comment? Login or Register an account!