Transform link

transform を使用して displayable を別の displayable にします。数種類の transform とそれらを作成する様々な方法があります。組み込みの transform を使うと画面上のオブジェクトの位置座標を制御出来ます。ユーザー定義の transform では移動、ズーム、回転、複雑な色効果などより複雑な効果を起こせます。

transform は show ステートメントや scene ステートメントに at 節を与えて適用できます。次のコードは、 eileen happy 画像に right transform を適用します。

show eileen happy at right

複数の transform をコンマで区切って適用できます。それら transform は左から右へ順に適用されます。

show eileen happy at halfsize, right

Python による displayable への transform の適用 link

Python により transform t を displayable d に適用する方法はいくつ複数あります :

  1. 最も普遍的かつ推奨される方法は At(d, t) です(下記参照)。これはすべての transform に対して動作します。

  2. d(child=t) はすべての ATL transform に対して動作します。

  3. t(d) はすべての Python transform と位置パラメーターを持たない ATL transform に対して動作します。

At(d, *args) link

指定の displayable dargs のそれぞれの transform を適用します。 transform は左から右へ順に適用され、最後に適用される transform は最も右側の引数です。

transform birds_transform:
    xpos -200
    linear 10 xpos 800
    pause 20
    repeat

image birds = At("birds.png", birds_transform)

注釈

transform ステートメント を使用して定義された transform のように、値が指定されていない transform のパラメーターが残っている場合、結果の値は表示できないことがあります。

注釈

結果の値は、さらに別の displayable に適用できる (前の子をオーバーライドする) transform であることがあります。それは ATL transform の場合であり、子が設定されていてさえ transform として使用できます。

組み込み transform link

Ren'Py では、組み込みの transform をいくつか定義しています。これらの transform は、画像を画面上に配置します。組み込みの各 transform がどこに画像を配置するかをここに示します。

             +-----------------------------------------------------------+
             |topleft, reset               top                   topright|
             |                                                           |
             |                                                           |
             |                                                           |
             |                                                           |
             |                          truecenter                       |
             |                                                           |
             |                                                           |
             |                                                           |
             |                                                           |
offscreenleft|left                   center, default                right|offscreenright
             +-----------------------------------------------------------+

offscreenleft および offscreenright transform は、画面外に画像を配置します。これらの transform は、画面外に画像を動かすのに使えます (リソースを浪費しないために、後で必ず hide してください)。

transform は次のとおりです:

center link

画面の中央下に配置します。

default link

画面の中央下に配置します。 config.default_transform を再定義して show ステートメントや scene ステートメントによって表示される画像の位置のデフォルトを変更できます。

left link

画面の左下に配置します。

offscreenleft link

画面よりも左に配置し、画面下部に合わせます。

offscreenright link

画面よりも左に配置し、画面下部に合わせます。

reset link

transform をリセットします。displayable を画面の左上に配置し、ズーム、回転その他の効果を消去します。

right link

画面の右下に配置します。

top link

画面の中央上に配置します。

topleft link

画面の左上に配置します。

topright link

画面の右上に配置します。

truecenter link

水平にも垂直にも中央に配置します。

ATL - アニメーションと transform 言語 link

Animation and Transformation Language (ATL) は、アニメーションの作成、画面上での Displayable の移動、位置の設定、 transform の適用などを行える高級言語です。これらは、時間の経過とともに、またイベントに応じて変更できます。

以下の transform ステートメント を使用して作成される ATL transform オブジェクトは displayable であり、そのように使用できます (ただし 子 displayable が設定されていない場合は透明になります): screen の Add ステートメント、 Show expression ステートメント、または renpy.show() 関数に渡せられます。

Ren'Py スクリプトのステートメント link

ATL コードを含められる Ren'Py スクリプトステートメントが 3 つあります。

transform ステートメント link

transform ステートメントは、新しい transform を作成します。構文は次のとおりです。 :

atl_transform ::=  "transform" qualname ( "(" parameters ")" )? ":"
                      atl_block

transform ステートメントは 初期化時 に実行されます。 transform はパラメーターのリストを取られ、これはPython関数の定義とほぼ同じように機能しますが、いくつかの種類のパラメータが現在禁止されています。これらは将来的には許可される可能性があります。 :

  1. 位置専用パラメーター

  2. デフォルト値のないキーワード専用パラメーター

  3. 可変長位置パラメーター (*args)

  4. 可変長キーワードパラメーター (**kwargs)

作成されたオブジェクトは、そのすべてのパラメーターに値が与えられるまで、 transform として使用できません。

ATL curry and partial parameter passing も参照ください。

qualname はその transform の名前であり、ドット区切りの Python 識別子でなければなりません。 ATL ブロックによって作成された transform は、指定の 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

作成されたオブジェクトは transform であり、かつ displayable でもありますが、 image ステートメントとは対照的に、変数 (または定数) として作成され、 画像 の名前空間には入りません。

image ステートメントの ATL ブロック link

スクリプトに ATL コードを含める 2 つ目の方法は、 image ステートメント の一部として含めることです。インラインの対応物として、画像名 (スペースが含まれる場合があります) を指定された transform に紐付けします。パラメーターを指定する方法がないため、 transform がアニメーションを定義する場合にのみ役立ちます。構文は次のとおりです。

atl_image ::=  "image" image_name ":"
                  atl_block
image animated_ariana_img:
    "ariana"
    pause 1.
    "ariana_reverse"
    pause 1.
    repeat

scene ステートメントおよび show ステートメントの ATL ブロック link

ATL を使用する最後の方法は、 :ref:'show <show-statement>' または scene ステートメントの一部としての使用です。これにより、表示される画像がその場で作成されて画像に適用される ATL transform 内にラップされます。構文は次のとおりです。 :

atl_show  ::=  stmt_show ":"
                  atl_block
atl_scene ::=  stmt_scene ":"
                  atl_block
show eileen happy:
    xalign 1.

scene bg washington:
    zoom 2.

ATL の構文とステートメント link

ATL ステートメントは記述している ATL ブロック内でインラインにすることもブロックを構成することもできます。関連するステートメントで説明されている一部の例外を除き、 ATL ブロック内のステートメントは上から下に順番に実行されます。

ATL ステートメントで式の評価が必要な場合、その評価は、その特定の ATL ステートメントが実行されるときではなく、その transform が最初に実行されるとき (つまり、 show ステートメントを使用するとき、または画面の一部としてその transform を表示するとき) に行われます。

以下が ATL ステートメントです。

インライン Contains ステートメント link

インラインの contains ステートメントは、評価結果が displayable である式を1 つ取ります。

atl_contains ::=  "contains" simple_expression

このステートメントは、現在の ATL transform の子をその式の値に設定 (または置換) して、アニメーションに役立てます。

transform an_animation:
    "1.png"
    pause 2
    "2.png"
    pause 2
    repeat

image move_an_animation:
    contains an_animation

    # If we didn't use contains, we'd still be looping
    # and would never reach here.
    xalign 0.0
    linear 1.0 yalign 1.0

Displayable ステートメント は transform 式ステートメントとそれほど明確な違いがなく曖昧さがありますが、その子の置き換えに transition を使用できます。このステートメントは、ATL transform が 2 番目の ATL transform の中身を埋め込むのではなく、内包する場合に特に便利です。

Number ステートメント link

number ステートメントは評価結果が整数または浮動小数である単純式で構成されたステートメントであり、任意でキーワード pause が先行します。

atl_number ::=  "pause"? simple_expression

実行をポーズする秒数の数値に使用されます。

image atl example:
    # Displays logo_base.png
    contains "logo_base.png"

    # Pause for 1.0 seconds.
    pause 1.0

    # Show logo_bw.png, with a dissolve.
    "logo_bw.png" with Dissolve(0.5, alpha=True)

    # Pause for 3 seconds
    3

    repeat

プロパティーステートメント link

このステートメントは、 1 つ以上の transform プロパティーを新しい値に設定します。

atl_properties ::=  atl_property+
atl_property ::=  transform_property simple_expression

このステートメントには、最初に (少なくとも 1 つの) 一連のプロパティー名を指定し、それぞれの後に設定するための新しい値を続けます。 transform プロパティーとその意味、およびそれらが取れる値のリストについては、transform プロパティーの一覧 を参照してください。:

transform rightoid:
    xalign .9

transform ariana.left:
    xanchor .3 xpos 100

補間ステートメント link

補間ステートメントは、 transform をスムーズにアニメーションするための主要な方法です。

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:
    # Show the logo at the upper right side of the screen.
    xalign 1.0 yalign 0.0

    # Take 1.0 seconds to move things back to the left.
    linear 1.0 xalign 0.0

    # Take 1.0 seconds to move things to the location specified in the
    # truecenter transform. Use the ease warper to do this.
    ease 1.0 truecenter

    # Set the location to circle around.
    anchor (0.5, 0.5)

    # Use circular motion to bring us to spiral out to the top of
    # the screen. Take 2 seconds to do so.
    linear 2.0 yalign 0.0 clockwise circles 3

    # Use a spline motion to move us around the screen.
    linear 2.0 align (0.5, 1.0) knot (0.0, .33) knot (1.0, .66)

    # Changes xalign and yalign at the same time.
    linear 2.0 xalign 1.0 yalign 1.0

    # The same thing, using a block.
    linear 2.0:
        xalign 1.0
        yalign 1.0

補間の最初の部分を使用して補間をタイムワープする関数を選択します。つまり、線形時間を非線形時間にマッピングする関数であり、詳細については ワーパー を参照してください。ワーパーを選択するには、登録済みのワーパーの名前を指定するか、キーワード 「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 フレームの間持続します。

Transform プロパティー が指定されていると、それぞれに指定された値は、補間ステートメントの終了時に設定される値になります。これは、いくつかの方法で調整できます。

  • 値に 1 つ以上の knot が続くと、スプラインモーションが使用されます。そのプロパティーの補間開始時の値から始まって指定した値で終わり、knot を使用してスプラインを制御します。1つの knot には2次曲線が使用され、 2つにはベジェ曲線、3つ以上の knot にはキャットムル-ロム スプラインが使用されます。前者 2 つでは、 knot はすべて(しばしば描画される経路外となる)制御 nodeです。キャットムル-ロム スプラインでは、最初と最後の knot が制御nodeで他の knot は通過点になります。

  • 補間ステートメントに clockwisecounterclockwise があれば円形モーションで補間されます。Ren'Py は (pos, align, angle, radius などで設定される) 開始と終了の位置を比較し、極座標の中心 (around) を算出します。そして開始角度から終了角度まで、指定された方向の回転で進む角度を計算します。circles 節を指定すると、Ren'Py は適切な数の円が作られることを保証します。

  • それ以外の場合は、値は開始から終了まで線形補間されます。

また、 Transform 式 ステートメント も補間でき、この場合は 1 つのプロパティーステートメントのみを含む ATL transform である必要があります。その transform のプロパティーは、この補間に直接書き込まれたかのように処理されます。

ワーパーの後にはコロン (:) も続けられます。その場合、インデントされたブロック内に1 行以上の上記の節が続きます。これにより、多くの異なるものの補間を複数の行に分割できます。

pass ステートメント link

atl_pass ::=  "pass"

pass ステートメントは、何も起こさない単純なステートメントです。これは、2 つの choice ステートメント群 (下記参照) が連続して行われる場合など、ステートメントを分離したい場合に使用できます。また、構文ではブロックを作成する必要があるが、空にする必要がある場合 (たとえば、 choice ブロックの 1 つを何もしないようにする場合など) にも役立ちます。

Repeat ステートメント link

repeat ステートメントは、単にそれを含むブロックの実行を再び最初から始めるステートメントです。

atl_repeat ::=  "repeat" (simple_expression)?

式があれば、その評価がブロックの実行回数を指定する整数になります(ですから、repeat 2 で終わるステートメントは最高で 2 回実行され、 repeat 1 はリピートしません)。

repeat ステートメントは、必ずブロックの最後になければなりません。

show logo base:
    xalign 0.0
    linear 1.0 xalign 1.0
    linear 1.0 xalign 0.0
    repeat

Block ステートメント link

block ステートメントは、単に ATL ステートメントのブロックを含むステートメントです。

atl_block_stmt ::=  "block" ":"
                         atl_block

これは繰り返すステートメントをグループ化するのに使えます。

show 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)+

ブロック内の連続する1つ以上 parallel ステートメントは貪欲に平行群にグループ化されます。平行群の全てのブロックは同時に実行されます。parallel ステートメントは、最後のブロックが終了したときに終了します。

群中のブロックは、それぞれ独立したもので、かつ異なる Transform プロパティー を操作するものでなければなりません。2 つのブロックが同じプロパティーを変更するときの結果は未定義です。

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 ステートメントは、ランダムな選択肢群の 1 つを定義するステートメントです。 Ren'Py はその選択肢群から 1 つ選び、対応する ATL ブロックを実行します。その後、最後の選択肢群の後から実行を続けます。

atl_choice ::=  ("choice" (simple_expression)? ":"
                    atl_block)+

ブロック内の連続する choice ステートメントは積極的にグループ化されます。 simple_expression が与えられているなら、それはそのブロックに指定する浮動小数点のウェイトになり、なければ 1.0 になります。

image eileen random:
    choice:
        "eileen happy"
    choice:
        "eileen vhappy"
    choice:
        "eileen concerned"

    pause 1.0
    repeat

pass ステートメントは、いくつかの choice ブロックの群をいくつかの choice ステートメントに分割したり、空の choice ブロックを作成したりする場合に便利です。

Animation ステートメント link

animation ステートメントは ATL ブロックの最初のステートメントでなくてはならず、そのブロックのアニメーション時間軸使用を Ren'Py 通知します。

atl_animation ::=  "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

この例では Eileen は最初の pause 終了時に表示を変えますが、その位置は両方のアニメーションで共有のアニメーション時間軸を持ち、同じ場所にスプライトを配置するため変わりません。アニメーションステートメントがないと、その位置はプレイヤークリック時にリセットされます。

On ステートメント link

on ステートメントは、イベントハンドラを定義します。

atl_on ::=  "on" name ("," name)* ":"
                 atl_block

on ブロックは、貪欲に 1 つのステートメントにグループ化されます。on ステートメントは、1 つのイベント名、またはカンマ区切りのイベント名のリストを処理できます。

このステートメントは、イベントを処理するのに使います。あるイベントが処理されるとき、他のイベントの処理は終了し、新しいイベントの処理が即座に始まります。他のイベントが起こることなくイベントハンドラが終了したとき(すでに 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

Transform 式 ステートメント link

このステートメントは、現在の ATL ブロックの一部として別の ATL transform を含みます。

atl_transform_expression ::=  simple_expression

これは、その ATL transform に子が提供されていない場合 (その方法についてはページの上部を参照) に適用され、それ以外の場合は Displayable ステートメント として解釈されます。指定された ATL transform の内容がこのステートメントの場所に含められます。:

transform move_right:
    linear 1.0 xalign 1.0

image atl example:
    # Display logo_base.png
    "logo_base.png"

    # Run the move_right transform.
    move_right

Displayable ステートメント link

displayable ステートメントは、評価結果が displayable になる単純な Python 式から構成され、任意で 2 つ目の単純式を含む with 節が続きます。

atl_displayable ::=  simple_expression ("with" simple_expression)?

これを使用してステートメントの実行時に transform の子を設定または置換します。

with 節があれば、2つ目の式は transition として評価され、そのトランジションが以前の子と、新しい子の間に使用されます。この状況にすべてのトランジションが対応する訳ではないのに注意してください。特に 辞書トランジションmove-, ease- トランジションがそうです。

image atl example:
    # Displays logo_base.png
    "logo_base.png"

    # Pause for 1.0 seconds.
    1.0

    # Show logo_bw.png, with a dissolve.
    "logo_bw.png" with Dissolve(0.5, alpha=True)

警告

子を持たない transform を渡すことが、 transform を透明にして効果を失わせるので無意味な場合、子を持たない ATL transform を渡すことは Transform 式 ステートメント と解釈され、異なる結果をもたらします。

式が 子を持つ ATL transform と評価された場合、この ATL ブロックの実行は、内部の ATL コードが実行された後にのみ続行されます。

Contains ブロック ステートメント link

contains ブロックは、その インライン版 と同様に、 transform の子を設定しますが、方法は異なります。

atl_counts ::=  "contains" ":"
                   atl_block

1つ以上のcontainsブロックは、単一の contains ステートメント内に貪欲にグループ化され、 Fixed() 内にラップされ、 transform の子として設定されます。

各ブロックは使用する displayable を定義する必要があり、そうしないとエラーが発生します。 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 オブジェクトです。 Transform プロパティー はこのオブジェクトの属性として設定できます。

  • 第二引数は出現時間軸で、関数が実行され始めてからの秒数です。

  • 第三引数はアニメーション時間軸で、同じタグのものがスクリーン上にある秒数です。

  • この関数の結果が数の場合、その秒数が経過するとまた呼び出されます(0 秒なら、関数はできるだけ早く呼び出されます)。 関数が None を返したら、制御は次の ATL ステートメントに渡されます。

この関数は第一引数の Transform オブジェクトの変更の他には副作用を持つべきではなく、予測のためにいつどの数値で呼び出されるか分かりません。

function は transform プロパティーではないので、 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

これには 1 つの式が含まれ、評価結果はこのステートメントが含まれるブロックが実行され始めてからの時間を秒単位で表します。ステートメントで指定された時間に到達すると、次のステートメントが実行開始します。この制御の変異は以前のステートメントがまだ実行中であってもおこり、そのような以前のステートメントは直ちに停止します。

time ステートメントには暗黙に無限時間の pause ステートメントが前置されます。つまり、time ステートメントにたどり着いたときに制御が別のところにあれば、time ステートメントは制御を得るまで待ちます。

一つのブロックに複数の time ステートメントがある場合、それらは厳密に時間の経過順でなくてはなりません。

image backgrounds:
    "bg band"
    xoffset 0
    block:
        linear 1 xoffset 10
        linear 1 xoffset 0
        repeat # control would never exit this block

    time 2.0
    xoffset 0
    "bg whitehouse"

    time 4.0
    "bg washington"

Event ステートメント link

event ステートメントは指定した名前のイベントを引き起こす simple ステートメントです。

atl_event ::=  "event" name

あるブロック内でイベントが引き起こされたとき、指定した名前に対するイベントハンドラがそのブロックに存在しないかチェックされます。存在すれば、制御はイベントハンドラに移ります。存在しなければ、イベントは外側のイベントハンドラに伝播します。

外部イベント link

次のイベントは、ATL transform 内で自動的にトリガーされます。

start

on ステートメントに進入したときに、これより高い優先度のイベントが起こらなかった場合に実行される擬似イベントです。

show

transform が show ステートメントや scene ステートメントによって表示され、与えられたタグの画像がまだ存在しない場合に実行されます。

replace

transform が show ステートメントによって表示されて指定したタグの画像を置き換えると実行されます。

hide

transform が hide ステートメントやそれと等価な Python を使って非表示されると実行されます。

なお、これが実行されないときがあります。 transform が scene ステートメント を通して除去されたときや、ゲームメニューの終了などによって所属する コンテキスト が終了したときです。

replaced

transform が他のに置き換えられるときに引き起こされます。画像は、 ATL ブロックが完了するまで実際には非表示にはなりません。

update

スクリーンが、そのスクリーンの表示でも他のスクリーンの置き換えでもなく更新されると起こります。これはまれですが、ゲームロード時や、スタイルや翻訳変更時などに起こります。

hover, idle, selected_hover, selected_idle, insensitive, selected_insensitive

この transform を含むボタンやこの transform に含まれるボタンが名前通りの状態になったときに引き起こされます。

ATL curry and partial parameter passing link

transform ステートメント を使用して定義された ATL transform は、異なるタイミングでパラメータを設定できます。ATL transform を関数のように呼び出すと、その結果の値は transform のままであり、値を渡されたパラメーターは、その値がパラメーターの新しいデフォルト値であるかのように扱われます。

例:

transform screamer(child, screamee, wait_time=2, flash_time=.1):
    child
    pause wait_time
    screamee
    pause flash_time
    child

# doing this doesn't raise an error (it would if it were a Python function)
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)
    "Here is one way"

    show eileen vhappy at eileen_excited_screamer
    "Here is another"

    show patricia sad at eileen_excited_screamer(screamee="patricia wow")
    "And you can also do this"

shorter_screamer transform は、 screamer transform と同様に、 screamee パラメーターが値を持たないため、 show eileen at screamer のように直接使用できません。

また、ラベルやスクリーンと同様に、 transform ステートメント によって直接作成された transform のパラメーターのデフォルト値は、その transform が 定義された 時点ではなく、 呼び出された 時点で評価されることにも注意してください。

ただし、別の transform (上記の例の shorter_screamer や patricia に適用された transform など) を呼び出した結果の transform では、元の transform のデフォルト値の評価から来たもの (shorter_screamerflash_time パラメーターや patricia の transform の wait_time パラメーターなど) か、その行の前の呼び出しで渡された値から来たもの (shorter_screamerwait_time パラメーターや Patricia の Transform の screamee パラメーターや flash_time パラメーターなど) かに関係なく、そのパラメーターのすべてのデフォルト値は評価済みになります。

特別な子パラメーター link

ATL transform に "child" という名前のパラメーターがあり、そのパラメーターが値を受け取る場合、パラメーターの種類や値を受け取る方法に関係なく (位置引数でもキーワード引数でも、位置指定専用またはキーワード専用でも、デフォルト値があってもなくても)、そのパラメーターの値は transform の子になるように平行して設定されます。

パラメーターのデフォルト値はカウントされず、パラメーターは外部から値を受け取る必要があることに注意してください。

逆に、その ATL transform が transform として使用される場合、 child= キーワード引数が渡されるので、 (キーワードによって渡されるため、位置専用パラメーターは除いた) それを受け取るパラメータがある場合、 transform の実行時に子の設定に加えて子の値を持つことになります。

例えば、これにより、指定された子と別の displayable とを入れ替えられます

transform lucy_jump_scare(child):
    # the child is implicitly set as the child of the transform
    pause 5

    # Jump scare
    "lucy mad"
    pause .2

    # Go back to the original child
    child

contains ブロック 内にもとの child を配置するのにも使用出来ます。

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 トランジション の一部として特別な用途があります。

ワーパー link

ワーパーは、補間ステートメントが経過したとみなす時間を変更する関数です。これらは t から t' への関数として定義されています。ここで t および t' は 0.0 から 1.0 の浮動小数点数です(ステートメントの持続時間が 0 なら、t は実行時に 1.0 になります)。 t' は0.0 から始まり、 1.0 で終るべきですが、それ以上でもそれ以下でも可能です。デフォルトで以下のワーパーが定義されています。

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 Name

easings.net Name

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 からアクセス可能です。 Dissolve() のようなタイムワープ関数を受け取るものに対して有用であり次のように使えます。

with Dissolve(1, time_warp=_warper.easein_quad)

python early ブロック内で renpy.atl_warper デコレーターを使って新しいワーパーが定義できます。これはワーパーを使うファイルの前に読み込まれるファイル内に書きこまれていなければなりません。コードは次のようになります

python early hide:

    @renpy.atl_warper
    def linear(t):
        return t

transofrm の置き換え link

ATL transform、組み込み transform または Transform クラスを使用して定義された transform がこれらのカテゴリの別の transform に置き換えられると、置き換え元 transform のプロパティーは置き換え先 transform に継承されます。この継承は、他の種類の transform には適用されません。

show ステートメントの at リストに複数の transform がある場合、 transform は最後から最初に、1 つのリストがなくなるまで対応します。例えば

show eileen happy at a, b, c
"Dialogue !"
show eileen happy at d, e

c transform は e で、 b transform は d で置き換えられ、 a transform は置き換えられません。

置換ときに両方の transform が適切な種類である場合、古い transform のプロパティーの値が新しい transform にコピーされます。古い transform がアニメーションされていた場合は、現在の中間値が継承されます。例

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 transform の xalign プロパティーを使用して headright transform の xalign プロパティーを初期化するので、画像はプレイヤーが最初にクリックしたときの位置から移動します。

位置プロパティー (xpos, ypos, xanchor, yanchor) と、それらを設定するためのプロパティ (例えば xalignradius/ angle) には、継承のための特別なルールがあります: 子に設定された値は親に設定された値を上書きします。これは、displayable が 1 つの位置しか持たず、意図的に設定された位置が優先されるためです。

最後に show ステートメントが at 節を含まなければ同じ transform が使用されるので継承はありません。 Displayable を一旦非表示して再度表示すればすべての transform プロパティーをリセットします。 Displayable に適用されたアニメーションを(位置はそのままに)停止しするには次を使用します

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 transform に相当するものの 1 つは、Transform クラスです。

class Transform(child=None, function=None, **properties) link

cropping や rotation, scaling, alpha-blending のような処理をその子に適用する transform を作成します。 transform オブジェクトはその子に適用する transform プロパティー に対応するフィールドを持ちます。

child

transform が適用される子

function(trans: Transform, st: float, at: float, /) int | None link

None または transform がレンダリングされるときに呼び出される関数を設定します。関数は3つの引数で呼び出されます。 :

  • transform オブジェクト

  • 秒数での出現時間軸

  • 秒数でのアニメーション時間軸

関数が秒数を返すなら、その秒数後再度呼び出され、 None なら次のインタラクション開始時に再度呼び出されます。

この関数は第一引数の Transform オブジェクトの変更の他には副作用を持つべきではなく、予測のためにいつどの数値で呼び出されるか分かりません。

追加のキーワード引数はその transform プロパティーに設定される値となります。その transform が描画されるたびにそれらの transform プロパティーは設定されるため、 Transform オブジェクトが作成された後はそれらのプロパティーは変更されることはないでしょう。しかし、他の transform プロパティーに対応するフィールドは、 function パラメーターとして渡された関数内や update() メソッドを呼び出す直前に設定して、変更できます。

hide_request link

この属性は関数が呼び出されると True に設定され、その transform が非表示されていることを示します。

hide_response link

hide_request が True なら、これを False に設定して transform が非表示されないようにできます。

set_child(child) link

新しい child でこのメソッドを呼び出すと、この transform の子を変更します。

update() link

function 引数として渡された関数以外から transform プロパティーフィールドが更新されるときには、これを呼び出して変更を確実に反映する必要があります。

Transform としての Callable link

最後に、単純な Python の callable を transform として使用できます。これらの callable は、引数として 1 つの Displayable を取り、新しい Displayable を返す必要があります。例

init python:

    # this transform uses the right and left transforms
    def right_or_left(d):
        if switch:
            return At(d, right)
        else:
            return At(d, left)

つまり、Flatten() のような特定の組み込み関数も transform であり、そのように使用できます。