Операторы в языке программирования Python (Python Statements)

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

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, не будут работать с откатом и, вероятно, не должны быть изменены после создания.


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

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

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