轉場(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
- dissolve link
0.5秒時間,使用溶解效果從舊界面切到新界面。一個
Dissolve()
轉場類的實例。
- pixellate link
0.5秒像素化舊場景,並0.5秒反向像素化至新場景。一個
Pixellate()
轉場類的實例。
- move link
0.5秒時間,將圖像移動到新的位置。一個
MoveTransition()
的轉場實例。move轉場,與ease轉場類似,只能使用 with語句 應用在單個圖層或同時應用在所有圖層。 其不能在其他場景下生效,比如 ATL、
ComposeTransition()
等。
- 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秒。
- 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完全透明時依然使用舊界面。
- class ComposeTransition(trans, before, after) link
返回由三種轉場合成的一個轉場效果。 before 和 after 轉場會分別應用在舊場景和新場景,前提是這兩個參數非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語句 應用在單個圖層或同時應用在所有圖層。 其不能在其他場景下生效,比如 ATL、
ComposeTransition()
等。 在不同上下文(context)中無法使用MoveTransition, 例如 ATL、ComposeTransition()
等其他轉場。- 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”會離開當前場景(用到 leave 和 leave_time_warp),“b”會修改位置(用到 time_warp), “c”會進入當前場景(用到 enter 和 enter_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
轉場效果的族群,類似於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),返回一個圖像直線運動的完成時間比例(取值範圍為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
項。
所有 scene
、show
和 hide
語句都會應用此轉場,除了下面幾種情況:
* 後面帶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創建轉場。