Жизненный цикл запущенной игры на Ren'Py
При запуске игры на Ren'Py, будь то из исполняемого файла или из лаунчера, она проходит через ряд шагов до момента её закрытия. Эта страница раскрывает различные фазы этого жизненного цикла и связанные с ними инструкции.
Время загрузки
Многое происходит до того, как появится окно игры. Это и есть время загрузки. Единственное, что может быть видно на этом этапе, — это presplash.
Фаза парсинга скриптов
Чтобы прочитать код игры, Ren'Py считывает каждый из игровых файлов .rpy (и _ren.py) один за другим. Это фаза «парсинга», или «ранняя» (early) фаза. Файлы считываются в следующем порядке:
Файлы внутри
renpy/commonзагружаются по полному пути в юникод-порядке. Это предназначено только для использования самим Ren'Py.Только если существует
game/libs/libs.txt, файлы вgame/libsзагружаются в юникод-порядке, при этом первая директория в пути (если она есть) отбрасывается. В таком порядкеgame/libs/plants/aloe.rpyзагрузится раньше, чемgame/libs/animals/zebra.rpy.
Файлы в
gameзагружаются по полному пути в юникод-порядке. (В таком порядкеgame/animals/zebra.rpyзагрузится раньше, чемgame/plants/aloe.rpy.)Только если существует
game/mods/mods.txt, файлы вgame/modsзагружаются в юникод-порядке, при этом первая директория в пути (если она есть) отбрасывается. В таком порядкеgame/mods/plants/aloe.rpyзагрузится раньше, чемgame/mods/animals/zebra.rpy.
Первый исполняемый код, написанный разработчиком, — это код внутри блоков python early. Эти блоки
выполняются после того, как файл, в котором они находятся, был прочитан и проанализирован, но до того, как начнётся чтение следующего файла.
Именно поэтому инструкции, которые изменяют процесс парсинга, такие как Пользовательские операторы,
Инструкции экранного языка, определяемые разработчиком или новые пользовательские Варперы, должны быть написаны в блоках python early.
Иногда встречается синтаксис init python early, но он избыточен и ничего не меняет в порядке выполнения кода по сравнению с python early.
Фаза инициализации (Init)
После фазы парсинга (early) начинается фаза «инициализации» (init). В это время выполняются несколько инструкций, включая Инструкция Init Python, Инструкция Define, Инструкция Transform, Инструкция image, Инструкция screen, и style.
Фаза init делится на последовательные эпохи, или приоритеты инициализации. Вопреки тому, что может подразумевать этот термин, эпохи с более низким приоритетом выполняются раньше эпох с более высоким приоритетом. Рекомендуется, чтобы игры использовали приоритеты инициализации от -99 до 99. Библиотеки и моды могут использовать от -999 до -100 и от 100 до 999. Приоритеты инициализации за пределами диапазона от -999 до 999 зарезервированы для внутреннего использования Ren'Py.
По умолчанию эти инструкции выполняются с приоритетом инициализации 0. Однако их приоритет можно изменить с помощью Инструкция init offset или другими способами. Инструкция Инструкция image является исключением из обоих этих правил, так как по умолчанию она выполняется с приоритетом инициализации 500, и инструкция init offset добавляет или вычитает значение из этого 500, а не заменяет его.
Автоматическое определение изображений из Каталог изображений (Images Directory) происходит с приоритетом инициализации 0.
Инструкции Define <define-statement> выполняются во время инициализации, и переменные, установленные в инструкциях define, не должны изменяться, так как Ren'Py считает эти переменные константами для целей оптимизации производительности.
Обратите внимание, что хотя инструкции default не выполняются во время инициализации, приоритет этих инструкций влияет на порядок, в котором они будут выполнены относительно друг друга.
Инструкция init offset
Инструкция init offset устанавливает смещение приоритета для всех инструкций,
которые выполняются во время инициализации. Её следует размещать в начале файла, и она применяется ко всем последующим
инструкциям в текущем и дочерних блоках, вплоть до следующей
инструкции init offset. Инструкция:
init offset = 42
устанавливает смещение приоритета в 42. В:
init offset = 2
define foo = 2
init offset = 1
define foo = 1
init offset = 0
Первая инструкция define выполняется с приоритетом 2, что означает, что она выполняется
после второй инструкции define, и, следовательно, foo в конечном итоге получает
значение 2.
Выполнение скрипта
На этом этапе выполняются обычные инструкции Ren'Py, и применяются правила, описанные в Метки и управление потоком.
Переменные, изменяемые на этой фазе, сохраняются при сохранении игры и восстанавливаются при её загрузке. Окно игры появляется во время первого взаимодействия, происходящего на этой фазе.
Конфигурационные переменные не следует изменять после начала выполнения скрипта, так как Ren'Py может кэшировать значения этих переменных.
Перед заставкой (Splashscreen)
Действия в этом разделе выполняются при запуске Ren'Py или после возврата в главное меню. Важно отметить, что они выполняются даже если заставка пропускается.
Перед показом заставки выполняются инструкции default. Затем,
запускаются config.start_callbacks.
Заставка (Splashscreen)
Если метка splashscreen существует, она выполняется до тех пор, пока не вернёт управление.
Заставка отображается только один раз за запуск Ren'Py и пропускается при перезапуске выполнения скрипта.
В конце заставки, даже если она пропущена, Ren'Py выполняет scene black, чтобы очистить
экран от заставки и установить стандартный черный фон.
Главное меню
Если метка before_main_menu существует, она выполняется. Затем, после её завершения,
отображается экран main_menu, если только не существует метка main_menu,
которая в таком случае выполняется вместо экрана. См. Специальные метки для получения дополнительной информации.
Само главное меню выполняется в своём собственном контексте. Ren'Py может выйти из этого
контекста, вызвав действие Start, которое также переходит к указанной метке или к метке start
, если метка не задана. Возврат из метки main_menu также переводит игру в игровую фазу на
метке start, в то время как загрузка сохранения переводит в игровую фазу в том месте, где игра была сохранена.
Игровая фаза
Это фаза, в которой происходит непосредственно прохождение игры, и в этом режиме игроки обычно проводят большую часть своего времени. Эта фаза продолжается до тех пор, пока игрок не выйдет из игры, или пока игра не перезапустится и игрок не вернется в главное меню.
Во время игровой фазы действие ShowMenu может использоваться для отображения
экрана в новом контексте.
Игровая фаза продолжается до тех пор, пока игрок не выйдет из игры или не перезапустит её,
чтобы вернуться в главное меню. Игру можно перезапустить, выполнив возврат (return), когда в стеке вызовов нет активных вызовов,
как объясняется в Метки и управление потоком. Игру также
можно перезапустить с помощью действия MainMenu или функции renpy.full_restart().
При перезапуске игры все неперсистентные данные сбрасываются до состояния, в котором они были в конце фазы выполнения скрипта, а затем фаза выполнения скрипта начинается снова, пропуская заставку.