變換 link

變換(transform)可以按順序依次使用,將一個 可視組件 變為另一個可視組件。 總共有多種類型的變換,也有多種方式創建變換。 內建的變換常用於控制界面上某個對象的位置,而用戶自訂的變換可以觸發更複雜的效果,比如移動、縮放和旋轉,甚至複雜的色彩效果。

在scene和 show 語句後使用at分句就能應用各種變換。 下面樣例中對圖像 eileen happy 應用了 right 變換。:

show eileen happy at right

可以同時應用多個變換,不同變換之間用英文逗號分隔。這些變換從左到右依次應用。

show eileen happy at halfsize, right

在Python中對可視組件應用變換 link

若要在Python中對可視組件 d 引用變換 t 有好幾種方法:

  1. 最為通用也最推薦的方法是,使用 At(d, t) (下面有樣例)。這種方法適用於所有變換。

  2. d(child=t) 適用於所有 ATL變換

  3. 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
             +-----------------------------------------------------------+

offscreenleftoffscreenright 變換會讓圖像顯示在界面之外。這兩個變換可以用於將物體從界面移除(記得之後隱藏這些物體,並確認他們不再消耗系統資源)。

這些變換(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函數類型。 有一些類型參數暫時禁止使用,未來可能會開放:

  1. 只有固定位置參數

  2. 沒有預設值的關鍵字參數

  3. 可變的固定位置參數(*args)

  4. 可變的關鍵字參數(**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處理圓周運動時,首先比較起點與終點位置(通常使用 posalignangleradius 設置), 然後找到極坐標原點(通常使用 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時觸發。

需要注意的是,transform被 scene語句 清除,或者退出其所在的 上下文 時,hide事件是不會觸發的。

replaced

transform被另一個transform替換時觸發。原transform的圖像實際上並不會隱藏或移除,直到整個ATL語句塊(block)執行完。

hoveridleselected_hoverselected_idleinsensitiveselected_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_screamerflash_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_widgetnew_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 變換替換了 cd 變換替換了 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軸方向坐標移動的初始值,即是用戶點擊滑鼠時的值。

位置相關特性(包括 xposyposxanchoryanchor,以及等效的:tpref:xalignradiusangle))繼承時有一項特殊規則: 子組件設置的值會覆蓋父組件的值。這樣設計是考慮到可視組件往往只有一項位置資訊,需要優先保證設置的值不受影響。 對位置特性的設置有多種方式,例如,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(),也可以直接用作變換。