Переходы
Переходы могут использоваться как часть оператора 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
"И здесь он тоже произойдёт."