Постоянные данные (Persistent Data)

Материал из Ren'Py Wiki
Перейти к навигации Перейти к поиску

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
Значение поля в старом объекте.
new
Значение поля в новом объекте.
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 "Хм, ты ещё не играл в первую часть, почему бы не попробовать поиграть в неё в первую очередь?"

Источник[править | править код]

  1. Статья "Persistent Data" на английском языке
  2. Помощь при переводе статьи "Persistent Data" на русский язык: "Launchpad: persistent"

На главную страницу Официальная документация движка Вернуться к началу статьи