轉場(transition)

在Ren’Py中,轉場(transition)可以用作 with 語句 及其他語句的一部分,用於場景切換(或將某個可視組件切換為另一個)時提供各種效果。 Ren’Py自帶一些預定義的轉場(transition)效果,可以直接使用在 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語句 應用在單個圖層或同時應用在所有圖層。 其不能在其他場景下生效,比如 ATLComposeTransition() 等。

moveinright

及: moveinleft, moveintop, moveinbottom

從界面上對應的邊界移入圖像,用時0.5秒。

moveoutright

及: moveoutleft, moveouttop, moveoutbottom

從界面上對應的邊界移出圖像,用時0.5秒。

ease

及: easeinright, easeinleft, easeintop, easeinbottom, easeoutright, easeoutleft, easeouttop, easeoutbottom

類似於上面的move系列轉場效果,差別在於ease系列基於餘弦曲線放緩開始和結束的轉場。

zoomin

鏡頭放大切入圖像,耗時0.5秒。

zoomout

鏡頭縮小離開圖像,耗時0.5秒。

zoominout

先鏡頭放大切入圖像,然後鏡頭縮小離開圖像,耗時0.5秒。

vpunch

這種轉場效果,會垂直搖晃界面0.25秒。 可以使用 ATL轉場 仿寫一個vpunch轉場和 hpunch 類似的效果。

hpunch

這種轉場效果,會水平搖晃界面0.25秒。

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() 轉場類的實例。

轉場(transition)類

轉場(transition)類是可以用於創建新轉場效果的功能函數。這些函數是參數化的,允許創建一個系列的轉場。 與表象有差別的是,這些通常在Python中不認為是通常的“類(class)”,也不應視為具有各種類特徵的抽象。

使用with語句就可以調用轉場類。舉例:

# 一個持續時間10秒的溶解轉場
with Dissolve(10.0)

如果我們經常調用同一個轉場效果,可以使用 define語句 把轉場效果聲明為一個變數。

define dissolve1 = Dissolve(1.0)

label start:
    show bg washington
    with dissolve1

time_warp參數可以使用 _warper 模組中內建warper類中對應的多個轉場對象, 詳見 warpers

class AlphaDissolve(control, delay=0.0, alpha=False, reverse=False)

返回一個轉場(transition)效果,其使用一個控制組件(大多數情況下是某些動畫)實現新舊界面的轉場。transform表達式會進行計算。當transform完全不透明時新界面被啟用,而transform完全透明時依然使用舊界面。

control

控制transform。

delay

轉場效果使用時間。

reverse

若該值為True,alpha通道值反轉。不透明區域來自舊圖像,而透明區域來自新圖像。

mipmap

如果溶解轉場會將圖片縮小至原尺寸的一半以下,可以將 mipmap 樣式特性設置為True。 生成mipmap會消耗更多GPU資源,但能減少顯示瑕疵。詳見 mipmap

class ComposeTransition(trans, before, after)

返回由三種轉場合成的一個轉場效果。 beforeafter 轉場會分別應用在舊場景和新場景,前提是這兩個參數非None。被更新後的舊場景和新場景最後還會應用 trans 轉場效果。

# 舊場景圖像從左側移出,新場景圖像從右側移入,同時使用溶解效果。(這是一個系統消耗比較大的轉場。)
define moveinoutdissolve = ComposeTransition(dissolve, before=moveoutleft, after=moveinright)
class 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)

返回一個轉場效果,其會剪裁一個場景並將其放置在界面中指定位置。其可以模板化處理一堆效果,這些效果的共通點是將界面分割成矩形條(slice)。

time

轉場效果耗時。

mode

轉場模式名。轉場模式總共有3大類:wipes、slides、其他。也可以是“custom”,是一個用戶自己定義的模式。

在wipe模式下,原圖像先保持不變,然後逐漸使用轉場效果全部擦除。例如,在“wiperight”模式下,一個刷子會從左到右擦除原圖像,即先擦除界面最左邊的圖像,接著擦除界面中間,最後擦除界面最右邊。其他的wipe包括“wipeleft”、“wipedown”和“wipeup”。

在slide模式下,圖像會移動。在“slideright”模式下,圖像的右邊從界面的左邊開始,平移至界面右邊,完成整個轉場過程。其他slide模式包括“slideleft”、“slidedown”和“slideup”。

還有slideaway模式,這個模式下原圖像在新圖像上層,平移出界面。slideaway模式包括“slideawayright”、“slideawayleft”、“slideawayup”和“slideawaydown”。

我們還支持矩形iris,包括“irisin”和“irisout”。

下列參數值在模式為“custom”的情況下才會使用。位置資訊與界面尺寸相關,剪裁大小與圖像尺寸相關。一個(0.25, 0.0, 0.5, 1.0)的剪裁會使用某個圖像的中間一小塊。

startcrop

頂層圖像的剪裁起始矩形。一個4元素的元組,包含x、y、width和height。

startpos

頂層圖像繪製在界面上起始坐標。一個2元素的元組,包含x和y。

endcrop

頂層圖像的剪裁結束矩形。一個4元素的元組,包含x、y、width和height。

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")
class Dissolve(time, *, time_warp=None, mipmap=None)

返回一個使用溶解效果切換新舊場景的轉場效果。

time

溶解效果持續時間。

time_warp

一個 調整時間線的功能函數。若不為None,其應該是一個使用0.0至1.0之間的小數作為輸入的函數,返回結果也是0.0至1.0之間。

mipmap

如果溶解轉場會將圖片縮小至原尺寸的一半以下,可以將 mipmap 樣式特性設置為True。 生成mipmap會消耗更多GPU資源,但能減少顯示瑕疵。詳見 mipmap

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

返回一個轉場效果,其使用入參 out_time 時間(單位為秒),逐漸將整個界面填充為 color 指定的顏色,維持這個界面 hold_time 指定的時間(單位為秒),最後使用入參 in_time 時間(單位為秒)逐漸切換為新界面。

# 逐漸變黑並還原。
define fade = Fade(0.5, 0.0, 0.5)

# 保持全黑界面1秒。
define fadehold = Fade(0.5, 1.0, 0.5)

# 鏡頭閃光——快速且為純白,然後恢復原界面。
define flash = Fade(0.1, 0.0, 0.5, color="#fff")
class ImageDissolve(image, time, ramplen=8, *, reverse=False, time_warp=None, mipmap=None)

返回一個轉場效果,其使用溶解特效切換新舊界面,並利用某個圖像控制溶解過程。這意味著純白的像素首先被溶解,而純黑的像素最後溶解。

image

使用的控制圖像。其必須是一個圖片文件或者圖像控制器。控制圖像需要與待溶解場景的尺寸一致。

time

溶解效果持續時間。

ramplen

色彩蔓延(ramp)步長。其必須是一個2的整次冪。預設值是8,當純白像素全部溶解之後,下一步溶解的像素是在灰度上比純白色低8度的顏色。

reverse

若該值為True,黑色像素反而先於白色像素溶解。

time_warp

一個 調整時間線的功能函數。若不為None,其應該是一個使用0.0至1.0之間的小數作為輸入的函數,返回結果也是0.0至1.0之間。

mipmap

如果溶解轉場會將圖片縮小至原尺寸的一半以下,可以將 mipmap 樣式特性設置為True。 生成mipmap會消耗更多GPU資源,但能減少顯示瑕疵。詳見 mipmap

define circirisout = ImageDissolve("circiris.png", 1.0)
define circirisin = ImageDissolve("circiris.png", 1.0, reverse=True)
define circiristbigramp = ImageDissolve("circiris.png", 1.0, ramplen=256)

如果溶解轉場會將圖片縮小至原尺寸的一半以下,可以將 mipmap 樣式特性設置為True。 生成mipmap會消耗更多GPU資源,但能減少顯示瑕疵。

class MoveTransition(delay, *, enter=None, leave=None, old=False, layers=['master'], time_warp=_warper.linear, enter_time_warp=_warper.linear, leave_time_warp=_warper.linear)

使用這些轉場時,圖像會用新舊場景插值計算,因此移動場景切換會更順滑。

由於只有圖層標籤(layer tag),MoveTransition只能使用 with語句 應用在單個圖層或同時應用在所有圖層。 在不同上下文(context)中無法使用MoveTransition, 例如 ATLComposeTransition() 等其他轉場。

delay

插入效果耗時。

old

若該值為True,轉場過程過圖像發生變化時,使用舊圖像而不是新圖像。 否則,使用新圖像。

layers

移動的圖層(layer)列表。

下面兩個參數可以使用變換(transform)賦值,並且動效時間不應長於整個轉場時間。

enter

若該值非空,圖像所進入的場景會一同移動。 enter 的值應是一個應用在圖像行的變換(transform),該變換可以獲取其起始坐標。

leave

若該值非空,圖像所離開的場景會一同移動。 leave 的值應是一個應用在圖像行的變換(transform),該變換可以獲取其結束坐標。

下面三個參數可以使用 調整時間線的功能函數 賦值,一個使用0.0至1.0之間的小數作為輸入的函數,返回結果也是0.0至1.0之間。

time_warp

應用於圖像位移效果的時間warp函數。

enter_time_warp

應用於圖像進入場景的時間warp函數。

leave_time_warp

應用於圖像離開場景的時間warp函數。

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

下列程式碼中,“a”會離開當前場景(用到 leaveleave_time_warp),“b”會修改位置(用到 time_warp), “c”會進入當前場景(用到 enterenter_time_warp)。 由於轉場前後的tag相同,所以“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”移動時,會根據 old 的取值決定顯示 ugly_eileen 還是 pretty_eileen: 如果 old 為預設值False,ugly_eileen會立刻變為pretty_eileen然後移動; 如果 old 為True,ugly_eileen會先移動到目標位置再立刻變為pretty_eileen。

class MultipleTransition(args)

返回一個轉場效果,其是多個轉場效果順序顯示之後的結果。

args

一個包含奇數個元素的 列表。列表中奇數序號的元素必須是場景,偶數序號的元素必須是轉場效果。這裡說的場景可以是如下類別之一:

  • 可視組件。

  • 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秒鐘後,再使用溶解效果切換至新場景。

class Pause(delay)

返回一個轉場效果,其會在 delay 秒後顯示新的場景。這個轉場效果可以用作MultipleTransition的一部分。

class Pixellate(time, steps)

返回一個轉場效果,其使用像素化切換新舊場景。

time

轉場效果總耗時,單位為秒。

steps

在各個方向展開像素化使用的步數。每一步都會創建出上一步兩倍寬度和高度的像素方塊,所以5步像素化就能創建出32×32大小的像素方塊。

class PushMove(time, mode='pushright')

返回一個轉場效果,其使用新場景把舊場景“推”出界面。

time

轉場效果耗時。

mode

總共有4種模式:“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")
class Swing(delay=1.0, vertical=False, reverse=False, background='#000', flatten=True)

一個轉場效果。將舊場景繞某個軸旋轉90度,此時畫面是該場景一條邊;切換為新場景並繼續旋轉90度。

delay

轉場持續時間。

vertical

若為True,場景繞x軸旋轉(像素在垂直方向移動)。若為False,場景繞y軸旋轉(像素在水平方向移動)。

reverse

若為True,反向旋轉。

background

場景旋轉時,顯示為背景的可視組件。

flatten

若為True,場景內元素將編排為螢幕尺寸相同的圖像進行旋轉。 某些圖像沒有完整顯示在螢幕中導致不希望出現的效果時,可以設置該參數。

轉場族群

轉場族群是可以定義一系列相關轉場效果的函數。

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

該函數定義了 MoveTransition 轉場效果的族群,類似於 moveease 轉場。 根據給定的入參 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),返回一個圖像直線運動的完成時間比例(取值範圍為0.0值1.0)。

該功能讓圖像運動速度複合緩動(ease)曲線,而不是讓所有圖像以一個統一恆定的速度移動。

三個變數分別對應停留在界面的圖像、新顯示的圖像和新隱藏的圖像。

old

若該值為True,某標籤(tag)對應的圖像在轉場過程中使用舊圖像;否則使用新圖像。

layers

應用轉場效果的圖層(layer)名。

# 這條語句定義了所有以“move”開頭的預定義轉場效果的delay時間
init python:
    define.move_transitions("move", 0.5)

字典轉場(Dict Transitions)

在很多Ren’Py用到轉場的地方,可以用一個字典存放各圖層和轉場的映射關係。這種情況下,Ren’Py會給每個圖層應用一個合適的轉場。

當用到dict時,不會發生轉場時通常發生的暫停。相反的是,dict語句立即返回字典,並且轉場在下一次交互時開始執行。

這可以與main圖層一起使用,以便在界面(screen)上顯示對話時發生轉場。舉個例子,如果我們寫成:

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

label start:
    show eileen happy
    with dis

    e "Hello, world."

溶解效果將在文本顯示的時候發生。

使用自定轉場時有一個例外,即字典中有一個鍵是 None。如果字典將 None 圖層映射至某個轉場,實際轉場效果是標準的暫停。這個功能可以用來通過 NoTransition 創建一個暫停。

字典層轉場不能在所有能用轉場的地方使用,只有在能給一個層應用的轉場時它才能使用。可以使用 with 語句和scene、show、hide語句的 with 子句。它也可以和 renpy.with_statement()renpy.transition()Show() and Hide() 行為和一系列接受轉場的config變數一起使用。 字典層*不會*在不能作用於層的功能上起作用,比如ATL,ComposeTransition()MultipleTransition()

這可能與導致轉場發生的語句互動不佳,就像由 window auto 產生的轉場。這通常可以透過適用於不同層次的第二個字典轉場來解決。舉例來說,如果你發現當對話窗口顯示和隱藏時出現了奇怪的閃動,試著把 options.rpy改成:

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

因為對話窗口整個都在界面(screen)層上所以可以修復這個問題。

ATL轉場

其他參考 動畫和變換語言

可以使用ATL變換定義一個轉場(transition)。 這樣定義的轉場需要接受 old_widgetnew_widget 入參,分別指定轉場的起始和結束使用的可視組件。

ATL轉場必須設置 delay 特性,表示轉場時間,單位為秒。 還可以使用 events 特性,使舊組件屏蔽事件消息。

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

    # 設置變換耗時
    delay duration

    # 置於正中
    xcenter 0.5
    ycenter 0.5

    # 轉動舊組件
    old_widget
    events False
    rotate 0.0
    easeout (duration / 2) rotate 360.0

    # 轉動新組件
    new_widget
    events True
    easein (duration / 2) rotate 720.0

Python轉場

一個Python可調用對象也可用做轉場。若要如此做,其必須可以使用兩個入參 old_widgetnew_widget, 並返回一個可視組件用示範轉場效果——通常會委託給另一個轉場。 入參 old_widget 表示轉場的起始畫面,入參 new_widget 表示轉場的結束畫面。

The displayable returned by the callable should have a delay attribute, set to the number of seconds that the transition should run for. 用作轉場的Python可調用對象,返回結果需要有 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 項。

所有 sceneshowhide 語句都會應用此轉場,除了下面幾種情況: * 後面帶with從句 * window 語句之類,由 對話窗口管理 控制轉場 * 菜單上下文(context)中

例如:

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

    "這裡會再次出現。"

其他參考

ATL轉場使用Python的轉場 : 兩部分分別闡述了如何使用ATL系統和Python創建轉場。