Инициализация
Сразу после фазы анализа скриптов начинается фаза инициализации.
Во время неё обрабатываются все блоки init (как и блоки init python), блоки define, операторы и/или блоки image, блоки transform, блоки screen и блоки style.
Операторы default обрабатываются после фазы инициализации — в отдельной фазе перед началом игры.
В этой статье мы разберём как работают блоки инициализации, приоритеты и блоки Python-кода.
Блок init
Блок init нужен в основном для того, чтобы удобно группировать операторы вызываемые при инициализации и маленькие Python-блоки.
Синтаксис:
init:
<Ваши команды>
Пример:
init:
image mymod_sprite_al = "mymod/images/sprites/al.png"
$ mymod_char_al = Character("Алексей")
Приоритеты блоков инициализации
Каждому блоку инициализации можно задать свой приоритет от -999 до 999.
Команды из блоков с низким приоритетом будут выполняться раньше команд из блоков с высоким приоритетом.
Синтаксис:
init <Ваш приоритет>:
<Ваши команды>
Пример:
init -10:
$ a = -10
init: # Если приоритет явно не указан, то он равен нулю
$ a = 0
init 10:
$ a = 10
В итоге значение переменной a будет равно 10, так как последний раз она была определена в инициализационном блоке с приоритетом 10.
Блок python
Весь текст из этого блока интерпретируется движком как код Python.
В нём можно читать и изменять переменные, создавать и связывать с движком свои функции и много чего ещё.
Синтаксис:
python:
<Ваш Python-код>
Также к этому блоку можно добавить аргументы hide и in.
Аргумент hide
С аргументом hide весь код блока будет выполнен в анонимном поле.
После выполнения поле выполнения будет уничтожено, а созданные переменные потеряны.
При этом изменения существующих переменных из других store будут сохранены.
Это же значит, что по умолчанию с этим аргументом всегда требуется обращаться к общему store с помощью renpy.store (или отдельным именным store) чтобы сохранить какие-либо данные.
Пример:
# ...
python hide:
a = 10
renpy.store.b = 20
# ...
В примере переменная a просто пропадёт, а b, так как изменено через модификацию общего store, сохранит изменение.
Аргумент in
С аргументом in весь код блока будет выполнен в выбранном store.
Выполнение кода в конкретном store позволяет защитить переменные вашего мода от конфликтов.
Об использовании отдельных именных store вы можете прочитать в этой статье.
Пример:
# ...
python in mymod_store:
a = 10
# ...
В примере в store mymod_store будет создана переменная a.
Однострочный блок кода Python
В Ren'Py также можно открыть и однострочный блок кода Python.
Делается это с помощью символа $ перед строкой Python-кода.
С помощью однострочных блоков кода можно быстро изменить какую-либо переменную или вызвать какую-либо функцию и сделать это при инициализации или во время повествования.
Пример:
# ...
$ a = 10
# ...
Однострочный блок кода Python всегда выполняется в общем store.
Блок init python
Блок init python выполняет весь Python-код из себя во время инициализации.
Синтаксис:
init python:
<Ваш код>
Также как и блок python, блок init python принимает приоритеты (init <Ваш приоритет> python:), а также аргументы hide (init python hide:) и in (init python in <Название вашего store>:).
Блок python early
Блок python early позволяет выполнять Python-код до других блоков инициализации.
Весь код из него выполняется сразу после чтения файла движком.
Синтаксис:
python early:
<Ваш код>
Также как и блок python, блок python early принимает аргументы hide (python early hide:) и in (python early in <Название вашего store>:).
Блок python early равен по функционалу блоку init python early.