變換 link
變換(transform)可以按順序依次使用,將一個 可視組件 變為另一個可視組件。 總共有多種類型的變換,也有多種方式創建變換。 內建的變換常用於控制界面上某個對象的位置,而用戶自訂的變換可以觸發更複雜的效果,比如移動、縮放和旋轉,甚至複雜的色彩效果。
在scene和 show 語句後使用at分句就能應用各種變換。
下面樣例中對圖像 eileen happy
應用了 right
變換。:
show eileen happy at right
可以同時應用多個變換,不同變換之間用英文逗號分隔。這些變換從左到右依次應用。
show eileen happy at halfsize, right
在Python中對可視組件應用變換 link
若要在Python中對可視組件 d
引用變換 t
有好幾種方法:
最為通用也最推薦的方法是,使用
At(d, t)
(下面有樣例)。這種方法適用於所有變換。d(child=t)
適用於所有 ATL變換。t(d)
適用於 Python變換,以及不需要坐標作為參數的ATL變換。
- At(d, *args) link
對指定的源可視組件 d ,將 args 中所有變換應用於該組件。變換的應用順序是從左到右,所以最外層的變換效果是最右邊的入參。
transform birds_transform: xpos -200 linear 10 xpos 800 pause 20 repeat image birds = At("birds.png", birds_transform)
Note
如果某些變換沒有傳入需要的參數,變換結果可能會導致無法正常顯示。 這種情況下需要檢查使用 transform語句 定義的變換到底需要什麼參數。
Note
變換結果可能還是一個變換,可以進一步應用於另一個可視組件(及其子組件); 這種情況下ATL變換依然可以如其他變換一樣使用,不影響其子組件。
內建變換 link
Ren’Py附帶了一些默認定義好的變換。這些變換定義了界面上的位置資訊。這裡有一個默認變換一下圖像位置的描述:
+-----------------------------------------------------------+
|topleft, reset top topright|
| |
| |
| |
| |
| truecenter |
| |
| |
| |
| |
offscreenleft|left center, default right|offscreenright
+-----------------------------------------------------------+
offscreenleft
和 offscreenright
變換會讓圖像顯示在界面之外。這兩個變換可以用於將物體從界面移除(記得之後隱藏這些物體,並確認他們不再消耗系統資源)。
這些變換(transform)的詳細資訊如下:
- center link
水平居中,並與界面底部對齊。
- default link
水平居中,並與界面底部對齊。default可以通過
config.default_transform
重定義,這樣show和scene語句顯示的圖片默認位置也會改變
- left link
與界面左下角對齊。
- offscreenleft link
將可視組件置於界面左外側,與界面底部對齊。
- offscreenright link
將可視組件置於界面右外側,與界面底部對齊。
- reset link
重設變換。將可視組件放置在界面左上角,並清除一切縮放、旋轉及其他效果。
- right link
與界面右下角對齊。
- top link
水平居中,與界面頂部對齊。
- topleft link
與界面左上角對齊。
- topright link
與界面右上角對齊。
- truecenter link
水平和垂直都居中。
動畫和變換語言 link
動畫和變換語言(簡稱ATL)提供了一種高級方式,便於創建動畫、界面內移動可視組件、設置組件位置、應用各種變換(等。 ATL語言可以根據時間變化實現效果,也可以根據事件類消息做出響應。
在Python中,與ATL變換等效的是 Transform()
類組件。目前沒有辦法通過編程創建一個ATL變換效果。
可以使用 transform語句 創建ATL變換對象。創建結果可用作可視組件(可能沒有能被看到的子組件所以透明)。
ATL變換對象可以使用 add 傳入某個界面,或者使用 show expression語句 或 renpy.show()
函數直接顯示。
Ren’Py腳本語句 link
ATL可以包含在Ren’Py腳本語句中。
transform語句 link
transform
語句創建了一個變換(transform)效果,可以在某個at分句中使用。transform語句的語法如下:
atl_transform ::= "transform"qualname
( "("parameters
")" )? ":"atl_block
transform語句必須在 初始化階段 運行。 定義transform可能需要一個參數列表,使用方式與Python函數類型。 有一些類型參數暫時禁止使用,未來可能會開放:
只有固定位置參數
沒有預設值的關鍵字參數
可變的固定位置參數(
*args
)可變的關鍵字參數(
**kwargs
)
只有所有參數都賦值之後,創建的Transfor對象才能用作變換。
請參考: ATL的柯里化和部分入參傳遞
qualname 必須是一個使用英文標點“.”分割的Python標識符。使用ATL創建的transform與 qualname 綁定, 如果存在 store 則保存在對應儲存空間中。
transform left_to_right:
xalign 0.
linear 2 xalign 1.
repeat
transform ariana.left:
xalign .3
transform animated_ariana_disp:
"ariana"
pause 1.
"ariana_reverse"
pause 1.
repeat
創建出的對象既是變換也是可視組件,但不支持 image
語句。
因為它以變數(或常量)形式創建,與命名空間 images 中的對象不同。
帶ATL語句塊的image語句 link
使用ATL的另一種方法是,在 images 語句中包含ATL語句塊。這將某個圖像與給定的transform綁定。由於沒有辦法向該transform傳入參數,所以只在transform自身定義了某個動畫的情況下才有用。 帶ATL語句塊的image語句語法如下:
atl_image ::= "image"image_name
":"atl_block
image animated_ariana_img:
"ariana"
pause 1.
"ariana_reverse"
pause 1.
repeat
帶ATL語句塊的scene和show語句 link
最後一種使用ATL的方法是,包含在 scene
或者 show 語句中。這種方法可以通過ATL改變圖像。
atl_scene ::=stmt_scene
":"atl_block
atl_show ::=stmt_show
":"atl_block
show eileen happy:
xalign 1.
scene bg washington:
zoom 2.
ATL語法和語義 link
ATL語句可能是單行的,也可能是多行組成的語句塊(block)。 除了後面會提到的少數例外,ATL語句塊中的語句按從上到下的順序執行。
如果某個ATL語句需要計算某個表達式,那麼對應的整個變換首次執行時(例如使用 show
語句或將該變換顯示為某個界面的一部分時)將計算該表達式,
而不是執行某部分ATL語句時才計算。
一個ATL語句塊(block)由一個或多個邏輯行組成,使用相同的縮進量。每個ATL語句塊中的邏輯行都必須包含一條或多條ATL語句。
總共有兩種ATL語句:簡單ATL語句和複雜ATL語句。簡單語句不使用ATL語句塊。單條邏輯行就可能包含一條或多條ATL語句,使用英文逗號分隔。複雜語句會包含語句塊(block)。複雜語句的第一行會以英文冒號(
":"
)結尾:默認情況下,語句塊(block)裡會從第一條語句開始順序執行所有語句。當整個語句塊達到結尾時執行就會被終止。time語句會改變這種執行邏輯,詳見後面的段落。
當語句塊(block)中所有語句都終止時,語句塊的執行也就被終止了。
如果ATL語句需要某個表達式賦值,只能在transform初次加入場景列表時進行賦值。(比如使用
show
語句或者某個界面顯示展示部分變換時。)
下面列出各種ATL語句。
單行contains語句 link
單行contains語句可以計算一個簡單表達式,並得到一個 可視組件 。
atl_contains ::= "contains" expression
此語句會把當前ATL變換的某個子組件設置(或替換)成表達式計算結果,用作動畫。
transform an_animation:
"1.png"
pause 2
"2.png"
pause 2
repeat
image move_an_animation:
contains an_animation
# 如果我們不使用contains語句,
# 就會一直處於循環中並不能抵達這裡
xalign 0.0
linear 1.0 yalign 1.0
與變換表達式語句相比,可視組件語句 定義更明晰,但其可以使用 transition 來替換子組件。 contains語句適合用在某個ATL語句塊中容納另一個變換效果,而不是單純復用某個變換的代碼塊。
數值語句 link
數值語句由一個簡單表達式構成,該表達式可以計算出一個整數或一個浮點數。 其是“pause”的一個簡略版。
atl_number ::= "pause"? simple_expression
數值語句用於指定一個固定秒數的暫停。
image atl example:
# 顯示logo_base.png。
contains "logo_base.png"
# 暫停1.0秒。
pause 1.0
# 顯示logo_bw.png,使用dissolve轉場。
"logo_bw.png" with Dissolve(0.5, alpha=True)
# 暫停3秒。
3
repeat
特性值語句 link
該語句可以將一個或多個變換特性設置為某個新的值。
atl_properties ::= atl_property
+
atl_property ::=transform_property
simple_expression
特性值語句先指定一些特性名稱,並對每項特性都設置一個值。 變換特性 中的變換特性列表詳細說明了每個特性的含義及使用的值類型。
transform rightoid:
xalign .9
transform ariana.left:
xanchor .3 xpos 100
插值語句 link
插值語句主要用於獲取平滑的動畫效果。
atl_interp ::= ((warper
simple_expression
) | ("warp"simple_expression
simple_expression
)) (atl_interp_target
+ | (":"atl_interp_target
+ ))
atl_interp_target ::= (atl_property
+ ("knot"simple_expression
)* ) |atl_transform_expression
| "clockwise" | "counterclockwise" | ("circles"simple_expression
)
下面是一些插值語句的樣例:
show logo base:
# 在界面右上角顯示logo。
xalign 1.0 yalign 0.0
# 耗時1秒,將logo移動到最左側。
linear 1.0 xalign 0.0
# 耗時1秒,將logo移動到界面正中心。移動時的使用ease緩動函數。
ease 1.0 truecenter
# 設置旋轉錨點。
anchor (0.5, 0.5)
# 耗時2秒,讓logo按順時針方向做圓周旋轉,最終到達界面正上方。
linear 2.0 yalign 0.0 clockwise circles 3
# 讓logo按照指定樣條的路徑,在界面中移動。
linear 2.0 align (0.5, 1.0) knot (0.0, .33) knot (1.0, .66)
# 同時修改xalign和yalign的值。
linear 2.0 xalign 1.0 yalign 1.0
# 與上一步相同,但使用語句塊形式。
linear 2.0:
xalign 1.0
yalign 1.0
插值語句的第一部分用於選擇time-warp函數。即,將線性時間轉為非線性時間,關於warper的資訊詳見 warpers 。 可以使用在ATL註冊的warp類函數名,或者使用關鍵字“warp”開頭的某個表達式代表的函數。 無論使用的是哪種函數,後面跟著的數字表示總體消耗時間,單位為秒。
transform builtin_warper:
xpos 0
ease 5 xpos 520
init python:
def my_warper(t):
return t**4.4
define my_warpers = [my_warper]
transform accessed_as_function:
xpos 0
warp my_warpers[0] 5 xpos 520
warp my_warper 3 xpos 100
整個插值語句的持續時長由給定的時間決定,至少為1幀。
指定的 變換特性 會逐漸逼近終值,並在插值語句結尾達到該終值。 具體的細節有以下幾種:
如果終值後面還跟著一個或多個節點(knot),表示運動路徑是樣條。 初始值和終值分別是樣條的起點與終點,knot則是樣條的控制節點。 四次曲線只使用一個knot,貝茲曲線使用兩個knot,Carmull-Rom曲線則使用三個或更多knot。 前兩種情況中,knot都是單純的控制節點。 而Catmull-Rom曲線中,只有首尾兩個knot是控制節點(通常不在曲線上),其他knot則都在曲線路徑上。
如果插值語句中包含一個“clockwise”或“counterclockwise”從句,表示使用圓周運動。 Ren’Py處理圓周運動時,首先比較起點與終點位置(通常使用
pos
、align
、angle
和radius
設置), 然後找到極坐標原點(通常使用around
設置)。接著計算指定方向需要旋轉的角度值,單位為度。 如果出現了“circle”從句,Ren’Py則會加上對應數量的整圈。其他情況下,會對起點和重點的坐標進行線性插值。
如果某個 變換表達式語句 中只有一條特性(property)語句,也可以進行插值計算。 起始值就是ATL變換中對應特性的值,跟直接設置起點的值效果相同。
warper後面可以跟一個英文冒號(:)。這種情況下,warper後可能會有一個或多個如上闡述的從句。 這樣做可以讓ATL可以同時對多個特性進行插值。
pass語句 link
atl_pass ::= "pass"
pass
語句是一個簡單語句,不會觸發任何效果:一種 no-op 。
pass語句可以用於分隔其他語句。比如出現兩套choice語句的時候,如果不用pass語句,選項會混在一起。
pass語句還可以用在一些語法層面需要出現語句塊,但創作者只想要空著的地方,比如某些選項語句後面必須寫點什麼。
(譯者註:pass就是腳本中的占位符。空著不寫會報錯,寫個pass就能運行了。)
repeat語句 link
repeat
語句是一種簡單語句。腳本執行到repeat時會跳轉到包含repeat的語句塊的開頭,並重新開始執行。
atl_repeat ::= "repeat" (simple_expression
)?
如果repeat中出現了一個表達式,該表達式可以計算出一個整數。這個整數就是整個語句塊(block)重複執行的次數。
(repeat 2
表示語句塊最多會執行2次,repeat 1
則不會有重複執行的效果。)
repeat語句必須是一個語句塊(block)的最後一個語句:
show logo base:
xalign 0.0
linear 1.0 xalign 1.0
linear 1.0 xalign 0.0
repeat
block語句 link
block
語句包含ATL語句塊(block)。
atl_block_stmt ::= "block" ":"
atl_block
block語句用於對需要重複運行的語句分組:
label logo base:
alpha 0.0 xalign 0.0 yalign 0.0
linear 1.0 alpha 1.0
block:
linear 1.0 xalign 1.0
linear 1.0 xalign 0.0
repeat
parallel語句 link
parallel
語句用於定義一個可以並行執行的ATL語句塊的集。
atl_parallel ::= ("parallel" ":"
atl_block
)+
parallel語句會將語句塊(block)中連續出現的多個parallel項都放入一個並行集之中。當整個語句塊中所有語句都執行完後,parallel語句才會終止。
語句塊中的所有並行語句都應各自獨立,並使用不同的 變換特性。當兩個並行分支修改了同一項特性(property),會產生無法預料的結果。
show logo base:
parallel:
xalign 0.0
linear 1.3 xalign 1.0
linear 1.3 xalign 0.0
repeat
parallel:
yalign 0.0
linear 1.6 yalign 1.0
linear 1.6 yalign 0.0
repeat
choice語句 link
choice
語句定義了一個所有可選項的集合。Ren’Py會根據玩家的選擇,執行對應選項相關的ATL語句塊(block),之後跳轉到choice語句塊結束處。
atl_choice ::= ("choice" (simple_expression
)? ":"atl_block
)+
choice語句會將語句塊(block)中連續出現的多個choice選項都放入一個選項集之中。如果選項後面出現一個簡單表達式,這個表達式的值應該是一個浮點數,表示對應選項的權重;如果沒有權重表達式,預設值為1.0。
image eileen random:
choice:
"eileen happy"
choice:
"eileen vhappy"
choice:
"eileen concerned"
pause 1.0
repeat
在choice語句塊內部使用 pass
語句可以生成一個空的choice語句塊。
animation語句 link
使用 animation
語句時,必須將其放在整個ATL語句塊的開頭,告訴Ren’Py該語句塊要使用動畫時間軸。
atl_animation ::= "animation"
與普通的顯示時間軸相比,在帶有相同標籤(tag)的圖像(image)或界面(screen)開始顯示的那一刻,animation時間軸就將進行計時並被所有相同標籤(tag)的圖像和界面共享。 animation時間軸常用於動畫過程中的圖像替換。例如:
image eileen happy moving:
animation
"eileen happy"
xalign 0.0
linear 5.0 xalign 1.0
repeat
image eileen vhappy moving:
animation
"eileen vhappy"
xalign 0.0
linear 5.0 xalign 1.0
repeat
label start:
show eileen happy moving
pause
show eileen vhappy moving
pause
這個例子中,艾琳的立繪表情將在第一個 pause 語句處改變,但她的位置不會改變。 因為兩個動畫使用相同的animation時間軸,避免了更換立繪後出現圖像位置不連續。 不使用 animation 語句的話,用戶通過點擊滑鼠或螢幕後,角色的立繪位置將發生一次重設。
on語句 link
on
語句會定義一個事件處理器(handler)。
atl_on ::= "on"name
[ ","name
] * ":"atl_block
on
語句會將語句塊(block)中連續出現的多個on項都放入一個事件集之中。on語句可以只處理某一個事件名,或者使用逗號分隔的事件名列表。
on語句用於處理各種事件(event)。當某個事件被處理後,其他的事件處理就會停止,並且會立即進入新事件的處理流程。當某個事件處理器沒有新的待處理事件,就會產生 default
事件(已經處理 default
事件的情況除外)。
on語句的執行不會自然終止。(但是其可以被time語句,或者關聯的事件處理器終止。)
生成任意事件的方法詳見event語句部分,以及 外部事件 中的原生事件列表。
show logo base:
on show:
alpha 0.0
linear .5 alpha 1.0
on hide:
linear .5 alpha 0.0
transform pulse_button:
on hover, idle:
linear .25 zoom 1.25
linear .25 zoom 1.0
變換表達式語句 link
變換表達式語句可以包含另一個ATL變換,並用作自身ATL語句塊的一部分。
atl_transform_expression ::= simple_expression
這種語句只有在ATL變換自身 沒有 子組件時才有效。否則,同樣的語句會被當作 可視組件語句 處理。 變換表達式語句中的內容會替換變換名,並執行對應的變換。
transform move_right:
linear 1.0 xalign 1.0
image atl example:
# 顯示logo_base.png
"logo_base.png"
# 運行變換move_right
move_right
可視組件語句 link
可視組件語句通常是一個簡單的Python表達式,可以計算出一個 可視組件 對象。 可視組件語句後面也可能會有一個從句,即另一個簡單表達式。
atl_displayable ::=simple_expression
("with"simple_expression
)?
該語句用於設置或替換某個變換的子組件。
如果後面有 with
從句,後面的第二個表達式計算結果會用作 轉場 效果,並用於新舊兩個子組件的切換過程。
需要注意的是,並非所有轉場都能正常使用。具體參考 字典轉場(Dict Transitions) 、 move-
和:var:ease- <ease> 。
image atl example:
# 顯示logo_base.png。
"logo_base.png"
# 暫停1.0秒。
1.0
# 顯示logo_bw.png,使用dissolve轉場效果。
"logo_bw.png" with Dissolve(0.5, alpha=True)
Warning
如果傳入無子組件的變換對象,可能會讓整個變換變成透明且無效。 傳入無子組件的ATL變換可能會被當作 變換表達式語句,產生與預期不同的效果。
如果表達式計算出的ATL變換 包含 子組件,那麼整個ATL語句塊會等到所有子組件內的ATL代碼都執行完之後再繼續向下執行。
contains語句塊 link
contains語句塊,類似於 單行contains語句,可以設置變換的子組件,但方式不同。
atl_counts ::= "contains" ":"
atl_block
一個或多個contains語句塊會被分組,並放在一個 Fixed()
組件中,設置為該變換的子組件。
每個語句塊都必須定義一個可用的可視組件,否則會報錯。 所有contains語句會立刻並行執行,並不會等待所有子組件內的代碼都執行完畢才執行下一條contains。
image test double:
contains:
"logo.png"
xalign 0.0
linear 1.0 xalign 1.0
repeat
contains:
"logo.png"
xalign 1.0
linear 1.0 xalign 0.0
repeat
function語句 link
function
語句允許ATL使用Python代碼。
atl_function ::= "function" simple_expression
這些函數與 Transform()
具有相同的入參和返回結果:
第一個入參是一個transform對象。可以設置該對象的 變換特性。
第二個入參是顯示時間軸,表示函數開始執行到現在經過的秒數。
第三個入參是動畫時間軸,表示具有相同標籤(tag)的對象在整個界面上已存在的秒數。
如果函數返回一個數值,其會在數值對應的時間(秒)後再次被調用。(0秒表示盡可能快地調用該函數。)如果函數返回None,主控流程會跳到下一個ATL語句。
除了修改第一個入參中的Transform對象之外,該函數不應產生副作用。 並可以在任意時間傳入任意值並調用,能配合預載入功能。
注意,function
不是一個變換特性,並且其跟 Transform()
的 function 參數也不完全一致。
init python:
def slide_vibrate(trans, st, at, /):
if st > 1.0:
trans.xalign = 1.0
trans.yoffset = 0
return None
else:
trans.xalign = st
trans.yoffset = random.randrange(-10, 11)
return 0
label start:
show logo base:
function slide_vibrate
pause 1.0
repeat
time語句 link
time
語句是一種控制語句。
atl_time ::= "time" simple_expression
其包含一個簡單表達式,可以算出一個時間點,單位為秒。這個時間點表示其所在語句塊(block)從開始執行到time語句結束的總時長。 當time語句中給定的“time”結束後,後面的語句才會開始執行。在上一個語句還在執行的情況下,這種控制轉換依然會執行,也能強行終止任意優先度的語句。
time語句隱含了一個pause語句,表示暫停無限長時間。這表示如果主控流程不能抵達time語句處,它就會保持等待直到time語句獲取流程控制權。
當一個語句塊中存在多個time語句時,它們各自的結束時間點必須按順序嚴格遞增。
image backgrounds:
"bg band"
xoffset 0
block:
linear 1 xoffset 10
linear 1 xoffset 0
repeat # 主控流程永遠無法主動退出循環
time 2.0
xoffset 0
"bg whitehouse"
time 4.0
"bg washington"
event語句 link
event
語句是一個簡單語句,其會使用給定的名稱產生一個事件(event)。
atl_event ::= "event" name
當在某個語句塊(block)運行過程中出現某個事件(event)時,語句塊會檢查自身是否存在對應事件名的處理器(handler)。如果處理器存在,主控流程會切換到對應的事件處理器。否則,事件會廣播至所有事件處理器。
外部事件 link
下列事件會在ATL變換中自動觸發:
start
一種偽事件,進入
on
語句時觸發,前提是沒有更高優先度的事件出現。show
使用
show
或者scene
語句顯示transform,並且給定標籤(tag)沒有對應已顯示的圖像時觸發。replace
使用
show
語句中的transform根據給定標籤(tag)替換某個圖像時觸發。hide
使用
hide
語句或等效的python語句中的transform時觸發。replaced
transform被另一個transform替換時觸發。原transform的圖像實際上並不會隱藏或移除,直到整個ATL語句塊(block)執行完。
hover
、idle
、selected_hover
、selected_idle
、insensitive
、selected_insensitive
當包含此transform的按鈕或者被此transform包含的按鈕,出現對應的狀態名稱時觸發。
ATL的柯里化和部分入參傳遞 link
使用 transform語句 定義的ATL變換可以設置多種不同的入參列表。 如同調用函數一樣調用ATL變換時,返回結果依然是一個transform,入參則可以改變原transform中同名參數的值。
例如:
transform screamer(child, screamee, wait_time=2, flash_time=.1):
child
pause wait_time
screamee
pause flash_time
child
# 這樣寫不會報錯(類似於引用Python函數返回結果)。
define shorter_screamer = screamer(wait_time=1)
define eileen_excited_screamer = screamer(screamee="eileen excited", flash_time=.2)
label start:
show hhannahh happy at screamer(screamee="hhannahh surprised", wait_time=1.5)
"這是一種方法。"
show eileen vhappy at eileen_excited_screamer
"這是另一種方法。"
show patricia sad at eileen_excited_screamer(screamee="patricia wow")
"並且你也可以這樣做。"
需要注意,變換 shorter_screamer
雖然源自 screamer
,但不能直接像 show eileen at screamer
這樣直接用。
因為其 screamee
參數未賦值。
還要注意,類似腳本標籤(label)和界面(screen)定義,使用 transform語句 定義的transform的入參預設值, 是在transform 被調用 時才計算的,而不是 被定義 時就計算好的。
總之,transform只有在調用另一個變換(例如上例中的 shorter_screamer
或部分入參傳遞)時,才會計算所有入參的預設值。
無論預設值來自原始的transform(比如 shorter_screamer
的 flash_time 參數或部分入參傳遞的 wait_time 參數),
還是來自更早執行的腳本中的調用(比如 shorter_screamer` 中的 wait_time 參數或部分入參傳遞的 screamee 和`flash_time` 參數)。
特殊child參數 link
如果某個ATL變換有一個入參名為“child”,並且該入參獲得了一個值,那麼將 無視該入參值的類型和賦值方式 , 該變換的子組件將被設置為child參數的值。 (無視入參值類型和賦值方式是指,不需要考慮參數是固定位置入參是還是關鍵字入參,也不需要考慮該參數有預設值還是要求必須重新賦值。)
需要注意,child入參的預設值不會生效,還是需要從外部傳入一個新的值。
另外,ATL變換用作一個transform時,默認不會將 child=
作為關鍵字參數傳遞並設置目標的child,除非目標有個同名的child入參。
例如,下面的腳本能在child與另一個可視組件之間來回切換:
transform lucy_jump_scare(child):
# child的值會隱式設置為transform的子組件。
pause 5
# “jump scare”式驚嚇。
"lucy mad"
pause .2
# 再顯示原來的子組件。
child
還可以在 contains
語句塊中放置原來的子組件:
transform marquee(width, height=1.0, duration=2.0, child=None):
xcenter 0.5
ycenter 0.5
crop (0, 0, 0.5, 500)
contains:
child
xanchor 0.0 xpos 1.0
linear duration xanchor 1.0 xpos 0.0
old_widget 和 new_widget 兩個“關鍵字限定”入參(即不能用於固定位置入參)在 ATL轉場 中有特殊用法。
warpers link
warper是一類函數,其可以改變插值語句中用到的時間值。他們將時間t轉換為t’,t和t’都是浮點數,t會將給定的時間值歸一化為0.0到1.0。 (如果該語句給定的原時長是0,那運行時t就是1.0。) t’的初始取值範圍也是0.0到1.0,不過可以超出這個範圍。 以下warper都是默認定義好的。
pause
暫停,然後跳變成新值。如果
t == 1.0
,則t' = 1.0
;否則t' = 0.0
。linear
線性插值。
t' = t
ease
開頭慢,中間加速,之後又減速。
t' = .5 - math.cos(math.pi * t) / 2.0
easein
開頭快,然後減速。
t' = math.cos((1.0 - t) * math.pi / 2.0
easeout
開頭慢,然後加速。
t' = 1.0 - math.cos(t * math.pi / 2.0)
除此之外,Robert Penner的easing函數都是支持的。為了避免與上面的幾個函數名重複,有些函數名字修改過。這些標準函數的圖像可以在這個網站上查看 http://www.easings.net/
Ren’Py 函數名 |
easings.net 函數名 |
---|---|
ease_back |
easeInOut_back |
ease_bounce |
easeInOut_bounce |
ease_circ |
easeInOut_circ |
ease_cubic |
easeInOut_cubic |
ease_elastic |
easeInOut_elastic |
ease_expo |
easeInOut_expo |
ease_quad |
easeInOut_quad |
ease_quart |
easeInOut_quart |
ease_quint |
easeInOut_quint |
easein_back |
easeOut_back |
easein_bounce |
easeOut_bounce |
easein_circ |
easeOut_circ |
easein_cubic |
easeOut_cubic |
easein_elastic |
easeOut_elastic |
easein_expo |
easeOut_expo |
easein_quad |
easeOut_quad |
easein_quart |
easeOut_quart |
easein_quint |
easeOut_quint |
easeout_back |
easeIn_back |
easeout_bounce |
easeIn_bounce |
easeout_circ |
easeIn_circ |
easeout_cubic |
easeIn_cubic |
easeout_elastic |
easeIn_elastic |
easeout_expo |
easeIn_expo |
easeout_quad |
easeIn_quad |
easeout_quart |
easeIn_quart |
easeout_quint |
easeIn_quint |
可以通過只讀模組 _warper
訪問這些warper效果。該模組包含了上述所有函數。
在Ren’Py內建效果中使用時間warp函數很有用,比如可以這樣用:
with Dissolve(1, time_warp=_warper.easein_quad)
我們可以在一個 python early
語句塊中,使用 renpy.atl_warper
裝飾器定義新的warper函數。定義warper函數文件需要在使用那個函數的其他任何文件之前被處理。定義的代碼如下:
python early hide:
@renpy.atl_warper
def linear(t):
return t
替換變換 link
某個ATL變換、內建變換或使用 Transform
定義的變換對象被同類變換替換時,
同名特性的值會從前一個變換繼承到新的變換。不同類型的變換無法繼承。
如果 show語句 中的at關鍵字後列出了多個變換待替換,則新變換列表從後往前依次替換,直到新替換變換列表全部換完。例如:
show eileen happy at a, b, c
"我們稍等一下。"
show eileen happy at d, e
e
變換替換了 c
, d
變換替換了 b
,而沒有變換會替換 a
。
替換時,舊變換的特性值由新變換繼承。如果舊變換正處於動畫中,則新變換繼承的可能是中間的某個值。例如:
transform bounce:
linear 3.0 xalign 1.0
linear 3.0 xalign 0.0
repeat
transform headright:
linear 15 xalign 1.0
label example:
show eileen happy at bounce
pause
show eileen happy at headright
pause
這個例子中,圖像會左右彈跳,直到用戶點擊滑鼠。
當用戶點擊滑鼠後, bounce
中的 xalign
特性值將被 headright
繼承。
精靈在x軸方向坐標移動的初始值,即是用戶點擊滑鼠時的值。
位置相關特性(包括 xpos
、ypos
、xanchor
和 yanchor
,以及等效的:tpref:xalign、radius
和 angle
))繼承時有一項特殊規則:
子組件設置的值會覆蓋父組件的值。這樣設計是考慮到可視組件往往只有一項位置資訊,需要優先保證設置的值不受影響。
對位置特性的設置有多種方式,例如,xalign
會同時設置xpos和xanchor。
最後,如果某個 show
語句不包含 at
從句,則不需要搞特性值繼承問題。若要重設所有變換特性,可以先隱藏再顯示對應的可視組件。
若要中斷動畫效果,可以這樣:
show eileen happy at some_animation
"Wow, so this is what antigravity feels like !"
show eileen:
pass
"But I'm happy when it settles down."
Transform類 link
ATL變換在Python中等效於一個Transform對象。
- class Transform(child=None, function=None, **properties) link
創建一個Transform對象,並將各種操作應用到其子組件,操作包括:剪裁、旋轉、縮放和alpha混合等。 一個Transform對象的欄位一一對應 變換特性 ,並都將應用到子組件。
- child
應用變換的子組件。
- function(trans: Transform, st: float, at: float, /) int | None link
若不是None,這是渲染變換效果時調用的函數。調用這個函數時使用3個固定位置入參:
Transform對象。
顯示時間軸,單位為秒。
動畫時間軸,單位為秒。
函數會返回一個延遲時間,單位為秒。在運行延遲時間之後這個函數會被再次調用。如果延遲時間是None,則會在下次互動之後立刻調用。
該函數除了修改第一個入參的變換對象之外不應有其他副作用,並且要求可以在任何時間點使用任何值調用以配合預載入。
其他關鍵字入參都會作為對應變換特性的值。 繪製變換效果時,對應的變換特性都會根據入參設置值,但在變換對象創建後不再更改。 使用
function
參數傳入的函數或調用update()
方法,可以改變對應的變換特性。其他參數被視為設置變換特性的值。
- hide_request link
當function函數被調用時,這項會被設置為True,標識變換效果被隱藏。
- hide_response link
如果hide_request為True,這項會被設置為False,防止變換效果被隱藏。
- set_child(child) link
使用一個新的 child 調用這個方法,child 成為變換的子組件。
- update() link
當變換特性(property)欄位在 function 參數指定的回調方法之外被更新時,這個方法會被調用,確保修改生效。
可調用對象用作變換 link
Finally, simple Python callables can be used as transforms. These callables should take a single displayable as an argument, and return a new Displayable. For example 最後,Python中的可調用對象可以用作變換。這些可調用對象必須能使用 可視組件 作為入參, 並且能返回一個新的可視組件。例如:
init python:
# 這是一個使用right和left兩個默認變換的自訂變換。
def right_or_left(d):
if switch:
return At(d, right)
else:
return At(d, left)
某些內建對象可以也符合入參為可視組件並返回可視組件的要求,例如 Flatten()
,也可以直接用作變換。