Переходы

Переходы могут использоваться как часть оператора with, а также в других частях Ren'Py для применения эффектов к изменениям в сцене (или иногда для превращения одного отображаемого объекта в другой). В Ren'Py есть небольшой набор предопределённых переходов, которые можно передавать непосредственно в оператор with. Например:

show bg washington
with dissolve

Предопределённые переходы

dissolve

Растворение старого экрана в новом в течение 0.5 секунд. Экземпляр класса перехода Dissolve().

fade

Затемнение до чёрного в течение 0.5 секунд, а затем проявление нового экрана в течение 0.5 секунд. Экземпляр класса перехода Fade().

pixellate

Пикселизация старой сцены в течение 0.5 секунд и новой сцены в течение ещё 0.5 секунд. Экземпляр класса перехода Pixellate().

move

Перемещение изображений, изменивших своё местоположение, в их новые позиции в течение 0.5 секунд. Экземпляр класса перехода MoveTransition().

Переходы типа move и подобные, например ease, могут применяться только к одному слою или ко всем слоям одновременно с помощью оператора with. Они не будут работать в других контекстах, таких как ATL, ComposeTransition(), или при других способах применения переходов.

moveinright

Также: moveinleft, moveintop, moveinbottom

Эти переходы перемещают появляющиеся изображения на экран с соответствующей стороны, занимая 0.5 секунд.

moveoutright

Также: moveoutleft, moveouttop, moveoutbottom

Эти переходы перемещают исчезающие изображения за пределы экрана через соответствующую сторону, занимая 0.5 секунд.

ease

Также: easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom

Они похожи на семейство переходов move-, за исключением того, что используют кривую на основе косинуса для замедления в начале и в конце перехода.

zoomin

Увеличивает появляющиеся изображения, занимая 0.5 секунд.

zoomout

Уменьшает исчезающие изображения, занимая 0.5 секунд.

zoominout

Увеличивает появляющиеся изображения и уменьшает исчезающие изображения, занимая 0.5 секунд.

vpunch

При вызове этот переход встряхивает экран по вертикали в течение четверти секунды. Имитировать и настраивать этот переход и hpunch лучше всего с помощью ATL-переходов.

hpunch

При вызове этот переход встряхивает экран по горизонтали в течение четверти секунды.

blinds

Переход экрана с эффектом вертикальных жалюзи, длящийся 1 секунду. Экземпляр класса перехода ImageDissolve().

squares

Переход экрана с эффектом квадратов, длящийся 1 секунду.

wipeleft

Также: wiperight, wipeup, wipedown

Стирает сцену в указанном направлении. Экземпляры класса перехода CropMove().

slideleft

Также: slideright, slideup, slidedown

Сдвигает новую сцену в указанном направлении. Экземпляры класса перехода CropMove().

slideawayleft

Также: slideawayright, slideawayup, slideawaydown

Сдвигает старую сцену в указанном направлении. Экземпляры класса перехода CropMove().

pushright

Также: pushleft, pushup, pushdown

Эти переходы используют новую сцену, чтобы выдвинуть старую сцену за указанную сторону. Экземпляры класса перехода PushMove().

irisin

Также: irisout

Использует прямоугольную диафрагму (iris) для отображения нового экрана или скрытия старого. Экземпляры класса перехода CropMove().

Классы переходов

Классы переходов — это функции, которые можно вызывать для создания новых переходов. Эти функции параметризованы, что позволяет создавать целые семейства переходов. В отличие от того, что может подразумевать этот термин, они обычно не являются классами в смысле Python, и их не следует рассматривать как таковые.

Вызов классов переходов можно выполнять как часть оператора with. Например:

# Очень долгое растворение.
with Dissolve(10.0)

Если один и тот же класс перехода используется многократно, можно использовать оператор define, чтобы присвоить переход переменной:

define dissolve1 = Dissolve(1.0)

label start:
    show bg washington
    with dissolve1

Аргументу time_warp, принимаемому многими классами переходов, можно передать встроенные варперы из модуля _warper, см. warpers.

AlphaDissolve(control, delay=0.0, *, reverse=False, mipmap=None)

Возвращает переход, который использует управляющий displayable (почти всегда какой-либо анимированный transform) для перехода от одного экрана к другому. Transform вычисляется. Новый экран используется там, где transform непрозрачен, а старое изображение — где он прозрачен.

control

Управляющий transform.

delay

Время, которое занимает переход, до его завершения.

reverse

Если true, альфа-канал инвертируется. Непрозрачные области берутся со старого изображения, а прозрачные — с нового.

mipmap

Когда dissolve будет масштабирован до размера менее половины от его естественного размера, это свойство можно установить в True. Это приведет к генерации mipmap-уровней, что увеличит потребление ресурсов GPU, но уменьшит артефакты. См. mipmap для дополнительной информации.

ComposeTransition(trans, before, after)

Возвращает переход, который компонует до трех переходов. Если не None, переходы before и after применяются к старой и новой сценам соответственно. Эти обновленные старая и новая сцены затем передаются в переход trans.

# Move the images in and out while dissolving. (This is a fairly expensive transition.)
define moveinoutdissolve = ComposeTransition(dissolve, before=moveoutleft, after=moveinright)
CropMove(time, mode='slideright', startcrop=(0.0, 0.0, 0.0, 1.0), startpos=(0.0, 0.0), endcrop=(0.0, 0.0, 1.0, 1.0), endpos=(0.0, 0.0), topnew=True)

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

time

Время, которое занимает переход.

mode

Название режима перехода. Существует три группы режимов: шторки (wipes), сдвиги (slides) и другие. Также может быть "custom", чтобы позволить определить пользовательский режим.

При шторке (wipe), изображение остается на месте, и по мере перехода открывается все большая его часть. Например, при "wiperight", шторке слева направо, сначала левый край изображения появляется на левом краю экрана, затем центр изображения, и, наконец, правая сторона изображения на правом краю экрана. Другие поддерживаемые шторки: "wipeleft", "wipedown", и "wipeup".

При сдвиге (slide) изображение движется. Так, при "slideright" правый край изображения начинается у левого края экрана и движется вправо по мере перехода. Другие сдвиги: "slideleft", "slidedown", и "slideup".

Также есть "slideaways", при которых старое изображение движется поверх нового. "Slideaways" включают "slideawayright", "slideawayleft", "slideawayup" и "slideawaydown".

Мы также поддерживаем прямоугольную диафрагму внутрь с "irisin" и прямоугольную диафрагму наружу с "irisout".

Следующие параметры учитываются, только если режим "custom". Позиции указываются относительно размера экрана, а обрезка — относительно размера изображения. Таким образом, обрезка (0.25, 0.0, 0.5, 1.0) берет среднюю половину изображения.

startcrop

Начальный прямоугольник, который вырезается из верхнего изображения. Кортеж из 4 элементов, содержащий x, y, ширину и высоту.

startpos

Начальная позиция, в которой верхнее изображение рисуется на экране. Кортеж из 2 элементов, содержащий x и y.

endcrop

Конечный прямоугольник, который вырезается из верхнего изображения. Кортеж из 4 элементов, содержащий x, y, ширину и высоту.

endpos

Конечная позиция, в которой верхнее изображение рисуется на экране. Кортеж из 2 элементов, содержащий x и y.

topnew

Если true, сцена, которая обрезается и перемещается (и находится поверх другой сцены), является новой сценой. Если false, это старая сцена.

define wiperight = CropMove(1.0, "wiperight")
define wipeleft = CropMove(1.0, "wipeleft")
define wipeup = CropMove(1.0, "wipeup")
define wipedown = CropMove(1.0, "wipedown")

define slideright = CropMove(1.0, "slideright")
define slideleft = CropMove(1.0, "slideleft")
define slideup = CropMove(1.0, "slideup")
define slidedown = CropMove(1.0, "slidedown")

define slideawayright = CropMove(1.0, "slideawayright")
define slideawayleft = CropMove(1.0, "slideawayleft")
define slideawayup = CropMove(1.0, "slideawayup")
define slideawaydown = CropMove(1.0, "slideawaydown")

define irisout = CropMove(1.0, "irisout")
define irisin = CropMove(1.0, "irisin")
Dissolve(time, *, time_warp=None, mipmap=None)

Возвращает переход, который плавно переходит (dissolve) от старой сцены к новой.

time

Время, которое займет переход.

time_warp

Функция, которая изменяет временную шкалу. Если не None, это должна быть функция, принимающая дробное время от 0.0 до 1.0, и возвращающая число в том же диапазоне.

mipmap

Когда dissolve будет масштабирован до размера менее половины от его естественного размера, это свойство можно установить в True. Это приведет к генерации mipmap-уровней, что увеличит потребление ресурсов GPU, но уменьшит артефакты. См. mipmap для дополнительной информации.

Fade(out_time, hold_time, in_time, *, color='#000')

Возвращает переход, который за out_time секунд плавно затемняется до экрана, заполненного цветом color, остается на этом экране hold_time секунд, а затем за in_time секунд плавно проявляется новая сцена.

# Fade to black and back.
define fade = Fade(0.5, 0.0, 0.5)

# Hold at black for a bit.
define fadehold = Fade(0.5, 1.0, 0.5)

# Camera flash - quickly fades to white, then back to the scene.
define flash = Fade(0.1, 0.0, 0.5, color="#fff")
ImageDissolve(image, time, ramplen=8, *, reverse=False, time_warp=None, mipmap=None)

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

image

Управляющее изображение. Может быть любым displayable. Оно должно быть того же размера, что и переходящие сцены, и если reverse=True, оно должно быть полностью непрозрачным.

time

Время, которое займет переход.

ramplen

Длина используемого градиента (ramp). Должно быть целой степенью 2. При значении по умолчанию 8, когда белый пиксель полностью проявился, пиксель на 8 оттенков серого темнее завершит один шаг проявления.

reverse

Если True, черные пиксели проявятся раньше белых.

time_warp

Функция, которая изменяет временную шкалу. Если не None, это должна быть функция, принимающая дробное время от 0.0 до 1.0, и возвращающая число в том же диапазоне.

mipmap

Когда dissolve будет масштабирован до размера менее половины от его естественного размера, это свойство можно установить в True. Это приведет к генерации mipmap-уровней, что увеличит потребление ресурсов GPU, но уменьшит артефакты. См. mipmap для дополнительной информации.

define circirisout = ImageDissolve("circiris.png", 1.0, time_warp=_warper.easeout)
define circirisin = ImageDissolve("circiris.png", 1.0, reverse=True, time_warp=_warper.easein)
define circiristbigramp = ImageDissolve("circiris.png", 1.0, ramplen=256)
MoveTransition(delay, *, enter=None, leave=None, old=False, layers=['master'], time_warp=_warper.linear, enter_time_warp=_warper.linear, leave_time_warp=_warper.linear)

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

Поскольку только у слоев есть теги, MoveTransitions можно применять только к одному слою или ко всем слоям сразу, используя инструкцию with. Это не сработает в других контекстах, таких как ATL, ComposeTransition() или других способах применения переходов.

delay

Время, которое требуется для завершения интерполяции.

old

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

layers

Список слоев, к которым применяются перемещения.

Два следующих параметра принимают transform'ы, которые не должны быть анимированы во времени.

enter

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

leave

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

Три следующих параметра принимают функции искажения времени, которые принимают число от 0.0 до 1.0 и должны возвращать число в том же диапазоне.

time_warp

Функция искажения времени, применяемая к изображениям, меняющим положение между старой и новой сценами.

enter_time_warp

Функция искажения времени, применяемая к изображениям, появляющимся на сцене.

leave_time_warp

Функция искажения времени, применяемая к изображениям, покидающим сцену.

define longer_easein = MoveTransition(3.0, enter=offscreenright, enter_time_warp=_warper.easein)

В следующем коде, "a" будет покидать сцену (используя leave и leave_time_warp), "b" будет менять положение (используя time_warp), а "c" будет появляться (используя enter и enter_time_warp). Поскольку тот же тег применяется до и после, "d" не будет считаться появляющимся или покидающим, а будет считаться меняющим положение.

define some_move_trans = MoveTransition(...)

label start:
    show a
    show b at left
    show ugly_eileen as d at right
    e "This is a dialogue !"

    hide a
    show b at right
    show c
    show pretty_eileen as d at left
    with some_move_trans

Во время изменения положения "d", будет ли показана ugly или pretty eileen, зависит от значения old: если old равно False, по умолчанию, ugly_eileen мгновенно превратится в pretty_eileen, а затем начнет движение; а если old равно True, ugly_eileen сначала переместится, а затем мгновенно превратится в pretty_eileen.

MultipleTransition(args)

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

args

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

  • Displayable.

  • False, чтобы использовать старую сцену.

  • True, чтобы использовать новую сцену.

Почти всегда первый аргумент будет False, а последний True.

Обратите внимание, что это один параметр, принимающий список, а не *args.

Переходы в args применяются по порядку. Для каждого перехода старой сценой является экран перед ним, а новой — сцена после него. Например:

define logodissolve = MultipleTransition([
    False, Dissolve(0.5),
    "logo.jpg", Pause(1.0),
    "logo.jpg", dissolve,
    True])

Этот пример выполнит переход к logo.jpg, подождет 1 секунду, а затем выполнит переход к новой сцене.

Pause(delay)

Возвращает переход, который просто отображает новый экран в течение delay секунд. Может быть полезен как часть MultipleTransition.

Pixellate(time, steps)

Возвращает переход, который пикселизирует старый экран, а затем проявляет через пикселизацию новый экран.

time

Общее время, которое займет переход, в секундах.

steps

Количество шагов, которое произойдет в каждом направлении. Каждый шаг создает пиксели примерно в два раза больше, чем на предыдущем шаге, так что 5-шаговая пикселизация создаст пиксели размером 32x32.

PushMove(time, mode='pushright')

Возвращает переход, который работает, беря новую сцену и используя ее, чтобы "вытолкнуть" старую сцену с экрана.

time

Время, которое занимает переход.

mode

Существует четыре возможных режима: "pushright", "pushleft", "pushup" и "pushdown", которые выталкивают старую сцену с экрана в указанном направлении.

define pushright = PushMove(1.0, "pushright")
define pushleft = PushMove(1.0, "pushleft")
define pushup = PushMove(1.0, "pushup")
define pushdown = PushMove(1.0, "pushdown")
Swing(delay=1.0, vertical=False, reverse=False, background='#000', flatten=True)

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

delay

Сколько времени должен занимать переход.

vertical

Если true, сцена вращается вокруг оси X (пиксели движутся вертикально). Если false, сцена вращается вокруг оси Y, пиксели движутся горизонтально.

reverse

Если true, вращение происходит в обратном направлении.

background

Displayable, который размещается за сценой во время ее вращения.

flatten

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

Семейства переходов

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

define.move_transitions(prefix, delay, time_warp=None, in_time_warp=None, out_time_warp=None, old=False, layers=['master'], **kwargs)

Определяет семейство переходов движения, аналогичных переходам move и ease. Для заданного prefix это определяет следующие переходы:

  • prefix - Переход, который занимает delay секунд, чтобы переместить изображения, изменившие свои позиции, на новые места.

  • prefixinleft, prefixinright, prefixintop, prefixinbottom - Переходы, которые занимают delay секунд для перемещения изображений, изменивших свои позиции, на новые места, при этом новые изображения появляются с соответствующей стороны.

  • prefixoutleft, prefixoutright, prefixouttop, prefixoutbottom - Переходы, которые занимают delay секунд для перемещения изображений, изменивших свои позиции, на новые места, при этом скрытые изображения уходят с соответствующей стороны.

Другие параметры такие же, как у MoveTransition:

time_warp, in_time_warp, out_time_warp

Функции деформации времени, которые получают время от 0.0 до 1.0, представляющее долю завершённого перемещения, и возвращают значение в том же диапазоне, указывающее долю завершённого линейного перемещения.

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

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

old

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

layers

Слои, к которым будет применён переход.

# Это определяет все предопределённые переходы, начинающиеся
# с "move".
init python:
    define.move_transitions("move", 0.5)

Словарные переходы

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

Когда используется словарь, пауза, которая обычно происходит во время перехода, не возникает. Вместо этого оператор, принимающий словарь, возвращает управление немедленно, а переходы планируются к выполнению в начале следующего взаимодействия.

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

define dis = { "master" : Dissolve(1.0) }

label start:
    show eileen happy
    with dis

    e "Hello, world."

Растворение будет происходить во время отображения текста на экране.

Словарные переходы по слоям не могут использоваться везде, где может использоваться переход, а только там, где возможно применение переходов к слою. Их можно использовать с оператором with и with частью операторов scene, show и hide. Их также можно использовать с renpy.with_statement() и renpy.transition(), действиями Show() и Hide() и различными переменными конфигурации, принимающими переходы. Словарные переходы по слоям не будут работать внутри конструкций, которые не работают со слоями, таких как ATL - Язык анимации и трансформации, ComposeTransition() и MultipleTransition().

Это может плохо взаимодействовать с операторами, которые сами вызывают переход, например, с переходами, вызванными window auto. Эту проблему часто можно решить с помощью второго словарного перехода, который применяется к другому слою. Например, если вы видите странное мигание при появлении и скрытии окна диалога, подумайте об изменении файла options.rpy, добавив:

define config.window_show_transition = { "screens" : Dissolve(.25) }
define config.window_hide_transition = { "screens" : Dissolve(.25) }

Это работает, потому что окно диалога полностью находится на слое screens.

ATL-переходы

См. также: ATL - Язык анимации и трансформации

Можно использовать ATL-преобразование для определения перехода. Эти переходы должны принимать аргументы old_widget и new_widget, которые получат отображаемые объекты, представляющие экраны, между которыми происходит переход.

ATL-переход должен установить для себя свойство delay, равное количеству секунд, в течение которых длится переход. Он может использовать свойство events, чтобы старый отображаемый объект не получал события.

transform spin(duration=1.0, *, new_widget=None, old_widget=None):

    # Устанавливаем, сколько времени займёт это преобразование.
    delay duration

    # Центрируем его.
    xcenter .5
    ycenter .5

    # Вращаем старый отображаемый объект.
    old_widget
    events False
    rotate 0.
    easeout (duration / 2) rotate 360.0

    # Вращаем новый отображаемый объект.
    new_widget
    events True
    easein (duration / 2) rotate 720.0

Python-переходы

В качестве перехода может использоваться вызываемый объект Python. Для этого он должен принимать два именованных аргумента, описанных ниже, и возвращать отображаемый объект, который выполняет эффект перехода — обычно делегируя это другому переходу. Два именованных аргумента — это old_widget, который представляет старый экран, и new_widget, который представляет новый экран.

Отображаемый объект, возвращаемый вызываемым объектом, должен иметь атрибут delay, установленный в количество секунд, в течение которых должен длиться переход.

Например:

init python:
    def dissolve_or_pixellate(old_widget=None, new_widget=None):
        if persistent.want_pixellate:
            return pixellate(old_widget=old_widget, new_widget=new_widget)
        else:
            return dissolve(old_widget=old_widget, new_widget=new_widget)

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

Автоматические переходы после Scene, Show и Hide

Ren'Py может автоматически показывать переход после серии операторов scene, show и hide. Этот переход можно включить, установив для переменной _scene_show_hide_transition значение перехода, который будет использоваться.

Переход произойдёт после одного или нескольких операторов scene, show и hide, при условии, что за оператором не следует оператор with или переход, вызванный управлением окном диалога, как, например, различные операторы window. Он также отключается в контексте меню.

Например:

define _scene_show_hide_transition = Dissolve(0.25)

label start:
    scene bg washington
    show eileen happy

    "Здесь переход не произойдёт, потому что появилось окно диалога."

    show lucy mad at right

    "Здесь переход произойдёт."

    hide lucy mad
    show eileen vhappy

    "И здесь он тоже произойдёт."