Постоянные данные (Persistent Data)
Ren'Py поддерживает постоянные данные, то есть сохраненные данные, не связанные с определенной точкой в игре. Доступ к постоянным данным осуществляется через поля объекта постоянного хранения, привязанного к переменной persistent.
Все данные, доступные через поля persistent, сохраняются при завершении работы Ren'Py или при вызове renpy.save_persistent(). Постоянные данные загружаются при запуске Ren'Py и когда Ren'Py обнаруживает, что постоянные данные были обновлены на диске.
Особенность объекта постоянного хранения состоит в том, что доступ к неопределённому полю будет иметь значение None, а не вызывать исключение.
Примером применения persistent является создание открываемой галереи изображений. Для этого в постоянных данных сохраняется флаг, который определяет, была ли галерея разблокирована, как в данном коде:
label gallery:
if not persistent.gallery_unlocked:
show background
centered "Вы еще не разблокировали данную галерею."
$ renpy.full_restart()
# Здесь показать галерею.
Когда игрок получает концовку, которая приводит к разблокировке галереи, флагу должно быть присвоено значение True.
$ persistent.gallery_unlocked = True
Поскольку постоянные данные загружаются до запуска блоков init python, они должны содержать данные, которые известны Python или Ren'Py. Или же можно использовать классы, определенные в блоках python early, при условии, что эти классы могут быть выделены и реализовать равенство.
Объединение постоянных данных (Merging Persistent Data)[править | править код]
Бывают случаи, когда Ren'Py нужно объединить постоянные данные из двух источников. Например, Ren'Py необходимо объединить постоянные данные, хранящиеся на USB-флеш-накопителе, с постоянными данными с локального компьютера.
Ren'Py осуществляет это слияние по каждому полю, принимая значение полей, которые были обновлены относительно недавно. Если такое поведение нежелательно, воспользуйтесь функцией renpy.register_persistent().
Например, если у нас есть множество увиденных концовок, мы предпочтем объединить это множества при слиянии данных.
init python:
if persistent.endings is None:
persistent.endings = set()
def merge_endings(old, new, current):
current.update(old)
current.update(new)
return current
renpy.register_persistent('endings', merge_endings)
Функции управления постоянными данными (Persistent Functions)[править | править код]
renpy.register_persistent(field, func)
- Регистрирует функцию, используемую для объединения значений постоянного поля, загруженного с диска, со значениями текущего объекта постоянного хранения.
- field
- Имя поля в объекте постоянного хранения.
- function
- Функция, вызываемая с тремя параметрами: old, new и current
- old
- Значение поля в старом объекте.
- old
- new
- Значение поля в новом объекте.
- new
- current
- Значение поля в текущем объекте постоянного хранения. Это предусмотрено для случаев, когда идентификация объекта, на который ссылается поле, не может измениться.
- current
- Предполагается, что функция вернёт новое значение поля в объекте постоянного хранения.
renpy.save_persistent()
- Сохраняет постоянные данные на диск.
Управление данными между несколькими играми (Multi-Game Persistence)[править | править код]
Управление данными между несколькими играми – функция, позволяющая обмениваться информацией между играми Ren'Py. Это может быть полезно, если вы планируете создать серию игр и хотите, чтобы они обменивались информацией.
Для использования многопользовательских данных, необходимо создать объект MultiPersistent внутри блока init. Затем пользователь может обновить этот объект и сохранить его на диск, используя метод save. Неопределенным полям по умолчанию имеют значение None. Чтобы гарантировать возможность повторной загрузки объекта, рекомендуем не присваивать экземплярам класса определяемые пользователем типы.
- class MultiPersistent(key)
- Создает новый объект MultiPersistent. Его следует вызывать только внутри блока init и данный класс возвращает новый MultiPersistent с заданным key.
- key
- Ключ, используемый для доступа к многопользовательским данным. Игры, использующие один и тот же ключ, получат доступ к одним и тем же многопользовательских данным.
Метод MultiPersistent:
- save()
- Сохраняет многопользовательские данные на диск. Это должно быть вызвано после изменения данных.
В качестве примера возьмем первую часть игры, состоящую из двух частей:
init python:
mp = MultiPersistent("demo.renpy.org")
label start:
# ...
# Записать тот факт, что пользователь прошёл первую часть.
$ mp.beat_part_1 = True
$ mp.save()
e "Вы прошли первую часть. Увидимся во второй части!"
И вторая часть:
init python:
mp = MultiPersistent("demo.renpy.org")
label start:
if mp.beat_part_1:
e "Вижу, ты уже прошёл первую часть, так что Добро пожаловать обратно!"
else:
e "Хм, ты ещё не играл в первую часть, почему бы не попробовать поиграть в неё в первую очередь?"
Источник[править | править код]
- Статья "Persistent Data" на английском языке
- Помощь при переводе статьи "Persistent Data" на русский язык: "Launchpad: persistent"
На главную страницу | Официальная документация движка | Вернуться к началу статьи |