Изображения, расположенные сбоку диалогового окна (Side Images)

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

Многие визуальные новеллы включают изображения говорящего персонажа как часть их интерфейса. Ren'Py называет такие изображения боковыми и поддерживает автоматический выбор и отображение таких изображения в рамках диалога.

Поддержка бокового изображения предполагает, что Character() объявлен со связанным тегом изображения:

define e = Character("Эйлин", image="eileen")

Когда говорит персонаж со связанным тегом изображения, Ren'Py создаёт пул атрибутов изображения. В этот пул добавляется связанный тег изображения, а также текущие атрибуты изображения, связанные с этим тегом.

Чтобы определить боковое изображение, связанное с тегом, Ren'Py пытается найти изображение с тегом side и наибольшим количеством атрибутов из пула. Если изображение не найдено или несколько изображений имеют одинаковое количество атрибутов, отображается значение Null.

Например, у нас есть следующий скрипт:

define e = Character("Эйлин", image="eileen")

image eileen happy = "eileen_happy.png"
image eileen concerned = "eileen_concerned.png"

image side eileen happy = "side_eileen_happy.png"
image side eileen = "side_eileen.png"

label start:

    show eileen happy

    e "Назовем эту линию Точкой A."

    e concerned "А это Точка B."

В данном коде о точке А говорит персонаж е, связанный с тегом изображения "eileen". Отображается изображение "eileen happy", поэтому в пул атрибутов добавляется "eileen" и "happy". Мы ищем изображение с тегом "side" и как можно большим количеством этих атрибутов – и сопоставляем "side eileen happy", которое будет отображаться на боковом изображении Ren'Py.

В точке B отображается изображение "eileen concerned". Теперь пул атрибутов - "eileen" и "concerned". Единственным подходящее изображением – "side eileen", так что именно оно выбирается Ren'Py. Если бы в скрипте было изображение "side concerned", то это привело к двусмысленности, и тогда Ren'Py не отобразил бы изображение.

Скрытые персонажи (Invisible Characters)[править | править код]

Ещё один способ использования бокового изображения – отобразить изображение персонажа игрока, когда он говорит. Это можно сделать с помощью привязки изображения к персонажу, а затем использовать конструкцию say с атрибутами для выбора бокового изображения для отображения.

Например:

define p = Character("Игрок", image="player")

image side player happy = "side_player_happy.png"
image side player concerned = "side_player_concerned.png"

label start:

    p happy "Это отображено с помощью изображения 'side player happy'."

    p "Это также показано с помощью 'side player happy'."

    p concerned "Это отображено с помощью 'side player concerned'."

Вариации (Variations)[править | править код]

Существует ряд атрибутов боковых изображений, которыми можно управлять с помощью переменных конфигурации.


define config.side_image_tag = None

Если задана, то боковое изображение будет отслеживать заданный тег изображения, а не изображение, связанное с текущим говорящим персонажем. Например:
define e = Character("Эйлин", image="eileen")

init python:
     config.side_image_tag = "eileen"
Заставит боковое изображение отслеживать тег изображения "eileen", который связан с персонажем е.


define config.side_image_only_not_showing = False

Если установлено значение True, боковое изображение будет отображаться только в том случае, если изображение с этим тегом ещё не отображается на экране.


define config.side_image_prefix_tag = 'side'

Префикс, используемый при поиске бокового изображения.


define config.side_image_null = Null()

Значение Null, которое можно использовать, когда боковое изображение не отображается. Изменяться, но только для других Null объектов. Одна из причин заключается в том, чтобы установить сторону Null (например, Null(width=200, height=150)) для предотвращения растворения из-за прерывания.


define config.side_image_same_transform = None

Если принимает значение не None, преобразование, которое используется, когда новое боковое изображение использует тот же тег изображения, что и предыдущее боковое изображение.


define config.side_image_change_transform = None

Если принимает значение не None, преобразование, которое используется, когда новое боковое изображение не разделяет имя тега изображения (или одно из новых или старых боковых изображений не существует).

Преобразования и переходы (Transforms and Transitions)[править | править код]

Преобразования config.side_image_same_transform и config.side_image_change_transform вызываются с двумя аргументами (old и new), когда боковое изображение отображается. Их можно использовать для перемещения по боковым изображениям или для перехода между боковыми изображениями.

Это заставляет боковое изображение выдвигаться и сдвигаться при изменении персонажа, связанного с этим изображением:

transform change_transform(old, new):
    contains:
        old
        yalign 1.0
        xpos 0.0 xanchor 0.0
        linear 0.2 xanchor 1.0
    contains:
        new
        yalign 1.0
        xpos 0.0 xanchor 1.0
        linear 0.2 xanchor 0.0

define config.side_image_change_transform = change_transform


Это используется для растворения между старыми и новыми боковыми изображениями, когда персонаж остаётся неизменным. Например, когда персонаж меняет эмоции. Для корректной работы Dissolve оба боковых изображения должны быть одного размера.

transform same_transform(old, new):
    old
    new with Dissolve(0.2, alpha=True)

define config.side_image_same_transform = same_transform


Пространство / Настройка (Leaving Room / Customization)[править | править код]

По умолчанию текст занимает всю ширину экрана. Если попытаетесь отобразить боковое изображение, оно выведется поверх текста. Чтобы это исправить, нужно добавить margin или padding на соответствующей стороне текстового окна:

style window:
    left_padding 150


Положение бокового изображения можно изменить, настроив экраны say или nvl. Оба включают строку:

add SideImage() xalign 0.0 yalign 1.0


Изменяя свойства xalign и yalign, можно управлять расположением бокового изображения на экране.


Наконец, функция SideImage() возвращает в качестве отображаемого объекта текущее боковое изображение. Это можно использовать как часть более сложной настройки экрана.


Функции (Functions)[править | править код]

renpy.get_side_image(prefix_tag, image_tag=None, not_showing=None, layer=None)

Пытается найти изображение, которое будет отображаться в качестве бокового изображения.
Начинается с определения набора атрибутов изображения. Если задан image_tag, он получает атрибуты изображения из тега. Иначе он получает их от текущего показываемого персонажа.
Затем он ищет изображение с тегом prefix_tag и этими атрибутами и возвращает его, если он существует.
Если not_showing принимает значение True, то это возвращает боковое изображение только в том случае, если изображение, из которого взяты атрибуты, отсутствует на экране. Если принимает значение None, значение берется из config.side_image_only_not_showing.
Если layer принимает значение None, для текущего отображаемого тега используется слой по умолчанию.


renpy.set_tag_attributes(name, layer=None)

Устанавливает атрибуты, связанные с тегом изображения, когда этот тег изображения не отображается. Основное использование этого - прямая установка атрибутов, используемых боковым изображением.
Например:
$ renpy.set_tag_attributes("lucy mad")
$ renpy.say(l, "Я довольно сердита.")
и
l mad "Я довольно сердита."
эквивалентны.

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

Статья "Side Images" на английском языке.


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