轉場(transition) link

在Ren’Py中,轉場(transition)可以用作 with 語句 及其他語句的一部分,用於場景切換時提供各種效果。Ren’Py自帶一寫預定義的轉場(transition)效果,可以在with語句中直接使用。Ren’Py中還包含transition類,可以用於創建新的transition對象。

預定義的轉場(Pre-Defined Transitions) link

預定義的轉場(transition)可以直接使用在with語句中。舉例:

show bg washington
with dissolve
fade link

0.5秒時間畫面逐漸暗淡至全黑,然後0.5秒時間畫面從全黑逐漸變亮成新界面。一個 Fade() 轉場類的實例。

dissolve link

0.5秒時間,使用溶解效果從舊界面切到新界面。一個 Dissolve() 轉場類的實例。

pixellate link

0.5秒像素化舊場景,並0.5秒反向像素化至新場景。一個 Pixellate() 轉場類的實例。

move link

0.5秒時間,將圖像移動到新的位置。一個 MoveTransition() 的轉場實例。

move轉場,與ease轉場類似,只能使用 with語句 應用在單個圖層或同時應用在所有圖層。 其不能在其他場景下生效,比如 ATLComposeTransition() 等。

moveinright link

及: moveinleft, moveintop, moveinbottom

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

moveoutright link

及: moveoutleft, moveouttop, moveoutbottom

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

ease link

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

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

zoomin link

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

zoomout link

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

zoominout link

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

vpunch link

這種轉場效果,會垂直搖晃界面0.25秒。 若要修改此轉場和 hpunch,可以使用 ATL轉場.

hpunch link

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

blinds link

垂直遮蔽原界面,耗時1秒。一個 ImageDissolve() 轉場類的實例。

squares link

以平面效果轉場界面,耗時1秒。

wipeleft link

及: wiperight, wipeup, wipedown

以指定方向擦除原界面。 CropMove() 轉場類的實例。

slideleft link

及: slideright, slideup, slidedown

以指定方向滑入新場景。 CropMove() 轉場類的實例。

slideawayleft link

及: slideawayright, slideawayup, slideawaydown

以指定方向滑出舊場景。 CropMove() 轉場類的實例。

pushright link

及: pushleft, pushup, pushdown

新場景把舊場景從指定的邊界推出。 PushMove() 轉場類的實例。

irisin link

及: irisout

使用一個矩形iris顯示新界面,或者隱藏舊界面。 CropMove() 轉場類的實例。

轉場(transition)類 link

轉場(transition)類是可以用於創建新轉場效果的功能函數。這些函數是參數化的,允許創建一個系列的轉場。

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

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

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

define annoytheuser = Dissolve(1.0)

label start:
    show bg washington
    with annoytheuser

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

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

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

control

控制transform。

delay

轉場效果使用時間。

reverse

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

mipmap

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

class ComposeTransition(trans, before, after) link

返回由三種轉場合成的一個轉場效果。 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) link

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

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

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') link

返回一個轉場效果,其使用入參 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) link

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

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) link

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

由於只有圖層標籤(layer tag),MoveTransition只能使用 with語句 應用在單個圖層或同時應用在所有圖層。 其不能在其他場景下生效,比如 ATLComposeTransition() 等。 在不同上下文(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) link

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

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) link

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

class Pixellate(time, steps) link

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

time

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

steps

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

class PushMove(time, mode='pushright') link

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

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) link

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

delay

轉場持續時間。

vertical

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

reverse

若為True,反向旋轉。

background

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

flatten

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

轉場族群 link

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

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

該函數定義了 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) link

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

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

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

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

和:

show eileen happy
with dis

e "Hello, world."

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

字典層轉場不能在所有能用轉場的地方使用,只有在能給一個層應用的轉場時它才能使用。可以使用 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)層上所以可以修復這個問題。

在scene、show和hide語句後自動應用轉場 link

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

    "這裡會再次出現。"

其他參考 link

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