Операторы в языке программирования Python (Python Statements)
Ren'Py написан на языке программирования Python и предусматривает поддержку включения кода на Python внутри скриптов Ren'Py. Поддержка Python может использоваться для многих вещей: начиная с установки флага и заканчивая созданием новых отображаемых объектов.
В настоящем разделе рассматриваются способы, с помощью которых Ren'Py скрипты могут напрямую вызывать код на Python посредством различных операторов python.
Оператор python (Python)[править | править код]
Оператор python принимает блок кода на Python и запускает его, когда управление достигнет оператора. Базовый оператор python может быть очень простым:
python:
flag = True
Операторы python могут принимать более сложные формы, когда это необходимо:
python:
player_health = max(player_health - damage, 0)
if enemy_vampire:
enemy_health = min(enemy_health + damage, enemy_max_health)
Есть два модификатора для оператора python, которые изменяют его поведение:
- hide
- При наличии модификатора hide, оператор python будет запускать на выполнение блок кода на Python в анонимной области видимости переменных. Область будет потеряна, когда блок кода на Python завершится.
- Это позволяет использовать в коде на Python временные переменные, которые нельзя сохранить, но это означает, что хранилищу необходим доступ в виде полей на объект хранилища, а не напрямую.
- in
- Модификатор in принимает имя. Вместо выполнения в хранилище по умолчанию, блок кода на Python будет выполняться в хранилище с этим именем.
Однострочный оператор python (One-line Python Statement)[править | править код]
Распространенный случай заключается в создании одной строки Python, которая запускается в хранилище по умолчанию. Например, однострочник Python может использоваться для инициализации или обновления флага. Чтобы сделать написание однострочника Python более удобным, существует однострочный оператор python.
Однострочный оператор python начинается с символа знак доллара ($) и содержит весь код в этой строке. Вот несколько примеров python однострочников:
# Установка флага.
$ flag = True
# Инициализация переменной.
$ romance_points = 0
# Увеличение переменной.
$ romance_points += 1
# Вызов функции, которая показыват функциональные возможности Ren'Py
$ renpy.movie_cutscene("opening.ogv")
Однострочники Python всегда запускается в хранилище по умолчанию.
Оператор init Python (Init Python Statement)[править | править код]
Оператор init python запускает код Python во время инициализации до загрузки игры. Среди прочего, оператор можно использовать для определения классов и функций, а также для инициализации стилей, переменных конфигурации или постоянных данных.
init python:
def auto_voice_function(ident):
return "voice/" + ident + ".ogg"
config.auto_voice = auto_voice_function
if persistent.endings is None:
persistent.endings = set()
init 1 python:
# Плохая концовка всегда разблокирована.
persistent.endings.add("bad_ending")
Указатель приоритета может быть размещён между init и python. Если приоритет не задан, используется 0. Операторы init выполняются в порядке приоритета, от наименьшего к наибольшему. Операторы init с одинаковым приоритетом выполняются в порядке Unicode по имени файла, а затем сверху вниз в файле.
Чтобы избежать конфликта с Ren'Py, создатели должны использовать приоритеты в диапазоне от -999 до 999. Обычно приоритеты менее 0 используются для библиотек и для настройки тем. Обычные операторы инициализации должны иметь приоритет 0 или выше.
Операторы init python также используют модификаторы hide или in.
Переменные, значения которых установлены в блоке init python, не сохраняются, не загружаются и не участвуют в откате. Поэтому эти переменные не следует изменять после завершения инициализации.
Оператор define (Define Statement)[править | править код]
Во время инициализациии оператор define устанавливает значение одной переменной. Например:
define e = Character("Эйлин")
эквивалентно:
init python:
e = Character("Эйлин")
Оператор define может принимать дополнительное именованное хранилище (см.ниже), путем добавления его к имени переменной с точкой. Например:
define character.e = Character("Эйлин")
Одно из преимуществ использования оператора define заключается в том, что он записывает имя файла и номер строки, в которой произошло назначение, и делает их доступными для функции навигации Ren'Py launcher.
Переменные, определенные с помощью оператора define, обрабатываются как константы, не сохраняются и не загружаются, а так же их не следует изменять. Ren'Py не принуждает к этому, но будет вызывать неопределенное поведение, когда это не так.
Оператор default (Default Statement)[править | править код]
Оператор default устанавливает значение одной переменной, если эта переменная не определена при запуске игры или после загрузки новой игры. Например:
default points = 0
Когда переменная points не определена в начале игры, этот оператор эквивалентен:
label start:
$ points = 0
Когда переменная points не определена при загрузке игры, это эквивалентно:
label after_load:
$ points = 0
Оператор default может принимать дополнительное именованное хранилище (см.ниже), путем добавления его к имени переменной с точкой. Например:
default schedule.day = 0
Оператор init offset (Init Offset Statement)[править | править код]
Оператор init offset задаёт смещение приоритета для всех операторов, выполняемых во время инициализации (init, init python, define, default, screen, transform, style и more). Смещение применяется ко всем следующим операторам в текущем блоке и повторных блоках, вплоть до следующего оператора приоритета инициализации. Оператор:
init offset = 42
задаёт смещение приоритета на 42. В коде:
init offset = 2
define foo = 2
init offset = 1
define foo = 1
init offset = 0
Первый оператор define выполняется с приоритетом 2, что означает, что он запускается после второго оператор define и, следовательно, foo завершается со значение 2.
Имена в хранилище (Names in the Store)[править | править код]
Место по умолчанию, где Ren'Py хранит переменные Python, называется хранилище. Очень важно удостовериться, что имена, используемые в хранилище, не противоречат друг другу.
Оператор define присваивает значение переменной, даже когда она используется для определения персонажа. Это означает, что нельзя использовать одно и то же имя для персонажа и флага.
Ниже представлен неправильный код:
define e = Character("Эйлин")
label start:
$ e = 0
e "Привет, мир."
$ e += 1
e "Ты заработал очко!"
Он не будет работать, потому что переменная e используется и как имя персонажа, и как флаг.
Другие вещи, которые обычно помещаются в хранилище - переходы и преобразования.
Имена, начинающиеся с символа подчеркивания (_), зарезервированы для внутреннего использования Ren'Py. Кроме того, существует список зарезервированных имён.
Прочие именованные хранилища (Other Named Stores)[править | править код]
Именованные хранилища предоставляют возможность организации функций и переменных Python в модули. Помещая Python в модули, можно свести к минимуму вероятность конфликтов имён.
Доступ к именованным хранилищам можно получить, путём постановки модуля in к python или init python, каждый из которых запускает Python в именованном хранилище. Каждое хранилище соответствует модулю Python. Хранилище по умолчанию - store, тогда как именованное хранилище доступно, как store.name. Эти модули Python можно импортировать с помощью оператора import языка программирования Python, а имена в модулях можно импортировать с помощью оператора from языка программирования Python.
Например:
init python in mystore:
serial_number = 0
def serial():
global serial_number
serial_number += 1
return serial_number
init python:
import store.mystore as mystore
label start:
$ serial = mystore.serial()
Именованные хранилища участвуют в сохранении, загрузке и откате, так же, как и хранилище по умолчанию. Оператор defined может использоваться для определения имён в именованном хранилище.
Собственные и сторонние модули и пакеты на Python (First and Third Party Python Modules and Packages)[править | править код]
Ren'Py можете импортировать модули и пакеты на чистом Python. Собственные модули и пакеты, написанный для игры, могут быть помещены непосредственно в директорию игры. Сторонние пакеты могут быть помещены в директорию game/python-packages.
Например, чтобы установить требуемый пакет, можно перейти в базовую директорию игры и запустить следующую команду:
pip install --target game/python-packages requests
В любом случае модуль или пакет можно импортировать из init python блока:
init python:
import requests
Предупреждение! Python, определенный в .rpy файлах, преобразуется для обеспечения возможности отката. Python, импортируемый из .py файлов, такого не делает. В результате объекты, созданные в Python, не будут работать с откатом и, вероятно, не должны быть изменены после создания.
Источник[править | править код]
- Статья "Python Statements" на английском языке.
- Помощь при переводе статьи "Python Statements" на русский язык: "Launchpad: python".
На главную страницу | Официальная документация движка | Вернуться к началу статьи |